12行Python爬虫抓取豆瓣短评数据实战

12行Python爬虫抓取豆瓣短评数据实战 1. 项目背景与核心思路这个12行Python爬虫的核心目标是通过最精简的代码实现豆瓣《黑豹》短评数据的抓取。作为漫威宇宙的重要作品《黑豹》在豆瓣上积累了数万条短评这些用户生成内容(UGC)对于影视分析、舆情监测具有重要价值。传统爬虫教程往往需要几十行代码而这个极简实现展示了Python生态的高效性。注意任何爬虫开发都应遵守robots.txt协议豆瓣的爬虫限制较为严格建议控制请求频率在每分钟不超过15次避免触发429 Too Many Requests错误。1.1 技术选型解析选择requests库而非Scrapy等框架的原因在于轻量级无需复杂配置适合快速验证和小规模抓取学习曲线平缓对于新手更友好API设计直观调试方便可以直接打印响应内容检查问题搭配BeautifulSoup进行HTML解析而非正则表达式因为豆瓣短评区域有明确的class属性如short结构化解析更稳定网页微调时代码适应性更强可读性更好便于后续维护2. 完整代码实现与逐行解析import requests from bs4 import BeautifulSoup url https://movie.douban.com/subject/6390825/comments?sortnew_score headers {User-Agent: Mozilla/5.0} res requests.get(url, headersheaders) soup BeautifulSoup(res.text, html.parser) comments [div.text.strip() for div in soup.select(.short)] users [span.a.text for span in soup.select(.comment-info)] ratings [span[title] for span in soup.select(.rating)] for user, rating, comment in zip(users, ratings, comments): print(f{user} | {rating} | {comment[:50]}...)2.1 关键代码解析请求头设置User-Agent伪装成浏览器访问这是绕过基础反爬的必要措施实测不加header时豆瓣会返回403 Forbidden错误CSS选择器技巧.short精准定位短评正文区域.comment-info a获取用户名.rating提取评分对应的title属性如力荐、推荐列表推导式 三行代码分别完成三种数据的提取比传统for循环更简洁输出控制使用字符串切片限制评论显示长度f-string格式化输出保持数据对齐3. 反爬应对策略3.1 常见反爬现象处理429 Too Many Requests解决方案在循环中添加time.sleep(random.uniform(1, 3))建议配合代理IP轮换需自行准备代理池验证码触发征兆返回内容包含security_check字样应对立即停止爬取至少30分钟数据不全豆瓣默认只加载前20条短评翻页需要处理start参数?start20limit203.2 伦理爬虫实践建议严格遵守robots.txt中规定的爬取间隔避免在高峰时段运行爬虫如晚间8-10点数据仅用于个人学习禁止商业化使用建议添加缓存机制避免重复请求4. 功能扩展方向4.1 数据持久化存储import csv with open(comments.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([用户, 评分, 短评]) for item in zip(users, ratings, comments): writer.writerow(item)4.2 情感分析集成from snownlp import SnowNLP sentiments [SnowNLP(c).sentiments for c in comments] print(f平均情感值{sum(sentiments)/len(sentiments):.2f})4.3 自动化监控版本import schedule import time def job(): # 爬取逻辑 print(f{time.ctime()} 完成一次抓取) schedule.every(6).hours.do(job) while True: schedule.run_pending() time.sleep(60)5. 常见问题排查指南问题现象可能原因解决方案返回空列表网页结构变更使用浏览器开发者工具重新定位元素SSL证书错误系统证书问题添加verifyFalse参数仅测试环境乱码输出编码不一致检查res.encoding并强制设为utf-8连接超时网络限制设置超时参数timeout10部分数据缺失动态加载改用Selenium或分析XHR请求我在实际使用中发现豆瓣的短评区域class名称相对稳定但用户头像等元素经常变化。建议重点关注包含评论文本的div容器这类结构通常保持较好的前后兼容性。对于需要长期运行的爬虫最好每天用测试用例验证核心选择器是否仍然有效。当处理大量请求时可以考虑使用requests.Session()保持连接相比每次都新建连接能提升约30%的速度。但要注意同一个session持续太久也可能被识别为异常行为建议每100次请求后重建session。