Python爬虫实战:抓取懂车帝奥迪A4L车主口碑数据
博客标签#Python爬虫 #PyQuery #requests #懂车帝数据 #汽车数据分析阅读时长10分钟适用爬虫入门、数据采集、汽车行业数据分析一、前言汽车行业数据分析、购车参考、竞品调研时真实车主口碑数据是核心数据源懂车帝车型口碑页汇聚大量车主提车价格、用车油耗、分项评分外观/内饰/空间等真实信息。本文使用 requests 做网页请求、 PyQuery(JQuery风格CSS选择器) 做HTML解析实现单页车主口碑结构化抓取代码开箱即用新手友好文末附带优化方案分页爬取、Excel存储、反爬增强。爬虫合规提醒本文仅用于技术学习抓取频率放缓、禁止商用大批量爬取遵守网站robots协议与法律法规。二、环境准备1. 依赖库安装pip install requests pyquery- requests 模拟浏览器发送HTTP请求获取网页源码- pyquery 仿jQuery语法HTML解析库相比BeautifulSoup选择器书写更简洁前端开发者上手极快2. 目标页面分析目标链接格式 https://www.dongchedi.com/auto/series/score/车型ID1. 数据全部静态渲染在HTML中无需Selenium/JS逆向直接抓源码即可解析2. 每条车主评价包裹在 article 标签3. 购车信息提车时间、裸车价、油耗在 section[style*background:#F7F8FC] 下4. 五项分项评分综合/外观/内饰/配置/空间/油耗评分在 tw-flex tw-justify-around 布局div中5. 空数据过滤无提车时间无综合评分直接丢弃无效数据。三、完整爬虫源码# 导入依赖 import requests from pyquery import PyQuery def get_page_source(url): 函数功能请求目标链接获取网页HTML源码 :param url: 目标车型口碑地址 :return: 页面html字符串 # 请求头伪装浏览器解决403反爬拦截requests默认UA会被网站识别爬虫 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders) resp.encoding resp.apparent_encoding # 自动适配页面编码避免中文乱码 return resp.text def parse_page_source(html): 函数功能解析HTML结构化提取车主口碑数据 :param html: 网页源码 :return: 结构化列表[{字典字段},...] result_list [] doc PyQuery(html) # 实例化PyQuery对象加载html # 匹配所有车主评价卡片article标签 items doc(article).items() for item in items: data_map {} # 筛选购车基础信息行背景色#F7F8FC的flex布局div rows item(section[style*background:#F7F8FC] div.tw-flex-1).items() for row in rows: # p标签0值p标签1字段名提车时间/购买地点等 value row(p:eq(0)).text().strip() label row(p:eq(1)).text().strip() if label: data_map[label] value # 字典取值无数据默认空字符串 提车时间 data_map.get(提车时间, ) 购买地点 data_map.get(购买地点, ) 裸车价格 data_map.get(裸车价格, ) 油耗 data_map.get(油耗, ) # 提取分项评分综合/外观/内饰/配置/空间/油耗评分 score_divs item(div.tw-flex.tw-justify-around div.tw-col-span-3).items() score_texts [] for sd in score_divs: s sd(p.styles_score-item__2KcxU).text().strip() score_texts.append(s) # 不足6个评分项补空防止下标越界报错 score_texts [] * 6 # 组装最终结构化数据 data { 提车时间: 提车时间, 购买地点: 购买地点, 裸车价格: 裸车价格, 油耗: 油耗, 综合: score_texts[0], 外观: score_texts[1], 内饰: score_texts[2], 配置: score_texts[3], 空间: score_texts[4], 油耗评分: score_texts[5] } # 过滤无效空数据提车时间/综合评分任一不为空才保留 if data[提车时间] or data[综合]: result_list.append(data) return result_list def main(): 主执行函数修改url中的车型ID即可切换不同车型 url https://www.dongchedi.com/auto/series/score/96-x-x-x-x-x html get_page_source(url) all_data parse_page_source(html) # 循环打印抓取结果 for item in all_data: print(item) if __name__ __main__: main()四、代码逻辑拆解1. 请求模块get_page_source爬虫被拦截90%原因是未配置User-Agentrequests默认UA为 python-requests/xxx 服务器直接识别爬虫返回403因此必须伪装Chrome浏览器UAresp.apparent_encoding 自动识别页面编码解决中文乱码痛点。2. 解析模块parse_page_source1. doc(选择器).items() PyQuery遍历多个同标签元素必备写法返回迭代对象2. 属性选择器 [style*xxx] 模糊匹配style包含指定字符串的标签精准定位购车信息区块3. p:eq(0) 伪类选择器取当前父标签下第N个p标签分离字段值、字段名4. score_texts [] *6 容错处理部分车主缺失分项评分列表长度不足导致索引报错5. 空数据过滤剔除无任何有效信息的空白卡片提升数据质量。3. 运行效果控制台输出结构化字典{提车时间: 2025-10, 购买地点: 南京, 裸车价格: 20.70万, 油耗: 8.00L, 综合: 3.6, 外观: 4, 内饰: 3.5, 配置: 3.5, 空间: 3.5, 油耗评分: 3.5} {提车时间: 2025-05, 购买地点: 广州, 裸车价格: 19.10万, 油耗: 8.60L, 综合: 4.7, 外观: 5, 内饰: 4.5, 配置: 5, 空间: 4.5, 油耗评分: 4.5} {提车时间: 2025-06, 购买地点: 苏州, 裸车价格: 22.20万, 油耗: 10.50L, 综合: 3.9, 外观: 4.5, 内饰: 4, 配置: 4, 空间: 3.5, 油耗评分: 3.5} {提车时间: 2025-04, 购买地点: 潍坊, 裸车价格: 22.98万, 油耗: 8.60L, 综合: 3.9, 外观: 5, 内饰: 3.5, 配置: 3.5, 空间: 3.5, 油耗评分: 4} {提车时间: 2024-09, 购买地点: 长沙, 裸车价格: 21.30万, 油耗: 8.60L, 综合: 4.17, 外观: 5, 内饰: 3.5, 配置: 3.5, 空间: 4, 油耗评分: 5} {提车时间: 2025-08, 购买地点: 佛山, 裸车价格: 22.60万, 油耗: 9.00L, 综合: 4.3, 外观: 5, 内饰: 5, 配置: 5, 空间: 3, 油耗评分: 3.5} {提车时间: 2021-03, 购买地点: 无锡, 裸车价格: 29.60万, 油耗: 8.50L, 综合: 2.93, 外观: 3.5, 内饰: 0.5, 配置: 2.5, 空间: 3.5, 油耗评分: 2.5} {提车时间: 2022-06, 购买地点: 昆明, 裸车价格: 26.30万, 油耗: 7.40L, 综合: 4.1, 外观: 4.5, 内饰: 4, 配置: 3, 空间: 5, 油耗评分: 4} {提车时间: 2022-05, 购买地点: 滨州, 裸车价格: 27.50万, 油耗: 10.00L, 综合: 4, 外观: 3.5, 内饰: 3.5, 配置: 4, 空间: 4, 油耗评分: 5} {提车时间: 2022-06, 购买地点: 杭州, 裸车价格: 32.00万, 油耗: 8.50L, 综合: 4.1, 外观: 4.5, 内饰: 4, 配置: 4, 空间: 4, 油耗评分: 4} {提车时间: 2022-03, 购买地点: 青岛, 裸车价格: 27.00万, 油耗: 10.50L, 综合: 4.3, 外观: 4.5, 内饰: 4, 配置: 4, 空间: 4, 油耗评分: 5} {提车时间: 2021-06, 购买地点: 天津, 裸车价格: 28.00万, 油耗: 10.00L, 综合: 3.86, 外观: 4.5, 内饰: 4, 配置: 3.5, 空间: 3.5, 油耗评分: 4} {提车时间: 2020-12, 购买地点: 无锡, 裸车价格: 29.50万, 油耗: 7.80L, 综合: 4.72, 外观: 5, 内饰: 4.5, 配置: 5, 空间: 5, 油耗评分: 4.5} {提车时间: 2022-04, 购买地点: 合肥, 裸车价格: 28.45万, 油耗: 10.00L, 综合: 4.3, 外观: 5, 内饰: 3.5, 配置: 3.5, 空间: 5, 油耗评分: 4.5}五、项目进阶优化优化1分页批量爬取多页口碑懂车帝口碑分页规则URL末尾拼接页码例 xxx-x-x-x-x-2 为第二页循环遍历页码import time def get_all_page_data(start1, end5): total [] for page in range(start, end1): url fhttps://www.dongchedi.com/auto/series/score/96-x-x-x-x-x-{page} html get_page_source(url) page_data parse_page_source(html) total.extend(page_data) print(f已爬取第{page}页获取{len(page_data)}条数据) time.sleep(2) # 停顿2秒防高频访问封禁IP return total优化2数据保存至Excelpip install openpyxlfrom openpyxl import Workbook def save_to_excel(data_list, save_name懂车帝车主口碑.xlsx): wb Workbook() ws wb.active # 表头 header [提车时间,购买地点,裸车价格,油耗,综合,外观,内饰,配置,空间,油耗评分] ws.append(header) for row in data_list: ws.append(list(row.values())) wb.save(save_name) # 使用 # all get_all_page_data(1,3) # save_to_excel(all)优化3反爬增强from fake_useragent import UserAgent ua UserAgent() headers { User-Agent: ua.random, Referer: https://www.dongchedi.com/, Accept-Language: zh-CN,zh;q0.9, Accept: text/html,*/* }六、常见踩坑解决方案1. 中文乱码添加 resp.encoding resp.apparent_encoding 不要固定utf-8/gbk2. 选择器取不到数据页面前端样式/类名更新F12重新核对class、style属性修正CSS选择器3. 403访问被拒增加请求间隔 sleep(1~3) 、更换UA、补充Referer请求头4. 列表索引越界沿用 score_texts []*6 补全空值逻辑。七、应用场景1. 个人购车批量统计目标车型各地裸车成交价、真实油耗避开4S报价坑2. 行业分析统计车型各维度评分横向对比竞品优缺点3. 数据分析课程爬虫数据可视化PandasMatplotlib做车主口碑评分分布图。八、结语requestsPyQuery 是静态网页爬虫最简组合相比lxml、BeautifulSoupCSS选择器贴合前端开发思维降低爬虫入门门槛。本案例覆盖请求伪装、CSS解析、数据清洗、无效值过滤四大爬虫核心知识点稍加改造即可适配汽车之家、易车等同类汽车网站。需要源码文件可以在评论区留言后续更新MySQL入库、数据可视化版本。