應朋友要求,幫忙采集某車之家的一些汽車品牌的銷售資料,包含購車時間、車型、經銷商、裸車價等一類資訊,
今天我們就簡單演示一下采集程序,大家可以根據自己的興趣進行拓展,比如采集自己喜歡的品牌汽車資料進行統計分析等等,
進入正文:
1. 目標網頁分析
很多人學習蟒蛇,不知道從何學起, 很多人學習尋找python,掌握了基本語法之后,不知道在哪里案例上手, 很多已經可能知道案例的人,卻不怎么去學習更多高深的知識, 這三類人,我給大家提供一個好的學習平臺,免費獲取視頻教程,電子書,以及課程的源代碼! QQ群:101677771 歡迎加入,一起討論學習
目標網站是某車之家關于品牌汽車車型的口碑模塊相關資料,比如我們演示的案例奧迪Q5L的口碑頁面如下:
https://k.autohome.com.cn/4851/#pvareaid=3311678
為了演示方式,大家可以直接打開上面這個網址,然后拖到全部口碑位置,找到我們本次采集需要的欄位如下圖所示:
采集欄位
我們進行翻頁發現,瀏覽器網址發生了變化,大家可以對下如下幾頁的網址找出規律:
https://k.autohome.com.cn/4851/index_2.html#dataList
https://k.autohome.com.cn/4851/index_3.html#dataList
https://k.autohome.com.cn/4851/index_4.html#dataList
對于上面寫網址,我們發現可變部分是車型(如4851)以及頁碼(如2,3,4),于是我們可以構建url引數如下:
# typeid是車型,page是頁碼
url = f'https://k.autohome.com.cn/{typeid}/index_{page}.html#dataList'
2. 資料請求
通過簡單的測驗,發現似乎不存在反爬,那就簡單了,
我們先引入需要用到的庫:
import requests
import pandas as pd
import html
from lxml import etree
import re
然后創建一個資料請求的函式備用:
# 獲取網頁資料(傳遞引數 車型typeid和頁碼數)
def get_html(typeid,page):
# 組合出請求地址
url = f'https://k.autohome.com.cn/{typeid}/index_{page}.html#dataList'
# 請求資料(因為沒有反爬,這里沒有設定請求頭和其他引數)
r = requests.get(url)
# 請求的網頁資料中有網頁特殊字符,通過以下方法進行決議
r = html.unescape(r.text)
# 回傳網頁資料
return r
請求來的資料就是網頁html文本,我們接下來采用re決議出一共多少頁碼,再用xpath進行采集欄位的決議,
3. 資料決議
由于需要進行翻頁,這里我們可以先通過re正則運算式獲取總頁碼,通過查看網頁資料,我們發現總頁碼可以通過如下方式獲取:
try:
pages = int(re.findall(r'共(\d+)頁',r)[0])
# 如果請求不到頁數,則表示該車型下沒有口碑資料
except :
print(f'{name} 沒有資料!')
continue
總頁碼采集
關于待采集欄位資訊,我們發現都在節點div[@]里,可以先定位這個節點資料,然后再進行逐一決議,
待采集欄位資訊所在節點
此外,我們發現每一頁最多15個車型口碑資料,因此我們每頁可以定位15個待采集資訊資料集,遍歷采集代碼:
divs = r_html.xpath('.//div[@]')
# 遍歷每個全部的車輛銷售資訊
for div in divs:
# 找到車輛銷售資訊所在的地方
mt = div.xpath('./div[@]')[0]
# 找到所需欄位
infos = mt.xpath('./dl[@]')
# 設定空的字典,用于存盤單個車輛資訊
item = {}
# 遍歷車輛資訊欄位
for info in infos:
key = info.xpath('.//dt/text()')[0]
# 當欄位為購買車型時,進行拆分為車型和配置
if key == '購買車型':
item[key] = info.xpath('.//dd/a/text()')[0]
item['購買配置'] = info.xpath('.//span[@]/text()')[0]
# 當欄位為購車經銷商時,需要獲取經銷商的id引數,再呼叫api獲取其真實經銷商資訊(這里有坑)
elif key == '購車經銷商':
# 經銷商id引數
經銷商id = info.xpath('.//dd/a/@data-val')[0] +','+ info.xpath('.//dd/a/@data-evalid')[0]
# 組合經銷商資訊請求地址
jxs_url = base_jxs_url+經銷商id+'|'
# 請求資料(為json格式)
data = https://www.cnblogs.com/sn5200/p/requests.get(jxs_url)
j = data.json()
# 獲取經銷商名稱
item[key] = j['result']['List'][0]['CompanySimple']
else:
# 其他欄位時,替換轉義字符和空格等為空
item[key] = info.xpath('.//dd/text()')[0].replace("\r\n","").replace(' ','').replace('\xa0','')
4. 資料存盤
由于沒啥反爬,這里直接將采集到的資料轉化為pandas.DataFrame型別,然后存盤為xlsx檔案即可,
df = pd.DataFrame(items)
df = df[['購買車型', '購買配置', '購買地點', '購車經銷商', '購買時間', '裸車購買價']]
# 資料存盤在本地
df.to_excel(r'車輛銷售資訊.xlsx',index=None,sheet_name='data')
5. 采集結果預覽
整個爬蟲程序比較簡單,采集下來的資料也比較規范,以本文案例奧迪Q5L示例如下:
采集結果預覽
以上就是本次全部內容,比較簡單,感興趣的同學可以基于此采集一些感興趣的資料試著做做統計分析、可視化展示之類的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412875.html
標籤:Python
