B站地址:https://www.bilibili.com/video/av70702610
侵权请联系删除
这一块的难点在于数据的异步加载,以汽车之家的官网为例:
通过查看源代码会发现,汽车品牌后面的车型数目,例如阿斯顿的82是获取不到的,因为这一部分数据是异步加载的,所以采用传统的requests+beautifulsoup的静态解析技术路线已经不能解决问题。随之,有两种解决方案:
1、模拟浏览器。
2、HTTP请求分析,利用分析出来的路径进行异步数据加载。
相比较于第二种方案,模拟浏览器是比较容易上手的方法,具体可以采用request_html或者selenium的技术路线。两种方法都是可行的,本次实验采用selenium的技术路线,来模拟Chrome浏览器行为抓取数据。Selenium支持通过Xpath、CSS样式来进行标签数据的选择。
一、数据分析
首先对要爬取的数据做一个归纳,下层的数据通过上层传递的url来爬取,框起来的数据是导入数据时,构建关系的条件(相等)。
品牌Bank: 例如 阿斯顿·马丁
车系Series: 例如 阿斯顿·马丁DB11
车型Entity: 例如 阿斯顿·马丁DB11 2019款 AMR
配置Configuration: 例如 能耗、功率等信息
数据链分析
二、代码分析
2.1品牌信息获取
爬虫代码很简单,首先通过selenium的css选择器,给出品牌信息的css路径,然后逐步解析出品牌、车型总数、车系链接地址即可,代码和结果如下图。
2.2 车系数据获取
利用上面爬取的数据,把每个品牌对应的url抛给浏览器,通过下图的css路径可以爬取相应的车系数据、每个车系对应的车型数目和车型列表url。
2.3 车型信息获取
2.4 配置信息
拿到车系(type)表中的数字,附到https://car.autohome.com.cn/config/series/后面加.html。这一块的爬取是最困难的,这个困难不是技术上,而是细节处理:
1、数据量大
2、数据结构复杂
3、反扒机制,需要人工干涉(主要是修正参数名称)
4、普通汽车和新能源汽车scheme不一样(增加电动机参数)
另外要注意释放缓存:driver.delete_all_cookies()
def Entity_Config():
current_dir = os.path.abspath('.')
print(current_dir)
file_series = os.path.join(current_dir, "data\\type.csv"