前言:
上篇已經從百度風雲榜中爬取了中國前50的科技APP,明哥是一個汽車愛好者,那根據自已的喜好,我們就從汽車先進行入手爬取好了。
其實涉及到汽車可以分析的數據還是比較多的,我計劃用三個視頻左右做汽車之家的爬蟲,不光是爬蟲,我們可能還會使用一些數據分析,來實現可分析的數據展示。
本次目標:
這一次我們要採集的是汽車之家 ,這次我想做的實戰內容為:
基礎數據:爬取國內外各汽車車型,並生成Excel列表
二級數據:
獲取所有汽車車型的報價,包含指導價,最低起售價,給出汽車打折力度。給出目前折扣力度最大的5款車型
獲取所有汽車車型的口碑,及口碑評價的參與人數。
畫出餅圖,分析各價位車型的佔比,看看國內汽車市場劃分。
爬蟲技術選型:
數據採集:request,pyquery
數據的存放:Excel
數據分析:pandas
數據顯示:PIL
流程:
引入三方模塊
<code>import
requests from pyqueryimport
PyQuery as pq from urllib.parseimport
*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=pq(kbRequest.text)
.find(".number-fen"
) temp['口碑分數'
]=pq(kb[0])
.text() temp['口碑人數'
]=re.search(r"(\d+)"
, pq(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>
重新讀取已保存的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
liin
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
itemin
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:"異常%s"
%b_price.iloc[p_car])/<code>
總結:
- 要爬取一個網站你要先明確自己到底要拿到哪些數據,以什麼樣的方式進行存放
- 合理分離數據,劃分數據存放方式,得出自己想要的數據。
- 儘量多調試,多抓包,保證爬取時不要中間中斷
- 處理頁面數據時,多觀察頁面數據的來源,有很多數據接口其實都暴露在外。
- 做基礎數據處理時,有些未知數據,在條件允許情況儘量保存,以免復採
後記:
在汽車之家的採集過程中,碰到了很多未考慮到的情況,因為DOM結構問題,也採了比較多的坑,浪費的時間也比較久,本文中未進行數據呈現。
本篇最終獲取車型數據3140條,報價數據只取3000條,下一篇我將利用這些數據做出報表呈現
如果有需要本篇代碼,可以關注明哥,並私信“car”進行獲取, 視頻將明天放出。
作者相關:
明哥較擅長PHP開發架構,Python開發。從業金融電商等領域多年經驗。更新時間不定,以技術為主,不定期分享技術和人生,如果有興趣可以關注。
最後:如果你正在學習Python的路上,或者準備打算學習Python、明哥會陪著你陪你一起共同進步!
手打不易,有用的話,請記得關注轉發。