【Python爬蟲實戰】實戰汽車之家(上)

前言:

​ 上篇已經從百度風雲榜中爬取了中國前50的科技APP,明哥是一個汽車愛好者,那根據自已的喜好,我們就從汽車先進行入手爬取好了。

​ 其實涉及到汽車可以分析的數據還是比較多的,我計劃用三個視頻左右做汽車之家的爬蟲,不光是爬蟲,我們可能還會使用一些數據分析,來實現可分析的數據展示。

本次目標:

​ 這一次我們要採集的是汽車之家 ,這次我想做的實戰內容為:

基礎數據:爬取國內外各汽車車型,並生成Excel列表

二級數據:

獲取所有汽車車型的報價,包含指導價,最低起售價,給出汽車打折力度。給出目前折扣力度最大的5款車型

獲取所有汽車車型的口碑,及口碑評價的參與人數。

畫出餅圖,分析各價位車型的佔比,看看國內汽車市場劃分。

爬蟲技術選型:

數據採集:request,pyquery

數據的存放:Excel

數據分析:pandas

數據顯示:PIL

流程:

引入三方模塊

<code>

import

requests from pyquery

import

PyQuery as pq from urllib.parse

import

*

import

json/<code>

通過頁面的索引進行分頁查詢,得到所有汽車的品牌,並保存為Excel

<code>

for

letter in range(

65

,

91

): url =

"https://www.autohome.com.cn/grade/carhtml/%s.html"

%chr(letter)/<code>

這裡我們使用了chr函數,轉成A-Z,進行頁面進查詢

通過篩選器,進行汽車品牌列表的篩選

<code>car_class_name=it_car.

find

(

"dt>div>a"

).text() car_list = it.

find

(

"li"

)/<code>

查詢得到所有汽車的列表信息,並獲取所有的口碑值。

<code>try:
                kbRequest = requests.get(temp[

'口碑'

],headers=headers) kb=p

q(kbRequest.text)

.find(

".number-fen"

) temp[

'口碑分數'

]=p

q(kb[0])

.text() temp[

'口碑人數'

]=re.search(r

"(\d+)"

, p

q(kbRequest.text)

.find(

".number-ren"

).text()).group() except: temp[

'口碑分數'

]=

0

temp[

'口碑人數'

]=

0

/<code>

最後整理數據,保存為Excel

<code>carsData=pd.DataFrame(cars)

carsData.to_csv(

"cars_base.csv"

) carsData.to_excel(

"excel.xlsx"

, sheet_name=

'Sheet1'

)/<code>
【Python爬蟲實戰】實戰汽車之家(上)

重新讀取已保存的Excel,通過報價頁面進行二次讀取每個汽車型號信息

<code>

carsData

.read_csv

(

"./cars_base.csv"

)/<code>

通過已經存儲的報價的Url進行報價和車型獲取

<code>pResult = requests.get(b_price.iloc[p_car][

0

],headers=headers) print(b_price.iloc[p_car][

0

]) a=re.search(

r"(\d+)"

,b_price.iloc[p_car][

0

]) /<code>

通過頁面中暴露的接口獲取在售汽車的報價信息,並轉碼保存

<code>detailPrice = 

"https://carif.api.autohome.com.cn/dealer/LoadDealerPrice.ashx?type=1&seriesid=%s&city=420100"

%a[

0

] price_detail = requests.get(detailPrice,headers=headers) price_list=json.loads(price_detail.text)/<code>

進行數據彙總,保存為excel,方便以後使用

<code>try:
            content = pResult.content.strip().decode(

'gb2312'

,

'replace'

) li_list = pq(content).

find

(

"#divSeries li"

)

for

li

in

li_list.items(): car[li.clone().attr(

"data-value"

)]={

"車型ID"

:li.clone().attr(

"data-value"

),

"指導價"

:float(li.clone().

find

(

".interval01-list-guidance"

).text().replace(

"萬"

,

""

))*

10000

,

"型號"

:b_price.iloc[p_car][

2

],

"車型產品"

:li.clone().

find

(

".interval01-list-cars-infor p a"

).text(),

"品牌"

:b_price.iloc[p_car][

1

],

"最低價"

:

""

,

"報價城市"

:

""

,

"城市ID"

:

""

}

for

item

in

price_list[

'body'

][

'item'

]:

if

str(item[

'SpecId'

])

in

car.keys(): car[str(item[

'SpecId'

])].update({

"車型ID"

:item[

'SpecId'

],

"品牌ID"

:item[

'SeriesId'

],

"最低價"

:item[

'MinPrice'

],

"報價城市"

:item[

'CityName'

],

"城市ID"

:item[

'CityId'

],

"DealerId"

:item[

'DealerId'

]}) try: car[str(item[

'SpecId'

])][

'折扣'

]=

'{:.2%}'

.

format

(item[

'MinPrice'

]/item[

"Price"

]) except: car[str(item[

'SpecId'

])][

'折扣'

]=

''

# {

"車型ID"

:item[

'SpecId'

],

"品牌ID"

:item[

'SeriesId'

],

"最低價"

:item[

'MinPrice'

],

"報價城市"

:item[

'CityName'

],

"城市ID"

:item[

'CityId'

],

"DealerId"

:item[

'DealerId'

]} except:

print

(

"異常%s"

%b_price.iloc[p_car])/<code>
【Python爬蟲實戰】實戰汽車之家(上)

總結:

  1. 要爬取一個網站你要先明確自己到底要拿到哪些數據,以什麼樣的方式進行存放
  2. 合理分離數據,劃分數據存放方式,得出自己想要的數據。
  3. 儘量多調試,多抓包,保證爬取時不要中間中斷
  4. 處理頁面數據時,多觀察頁面數據的來源,有很多數據接口其實都暴露在外。
  5. 做基礎數據處理時,有些未知數據,在條件允許情況儘量保存,以免復採

後記:

在汽車之家的採集過程中,碰到了很多未考慮到的情況,因為DOM結構問題,也採了比較多的坑,浪費的時間也比較久,本文中未進行數據呈現。

本篇最終獲取車型數據3140條,報價數據只取3000條,下一篇我將利用這些數據做出報表呈現

如果有需要本篇代碼,可以關注明哥,並私信“car”進行獲取, 視頻將明天放出。


作者相關:

明哥較擅長PHP開發架構,Python開發。從業金融電商等領域多年經驗。更新時間不定,以技術為主,不定期分享技術和人生,如果有興趣可以關注。

最後:如果你正在學習Python的路上,或者準備打算學習Python、明哥會陪著你陪你一起共同進步!

手打不易,有用的話,請記得關注轉發。


分享到:


相關文章: