闲来无事突然想爬一下汽车之家上面的数据,看来看去觉得上面最有价值的就是上面的价格数据,汽车之家上面有指导价和不同地方的经销商和二手商家的价格数据,该爬虫实现了汽车之家上的所有车型的价格数据的爬取。
目录
一,分析网站上的数据并确定自己的爬取目标
网站地址:汽车之家
通过分析我们确定要爬取的数据如下所示:
其中要分析好其中的逻辑结构,把要爬取的数据进行分层:
在写之前还要按照网页上的数据进行层数划分:
然后就通过网页上的标签对各个型号的价格数据进行抓取就行了。
二,通过抓取json包来获取经销商报价和二手车商家报价
这里要注意经销商报价是动态更新的,如果单纯的抓取页面的话是抓不到的,所以要打开network分析经销商报价的json包
分析可得有一个叫做LoadDealerPrice的json包里面有我们想要的数据
分许它的url
发现可以通过改变seriesid,也就是车型的id来得到我们想要的数据,后面的city是城市的id,根据自己的爬取需求可以改变它
这时我们打开该api包,发现里面的数据不是单纯的json格式的数据,而是加了一些前后缀
这时候不便于我们直接获取该包里面的数据,我们用写一个处理函数简单处理一下
def deliver_current_change(content):
con = re.sub(r"LoadDealerPrice", "", str(content))#去掉前缀
con2 = con[1:-1]#去掉后缀
last = json.loads(con2)#把文本转化成json格式
deliver_key = {}
for i in last['body']['item']:
deliver_key[i["SpecId"]] = i["Price"]
return deliver_key
即将销售的车型里面也是经销商报价,和在售的数据一样
然而停售的车型不是经销商报价了,变成了二手商报价json包是LoadUsedCarPrice开头的那个,url类似,只是数据类型有些变化
这时候在爬取停售界面的主函数中加上几句处理的代码:
con = re.sub(r"LoadUsedCarPriceGetUsedCarData", "", str(deliver))
con2 = re.sub("," + i, "", str(con[-10:-1]))#去掉后缀的数字
con3 = con[1:-10] + con2
last = json.loads(con3)
deliver_key = {}
for ki in last['body']['items']:
deliver_key[ki["specId"]] = ki["priceArea"]
三,屏蔽的页面记录和再次爬取
爬了几次发现了这个网站的几个规律,发现他会非常严格的限制一个ip爬取的数量和速度(可能是因为我懒得注册这个网站搞一套登录的post请求),然后呢,有时候第一次访问时会被403,同样的请求再请求一次就行了,所以代码里面加了一个屏蔽之后再爬一次的功能,但是即使是这样,跑完一遍仍然会有几个url被403。这时候把这几个被屏蔽的url再爬一次就ok了(真蠢啊啊啊啊)
代码效率实在是太低了,爬几个不同界面的函数全封装到一个文件里面了。。。。不忍心发出来,有兴趣的去GitHub看吧