文章目录
前言一、数据来源二、步骤1.引入库2.解析网页3.简单处理4.简单清洗5.自定义函数汇总以上步骤 总结前言
如今新能源汽车风靡全球,在汽车行业掀起一场巨大的变革,其中,比亚迪和特斯拉已经成为行业的风向标。对此,我们将利用网络爬虫,基于requests和etree采集这两大巨头的销量数据。
一、数据来源
本文数据均源之于车主之家,涵盖大量汽车行业销量数据。
比亚迪:/b/57328/
特斯拉:/b/126359/
二、步骤
1.引入库
代码如下(示例):
import requestsimport pandas as pd# from lxml import etreefrom lxml import htmletree = html.etree
2.解析网页
以比亚迪为例,如图:
首先利用etree将网页解析为HTML格式,之后利用xpath解析获取每一个tr标签,即为对应的每一行数据,示例代码如下:
rsp = requests.get(url=url,headers=headers)tree = etree.HTML(rsp.text)tr_tags = tree.xpath('/html/body/div[5]/div[3]/div[2]/div/div[2]/div[1]/table/tr')
3.简单处理
这里如果将每个tr标签都拿下来,会包含最后面那个“详细销量”,且蓝色部分都还包含一个超链接,如下图。
直接解析td或者th标签的文本是找不到对应数据的,所以需要筛掉,只要前4列数据,且不要超链接。通过循环简单处理,代码如下:
for t in tr_tags:t1 = t.xpath('./th/text()')t2 = t.xpath('./td/text()')t3 = t.xpath('./td/a/text()')if len(t3) == 2:t2.append(t3[0])else:passdata_list.append(t1)data_list.append(t2)
4.简单清洗
将得到的数据通过清洗生成DataFrame格式,示例代码如下:
list_save = [d for d in data_list if d != []]df = pd.DataFrame(list_save[1:],columns = list_save[0])df = df.iloc[0:18].iloc[::-1]df.index = df['时间'].tolist()df.drop('时间',axis=1,inplace=True)df[['销量(辆)','在售品牌排名']] = df[['销量(辆)','在售品牌排名']].apply(pd.to_numeric)
5.自定义函数汇总以上步骤
代码如下:
def sale_worm(url):headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'}rsp = requests.get(url=url,headers=headers)tree = etree.HTML(rsp.text)tr_tags = tree.xpath('/html/body/div[5]/div[3]/div[2]/div/div[2]/div[1]/table/tr')data_list = []for t in tr_tags:t1 = t.xpath('./th/text()')t2 = t.xpath('./td/text()')t3 = t.xpath('./td/a/text()')if len(t3) == 2:t2.append(t3[0])else:passdata_list.append(t1)data_list.append(t2)list_save = [d for d in data_list if d != []]df = pd.DataFrame(list_save[1:],columns = list_save[0])df = df.iloc[0:18].iloc[::-1]df.index = df['时间'].tolist()df.drop('时间',axis=1,inplace=True)df[['销量(辆)','在售品牌排名']] = df[['销量(辆)','在售品牌排名']].apply(pd.to_numeric)return df
总结
这里的爬虫只是爬取第一页数据,没做翻页处理,在后续的易车网爬虫中会涉及到。最后通过调用函数可以实现数据采集。
sale_TSLA = sale_worm(url_TSLA)# sale_TSLA.to_excel('.\特斯拉.xlsx')print(sale_TSLA.head())sale_BYD = sale_worm(url_BYD)# sale_BYD.to_excel('.\比亚迪.xlsx')print(sale_BYD.head())
结果如下:
销量(辆) 在售品牌份额 在售品牌排名-10 54391 2.77%14-11 52859 2.44%14-12 70847 2.98%11-01 59845 2.8%14-02 56515 3.89% 7销量(辆) 在售品牌份额 在售品牌排名-10 88898 4.53% 5-11 97242 4.5% 6-12 97990 4.12% 6-01 93363 4.36% 7-02 88093 6.07% 4
注意:如果切换车主之家其他页面进行销量爬取时,数据结构不同在处理时也要做出改变。