Python爬虫之自动爬取某车之家各车销售数据


Posted in Python onJune 02, 2021

一、目标网页分析

目标网站是某车之家关于品牌汽车车型的口碑模块相关数据,比如我们演示的案例奥迪Q5L的口碑页面如下:

https://k.autohome.com.cn/4851/#pvareaid=3311678

为了演示方式,大家可以直接打开上面这个网址,然后拖到全部口碑位置,找到我们本次采集需要的字段如下图所示:

Python爬虫之自动爬取某车之家各车销售数据

采集字段

我们进行翻页发现,浏览器网址发生了变化,大家可以对下如下几页的网址找出规律:

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'

二、数据请求

通过简单的测试,发现似乎不存在反爬,那就简单了。

我们先引入需要用到的库:

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进行采集字段的解析。

三、数据解析

由于需要进行翻页,这里我们可以先通过re正则表达式获取总页码。通过查看网页数据,我们发现总页码可以通过如下方式获取:

try:
    pages = int(re.findall(r'共(\d+)页',r)[0])
# 如果请求不到页数,则表示该车型下没有口碑数据
except :
    print(f'{name} 没有数据!')
    continue

Python爬虫之自动爬取某车之家各车销售数据

总页码采集

关于待采集字段信息,我们发现都在节点div[@class="mouthcon-cont-left"]里,可以先定位这个节点数据,然后再进行逐一解析。

Python爬虫之自动爬取某车之家各车销售数据

待采集字段信息所在节点

此外,我们发现每一页最多15个车型口碑数据,因此我们每页可以定位15个待采集信息数据集,遍历采集代码:

divs = r_html.xpath('.//div[@class="mouthcon-cont-left"]')
# 遍历每个全部的车辆销售信息
for div in divs:
    # 找到车辆销售信息所在的地方
    mt = div.xpath('./div[@class="choose-con mt-10"]')[0]
    # 找到所需字段
    infos = mt.xpath('./dl[@class="choose-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[@class="font-arial"]/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 = 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','')

四、数据存储

由于没啥反爬,这里直接将采集到的数据转化为pandas.DataFrame类型,然后存储为xlsx文件即可。

df = pd.DataFrame(items)
df = df[['购买车型', '购买配置', '购买地点', '购车经销商', '购买时间', '裸车购买价']]
# 数据存储在本地
df.to_excel(r'车辆销售信息.xlsx',index=None,sheet_name='data')

五、采集结果预览

整个爬虫过程比较简单,采集下来的数据也比较规范,以本文案例奥迪Q5L示例如下:

Python爬虫之自动爬取某车之家各车销售数据

到此这篇关于Python爬虫之自动采集某车之家各车销售数据的文章就介绍到这了,更多相关Python采集汽车销售数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现百度关键词排名查询
Mar 30 Python
python简单程序读取串口信息的方法
Mar 13 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
Python3 queue队列模块详细介绍
Jan 05 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 Python
python三子棋游戏
May 04 Python
从np.random.normal()到正态分布的拟合操作
golang特有程序结构入门教程
Jun 02 #Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 #Python
python之np.argmax()及对axis=0或者1的理解
Python import模块的缓存问题解决方案
Jun 02 #Python
Python3 类型标注支持操作
Jun 02 #Python
python 实现两个变量值进行交换的n种操作
You might like
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python同步两个文件夹下的内容
2019/08/29 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
服装厂厂长岗位职责
2013/12/27 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
自荐信大全
2019/03/21 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python