资讯动态

大众点评评论爬虫:Requests与BeautifulSoup移动端方案

发布时间:2026/10/3 7:26:21 来源:尧图企业网站定制
搞了几年爬虫平时最常被问到的就是“怎么爬大众点评的评论”。这站点的反爬严格程度在业内是出了名的但它的评论数据又特别有分析价值无论是做餐饮选址调研、竞品监控还是简单的数据练手都绕不开这里。网上能找到的教程多半是残缺片段要么缺请求头要么解析逻辑早就失效。所以我把一套能直接跑通的基础抓取方案整理出来代码拿过去改改选择器就能用重点是把每一步为什么这么做讲清楚免得你抄完代码遇到问题不知道怎么改。这套方案的核心思路是通过模拟移动端页面请求绕过PC端复杂的验证逻辑再用Python解析评论区数据最后落成CSV文件。它不依赖Selenium这类重型自动化工具requests加BeautifulSoup两个库就能完成对新手非常友好同时也给后续扩大抓取规模留了足够空间。无论你是刚学爬虫的学生还是需要做数据采集的产品、运营同学这套逻辑都能直接用。1. 整体思路与方案选型为什么用移动端而不是Web端1.1 大众点评反爬机制的基本特征大众点评的防护体系分好几个层次最基础的是对请求头、Cookie的校验进阶的有字体反爬、CSS映射、参数加密以及频率维度的账号风控。直接拿PC端的网页地址去请求通常连数据都拿不到就被拦了服务器返回的要么是空页面要么是一个加密参数相关的错误。即便你从浏览器复制了完整的CookiePC端的评论数据也是通过异步接口动态加载的接口参数里混杂着签名逻辑必须用专门的工具才能定位真实请求。移动端相较之下温和很多这里的“温和”不是指没有防护而是请求链路更短、签名逻辑相对简单数据直接以内嵌的JSON或HTML结构返回。大部分评论信息其实不需要逆向签名算法只要请求头伪装得像一部正常的手机就能稳定取到数据。这也是整套方案能“copy就run”的核心前提。1.2 为什么选择requests而不是Selenium或Playwright很多新手一上来就选Selenium理由是“可视化看到什么爬什么”。这个思路没有错但用在点评这种重量级站点上非常吃亏。Selenium需要拉起完整浏览器不仅内存开销大而且启动特征明显更容易触发反爬策略。再加上翻页、滚动、等待渲染这些动作都需要额外写逻辑代码量并不比纯接口请求少速度和稳定性却差很多。用requests直接请求HTML页面本质是模拟手机App或者移动端页面的网络行为只要请求头构造到位能在毫秒级拿到完整数据。解析侧用BeautifulSoup按class或者标签属性提取内容逻辑直观且容错性高。这套方案唯一的短板是当页面结构变动时需要同步调整选择器但相比逆向签名参数维护成本低得多。1.3 这套代码的完整工作流程整个抓取过程可以拆成四个环节构造请求、获取响应、解析提取、清洗落盘。构造请求这一步包括设置UA、Cookie、Referer等请求头获取响应时判断状态码和返回内容类型防止被反爬重定向到验证页面解析环节用BeautifulSoup定位评论区容器逐个提取用户名、评分、评论文本、发布时间最后在内存中整理成结构化字典写入CSV文件。这样的分层设计不是炫技而是为了便于单独调试。遇到“能请求但解析不到数据”的情况你可以只替换解析模块遇到“直接被重定向”的情况则只需要检查请求头。把问题隔离出来是实战中排查效率最高的做法。2. 开发环境准备与前置操作2.1 安装Python与依赖库本机需要Python 3.8以上版本推荐3.10或3.11避免一些旧版本在字符串处理上的小问题。安装完Python之后在终端执行下面两条命令就能装齐所有依赖pip install requests beautifulsoup4 lxmlrequests库负责发送HTTP请求beautifulsoup4负责解析HTMLlxml是解析器性能和容错比Python自带的html.parser更好。如果没有安装lxmlBeautifulSoup也可以运行但遇到复杂嵌套结构时效率会明显下降。Windows用户如果遇到pip指令找不到多半是没有把Python的Scripts目录加入环境变量重新运行安装包勾选“Add Python to PATH”可以彻底解决。macOS用户如果提示外部管理环境建议用python3 -m pip install方式安装。2.2 获取有效Cookie是前期最重要的步骤大众点评的评论区需要登录后才能完整加载。实际操作中你得先用手机号登录大众点评的网页版或者App再在浏览器开发者工具中复制自己的Cookie。这个Cookie包含了你的登录凭证和用户身份信息服务器靠它来判定你有没有权限读取评论数据。不带Cookie直接请求十有八九会返回“请先登录”或者直接跳转到首页。打开目标店铺的评论区页面后按F12进入开发者工具在Network面板刷新页面找到名为review或者包含shop的请求在Headers区域找到Cookie:开头的值整段复制下来备用。这里要注意Cookie是有时效性的通常几小时到几天不等如果代码运行中突然失效需要回到浏览器重新复制。提示Cookie属于个人敏感信息只应在自己的本地脚本中使用不要分享给他人更不要提交到公开代码仓库。2.3 从哪个入口获取原始HTML店铺评论区的数据地址可以通过浏览器直接访问移动端的地址格式大概是https://m.dianping.com/shop/商家ID/review_all这类结构。商家ID就是店铺详情页URL里数字部分。如果直接访问PC端地址大概率触发验证所以这里统一用无线端的页面地址作为抓取源。打开移动端页面后右键查看网页源代码搜一下“comment”或者“review”如果能找到评论文本说明这是一个服务端渲染页面非常适合用当前方案抓取。如果你看到的是一堆空标签和JS变量那说明数据是异步加载的这时就要检查Cookie是不是过期了或者地址是否被重定向到了登录页。3. 核心代码逐段拆解3.1 构造请求头让服务器以为你是手机请求头里面最重要的三个字段是User-Agent、Referer和Cookie。User-Agent决定了服务器认为你是什么设备这里模拟一部常规的Android手机Referer告诉服务器你从哪个页面跳转过来能够增加请求的合理性Cookie承担登录态认证。除此之外还可以加上Accept-Language来声明语言偏好加上Accept来控制返回内容的类型。下面这一段是请求头的标准写法headers { User-Agent: Mozilla/5.0 (Linux; Android 13; Xiaomi 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36, Referer: https://m.dianping.com/shop/xxx/review_all, Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9, Cookie: 你复制的完整Cookie内容 }这里建议把Cookie单独定义成一个变量方便失效时快速替换。User-Agent的选择也有技巧不要用太新或太老的版本选市面上主流机型常见的UA数据特征更自然。3.2 发送请求与状态码判断请求发出之后第一步不是急着解析数据而是判断服务器到底给了我们什么。常规状态码200表示正常返回但在这类站点里200也不一定代表拿到了真正的数据有可能返回的是一个带验证逻辑的空白壳页面。因此还需要检查返回内容长度和关键词。import requests session requests.Session() session.headers.update(headers) url https://m.dianping.com/shop/商家ID/review_all resp session.get(url, timeout10) if resp.status_code 200 and comment in resp.text: print(页面获取成功) elif resp.status_code 200 and len(resp.text) 500: print(疑似被拦截返回页面过短) else: print(状态码异常, resp.status_code)使用requests.Session而不是直接requests.get是为了复用底层的TCP连接连续请求时效率更高。同时Session能够自动维持某些Cookie状态避免因为连接断开导致部分请求失败。3.3 用BeautifulSoup解析评论数据拿到HTML之后接下来的工作就是精准定位。打开移动端评论区页面用开发者工具的Elements面板查看评论区域的class名称找到包含用户名、评分、时间、评论内容这些字段的父容器。这个class名不是固定的不同商家的页面可能不同所以解析前要先手动确认一次。from bs4 import BeautifulSoup soup BeautifulSoup(resp.text, lxml) review_list soup.select(div.review-list div.review-item) for item in review_list: nickname item.select_one(a.name) rating item.select_one(span.star-score) comment_time item.select_one(span.time) content item.select_one(p.review-content) data_item { 用户名: nickname.get_text(stripTrue) if nickname else , 评分: rating.get(class) if rating else , 时间: comment_time.get_text(stripTrue) if comment_time else , 评论内容: content.get_text(stripTrue) if content else , }这里有两个细节值得注意。第一select_one返回的是Tag对象或None直接调用get_text会报错所以每次都要先判断是否存在这是新手最容易踩的坑。第二评分在移动端常以class属性的形式存在例如star-score-50表示五星所以用get(class)取的是整个class列表你可以从中提取数值再换算成对应的分数值。3.4 翻页逻辑与请求频率控制评论区通常不止一页移动端翻页常见的方式是URL中的页码参数。循环抓取每页时要做一个最基本的自我保护每次请求之间随机停顿。这个停顿不是简单的sleep(1)而是用一个随机范围避免请求间隔过于规律。import random import time all_reviews [] for page in range(1, 5): page_url fhttps://m.dianping.com/shop/商家ID/review_all?pageno{page} resp session.get(page_url, timeout10) if resp.status_code 200: soup BeautifulSoup(resp.text, lxml) items soup.select(div.review-list div.review-item) if not items: print(f第{page}页没有数据停止翻页) break for item in items: all_reviews.append(extract_review(item)) time.sleep(random.uniform(2, 4))每次翻页循环新增了一个判断如果当前页没有解析到任何评论立即退出循环。这个机制很实用因为很多商家评论总数只有一两页如果傻乎乎继续翻只会请求到空页面。最后的随机延时控制在2到4秒既不会太慢影响效率也不会因为请求太密被限制。3.5 数据清洗与CSV导出原始HTML里提取出来的文本经常夹杂着空格、换行和\u3000这样的全角空格直接写入CSV会让数据很难看所以要做一次统一的清洗。写CSV时还有一个容易被忽略的编码问题Windows下用Excel直接打开CSV必须用utf-8-sig编码保存否则中文会变成乱码。import csv def clean_text(text): return text.replace(\u3000, ).replace(\n, ).strip() with open(dianping_comments.csv, w, newline, encodingutf-8-sig) as f: fieldnames [用户名, 评分, 时间, 评论内容] writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(all_reviews)utf-8-sig和utf-8的区别在于文件头是否写入BOM标记有BOM的CSV文件才能被Excel正确识别中文编码。对于后续要写代码做数据分析的情况读取时同样要对应指定encodingutf-8-sig。4. 常见问题与排查技巧4.1 请求失败或被重定向到登录页这个问题的触发频率最高原因有两个。一是Cookie失效检测方法很简单在浏览器里打开一次移动端页面看看评论是否正常显示。如果页面显示需要登录说明Cookie已经失效重新复制即可。二是请求头不完整特别容易漏掉Referer字段。大众点评会校验请求的来源页面如果你直接以空白Referer请求数据很容易被归类为异常流量。解决方法是给headers补全Referer和Accept字段并确保Cookie是最新的。同时建议给session.get加上allow_redirectsFalse参数去检查响应状态如果拿到302就很明确是被重定向了不需要再继续解析。4.2 解析不到数据明明页面能打开出现这个情况最大的嫌疑是页面结构变了。大众点评的前端代码会不定时调整class名同一套选择器跑半个月就可能失效。排查思路很直接把拿到的HTML保存到本地文件用浏览器打开手工搜索评论关键词确认当前页面使用的class名是什么再相应更新select方法里的选择器。为防止同类问题反复出现解析阶段尽量使用稳定性更高的属性作为锚点。比如评论内容有时在p标签中有时在div标签中但外层容器的>

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑