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内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
python列表使用实现名字管理系统
Jan 30 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
django框架F&Q 聚合与分组操作示例
Dec 12 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
Python中无限循环需要什么条件
May 27 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
Flask中jinja2的继承实现方法及实例
Mar 03 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
python进阶教程之循环对象
2014/08/30 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
python实现dijkstra最短路由算法
2019/01/17 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
大学生职业生涯规划书模板
2014/01/03 职场文书
个人简历中自我评价
2014/02/11 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
银行业务授权委托书
2014/10/10 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
军训新闻稿范文
2015/07/17 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL