ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大众点评爬虫数据规约详解:Sniper 项目搜索与评论字段的完整对齐方案

大众点评爬虫数据规约详解:Sniper 项目搜索与评论字段的完整对齐方案 网页爬虫【免费下载链接】dianping_spider大众点评爬虫全站可爬解决动态字体加密非OCR。持续更新项目地址https://gitcode.com/gh_mirrors/di/dianping_spider点击查看免费下载大众点评反爬机制复杂同一店铺信息可能来自网页解析、加密接口、cookie 池与 ip 代理等多种爬取通道不同通道能见到的字段并不一致。本文基于 dianping_spider 仓库的 docs/data.md 文档完整梳理该项目在搜索search与评论review两条链路上的数据规约字段对齐规则并结合 function/search.py、function/review.py 等源码验证每个字段的真实解析来源帮助你理解抓取结果的字段含义、值域形态以及哪些字段只有接口才有、哪些只有网页才有为后续数据清洗与入库提供可直接对照的参考。为什么需要数据规约多爬取方式下的字段对齐问题大众点评对搜索页、详情页和评论页都施加了严格的动态字体加密与反爬限制本项目通过 utils/get_font_map.py 获取字体映射并替换加密字符串非 OCR 方式破解。为了对抗封禁项目同时支持网页 HTML 解析携带 cookie 的登录态请求加密匿名接口通过uuid、tcv参数访问未登录态字段存在隐藏详见 docs/json.mdcookie 池与 ip 代理等防 ban 手段。由于采用了多种爬取方式有些数据对于其它爬取方式并不可见因此项目在输出层采用最大集原则做数据规约凡是任何一种爬取方式能拿到的字段都统一放进最终字典中拿不到的字段以-占位。同时因为数据对齐的原因有一些字段名字可能会轻微变化使用方在对接下游任务时应以本规约为准。字段标记体系-、*、#的含义数据规约文档中每个字段后都带有一个标记符号这是理解整套数据的关键标记含义说明-所有爬取方式均可见网页解析与加密接口都返回该字段*接口特有只有加密接口匿名接口能拿到#网页特有只有网页解析能拿到该标记直接对应 docs/json.md 中加密接口 网页解析融合的设计接口在未登录状态下会隐藏部分字段如商家电话末两位而网页在登录态下字段更全但反过来接口能拿到一些网页拿不到的数据如浏览量。两者取并集就构成了下面的最大集规约。search搜索页数据规约搜索页爬取结果的整体结构与字段含义如下数据结构定义于 function/search.py 的one_step_search_res字典{ 店铺id: -, # 所有方式都有 店铺名: -, # 所有方式都有 评论总数: -, # 所有方式都有 人均价格: -, # 所有方式都有 标签1: -, # 所有方式都有 标签2: -, # 所有方式都有 店铺地址: -, # 所有方式都有 详情链接: -, # 所有方式都有 图片链接: -, # 所有方式都有 店铺均分: -, # 所有方式都有 推荐菜: *, # 接口特有 店铺总分: -, # 所有方式都有 店铺电话: -, # 所有方式都有 其他信息: #, # 网页特有 优惠券信息: *, # 接口特有 }search 各字段的源码解析依据在 function/search.py 中搜索列表通过BeautifulSoup解析.shop-list下的每一个li每个字段都有独立的 try/except 兜底逻辑——解析失败统一回退为-这正是规约中占位符的来源店铺id取.txt .tit a的data-shopid属性店铺名取.txt .tit a的文本并strip()评论总数取.comment .review-num文本去掉换行人均价格取.comment .mean-price b文本解析失败时默认0标签1/标签2取.tag-addr .tag列表的前两项文本中的换行替换为空格店铺地址取.tag-addr .addr文本详情链接取.txt .tit a的href图片链接取.pic a img的src店铺均分取.comment-list的文本页面上的详细评分如口味 环境 服务分项推荐菜取.recommend文本即页面上的推荐菜区域店铺总分两种解析方式——优先解析.star_icon span的class如star_icon star_48取48除以 10 得 4.8失败则解析.star_score的文本。从源码结构看推荐菜*在网页解析失败时会被置为-而接口通道可以稳定返回优惠券信息*同理仅出现在接口数据中。其他信息#则来自详情页网页解析见下文 detail 部分在纯接口通道下不可见。搜索结果的典型展示下面两张图展示了搜索页规约字段在真实页面上的形态店铺列表项与店铺详情信息review评论页数据规约评论页爬取结果采用摘要 精选评论列表的两层结构整体规约如下数据结构定义于 function/review.py 的return_data与each_review字典{ 店铺id: -, # 所有方式都有 评论摘要: -, # 所有方式都有 评论总数: -, # 所有方式都有 好评个数: -, # 所有方式都有 中评个数: -, # 所有方式都有 差评个数: -, # 所有方式都有 带图评论个数: -, # 所有方式都有 精选评论: [ { 店铺id: -, # 所有方式都有 评论id: -, # 所有方式都有 用户id: -, # 所有方式都有 用户名: -, # 所有方式都有 用户打分: -, # 所有方式都有 # 注意接口为单评分网页为多评分 评论内容: -, # 所有方式都有 点赞个数: *, # 接口特有 回复个数: *, # 接口特有 浏览次数: *, # 接口特有 人均价格: -, # 所有方式都有 喜欢的菜: -, # 所有方式都有 发布时间: -, # 所有方式都有 商家回复: -, # 所有方式都有 评论图片: -, # 所有方式都有 } ], }review 各字段的源码解析依据在 function/review.py 中评论页请求会携带uuid/tcv走加密接口同时以网页解析结果兜底字段同样全部带 try/except 回退-的容错摘要层第一页一次性解析评论摘要解析.content span得到类似{描述: 口味, 个数: 8.7}的列表好评个数/中评个数/差评个数分别取.filter-good、.filter-middle、.filter-bad下的.count文本去掉首尾括号带图评论个数取.filter-pic .count评论总数由好评 中评 差评个数相加计算得出计算失败回退-。精选评论层逐条解析.main-review评论id取.actions a的data-id用户id取.name链接href的末尾路径段用户名取.name文本用户打分解析.score文本网页端可得到口味X 环境X 服务X的多维评分字典review_score_detail而接口端只有单一评分——这是规约中注明接口为单评分网页为多评分的原因同时会解析.sml-rank-stars的 class 得到用户总分评论内容取.review-words文本并清理收起评价、换行等杂质人均价格从.score文本中匹配人均X元并剥离元字喜欢的菜取.review-recommend文本去掉前 5 个字符后按空格拆分如招牌寿喜锅 极上M8霜降黑毛和牛 无菌蛋发布时间取.time文本商家回复取.shop-reply-content文本无回复时为评论图片收集.review-pictures a的href并拼接为http://www.dianping.com 路径的完整链接列表。点赞个数、回复个数、浏览次数均为*在网页端.main-review解析中没有对应选择器从源码结构看它们主要来自加密接口的返回数据因此规约中标记为接口特有如需这三个字段应确保走接口通道配置uuid与tcv。评论数据的典型展示下面这张图展示了单条精选评论在网页上的完整形态与each_review字典中的字段一一对应用户名、打分、人均价格、评论内容、喜欢的菜、发布时间、评论图片、商家回复等三种数据形态与存储规约如何落地数据规约最终通过 utils/saver/mongo_saver.py 写入 MongoDB三类数据对应三个集合数据形态触发链路MongoDB 集合写入前处理search搜索页爬取controller.main()完整流程第一步info按店铺id先删后插保证覆盖更新detail详情页爬取可选链路info_detail按店铺id先删后插review评论页爬取可选链路review按店铺id先删后插写入逻辑均为col.delete_many({店铺id: ...})后col.insert(data)即同一店铺的每次爬取结果会整体覆盖因此规约中的-占位符会在覆盖更新中体现为本次通道不可见的字段被清空为-——如果你后续用关系型数据库或 CSV 落地需要按 docs/save.md 中的说明自行拆分表结构该仓库目前仅维护 MongoDB 写入。使用规约时的注意点字段名可能轻微变化由于数据对齐个别字段名在不同版本或不同通道下可能微调请以 docs/data.md 当前版本为准下游解析不要硬编码假定字段永远不变。-是合法值而非脏数据规约中所有字段在该通道拿不到时都会置为-清洗时应将其与真实缺失、真实为 0如0、0区分开。*字段依赖接口通道推荐菜、优惠券信息、点赞个数、回复个数、浏览次数只有配置了加密接口uuid、tcv获取方法见 docs/json.md才会返回未配置时这些字段在输出中会是-。#字段依赖网页通道其他信息等网页特有字段只有走网页解析登录态携带 cookie才可见接口通道下不可见。评论详情是谨慎选择项需要登录态才能获取更多评论超过默认 10 条精选频繁请求会造成封号过段时间自动解开相关开关在 require.ini 的shop_review段need/more_detail/need_pages以及 spider_config.py 中有对应加载逻辑。总结数据规约是 Sniper 项目网页解析 加密接口双通道融合设计的输出层契约以-/*/#三个标记明确每个字段的可见性边界以最大集原则保证下游无论走哪条链路都能拿到统一结构的字典。配合 function/search.py 与 function/review.py 的容错解析失败统一回退-以及 utils/saver/mongo_saver.py 的按店铺覆盖写入你可以在拿到数据的第一时间就明确这个字段从哪来、值是什么形态、能不能信从而把精力集中在业务分析而非字段排查上。赞分享网页爬虫【免费下载链接】dianping_spider大众点评爬虫全站可爬解决动态字体加密非OCR。持续更新项目地址https://gitcode.com/gh_mirrors/di/dianping_spider点击查看免费下载相关推荐CANN ops-nn稀疏转稠密算子SparseToDense 产品支持情况 | 产品 | 是否支持 | | : | : : | | term Ascend 950PR/Ascend 950DT人工智能算子库深度学习CANNAscend大众点评爬虫项目使用问题分析与解决方案大众点评爬虫项目使用问题分析与解决方案 项目背景 大众点评爬虫项目是一个用于采集大众点评网站数据的开源工具。该项目通过模拟浏览器行为能够获取店铺信息、用户评论网页爬虫上一篇终极FastAPI部署自动化指南GitHub Actions与CI/CD全流程实战下一篇【技术专题】LangChain4j实战指南Java智能应用开发全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进