一个基于 requests 和 BeautifulSoup 构建的轻量级、带容错架构的网页结构化解析脚本。用于精准采集豆瓣电影特定条目下的用户短评数据。
- 防反爬雪崩机制:内置 DOM 节点断言。当遭遇豆瓣动态 WAF 风控(如哈希碰撞拦截)或 Cookie 鉴权失效时,脚本不会直接崩溃,而是自动保存案发现场为
debug_page.html供开发者审查。 - 并发速率节流:硬编码 3 秒的强休眠请求间隔,严格控制并发频率,最大程度降低 IP 被风控封禁的概率。
- 数据结构化输出:自动解析非结构化 HTML,清洗脏数据(如空白字符、换行符),并持久化输出为带 BOM 的 UTF-8 编码 CSV 文件。
- Python 3.7+
- 依赖库:
requests,beautifulsoup4,lxml
安装依赖: pip install requests beautifulsoup4 lxml
-
在浏览器(建议开启无痕模式)登录你的豆瓣账号。
-
按
F12开启开发者工具,切换至 Network (网络) 面板。 -
访问任意一部电影的短评页面(如:https://movie.douban.com/subject/26857715/comments)。
-
在网络请求列表中找到该页面的主文档请求,在右侧的 Request Headers (请求头) 中复制完整的
Cookie字符串(包含dbcl2等关键字段)。 -
打开本脚本
main.py,将抓取到的字符串填入全局常量HEADERS中的cookie字段:HEADERS = { # ... 其他头信息保持不变 'cookie': '在此处填入你抓取到的完整且新鲜的 Cookie 字符串' }
-
(可选)修改全局常量
URL,替换为你需要抓取的电影短评首页链接。
执行脚本: python main.py
脚本运行结束后,根据网络状态与风控情况,将产生以下两种维度的结果:
当网络请求状态码为 200 且未被 WAF 拦截时,程序会在项目根目录生成 comments_douban.csv 文件。文件包含以下 4 个字段的数据矩阵:
- ID: 评论者的豆瓣用户昵称(字符串)。
- Time: 评论发布的时间戳,精确到日(格式示例:2023-10-01)。
- star: 用户的量化评分(整数 1 至 5 分别对应 很差、较差、还行、推荐、力荐。若用户仅短评未打星,则显示为 ?)。
- comments: 评论正文(已去除多余换行符的纯文本)。
当程序判定目标 DOM 节点 (id='comments') 缺失时,说明请求已被豆瓣风控路由劫持。此时将在根目录生成 debug_page.html。
- 分析方法:直接在浏览器中双击打开该文件,若显示“载入中...”且源码包含 process、sha512 等字样,说明触发了浏览器工作量证明 (PoW) 校验;若显示登录框,则说明你的 Cookie 已过期。
最大抓取深度受限:受豆瓣官方的数据展示策略限制,目前已登录用户最多只能连续翻页查看最近的 20 页(约 400 条)短评。当脚本抓取达到此上限时,豆瓣页面将不再提供下一页的 URL,脚本会自动判定为抓取完成并安全退出。此为平台服务端的物理限制,并非代码存在 Bug。
- 风险提示:本脚本未配置代理 IP 池。使用私人豆瓣账号及家庭宽带高频抓取,极易触发豆瓣系统级反爬策略,可能导致账号被暂时冻结或公网 IP 被封禁(403 状态)。使用者须自行承担一切账号与网络状态异常风险。
- 合规边界:本项目开源代码仅供 Python 网络请求封装、DOM 解析逻辑以及动态风控对抗思路的学术与技术探讨。
- 禁止滥用:严禁将本脚本用于任何突破目标网站 robots.txt 协议的高并发恶意采集、数据倒卖或其它非法商业牟利行为。