1. 项目背景与目标最近在重温漫威电影《黑豹》想看看观众对这部作品的真实评价。豆瓣作为国内最具影响力的影评平台自然成为首选。但手动翻页查看短评效率太低于是决定用Python写个简单的爬虫来批量获取短评数据。这个项目核心目标是用最精简的代码控制在12行以内实现豆瓣《黑豹》短评的抓取。虽然市面上已有成熟的爬虫框架但通过这个微型项目可以快速掌握requests库的基本用法理解网页抓取的底层逻辑。提示实际开发中建议遵守robots.txt协议控制请求频率。本文示例仅用于技术学习请勿对目标网站造成访问压力。2. 环境准备与工具选型2.1 基础环境配置首先确保已安装Python 3.6环境。推荐使用virtualenv创建独立环境python -m venv douban_env source douban_env/bin/activate # Linux/Mac douban_env\Scripts\activate # Windows2.2 核心库选择选择requestsBeautifulSoup组合原因requests比urllib更简洁的HTTP库适合快速开发BeautifulSoupHTML解析神器支持多种解析方式轻量级组合完美符合12行代码的约束条件安装依赖pip install requests beautifulsoup43. 爬虫实现详解3.1 页面结构分析打开豆瓣《黑豹》短评页面需登录按F12进入开发者工具短评内容位于div classcomment-item标签内用户评分藏在span classrating title力荐的title属性翻页参数通过start控制每页20条3.2 核心代码实现import requests from bs4 import BeautifulSoup headers {User-Agent: Mozilla/5.0} url https://movie.douban.com/subject/6390825/comments?start{} for i in range(0, 100, 20): html requests.get(url.format(i), headersheaders).text soup BeautifulSoup(html, html.parser) for item in soup.select(.comment-item): user item.select_one(.comment-info a).text rating item.select_one(.rating)[title] comment item.select_one(.short).text.strip() print(f{user} | {rating} | {comment})代码解析headers模拟浏览器访问避免被识别为爬虫url.format(i)实现自动翻页i从0开始步长20select_one()精准定位元素比find更简洁使用CSS选择器语法可读性优于XPath4. 关键问题与优化方案4.1 反爬机制应对豆瓣常见的反爬措施及解决方案问题现象可能原因解决方案429错误请求频率过高添加time.sleep(random.uniform(1,3))403禁止访问缺少cookies在headers中添加登录后的cookie返回验证码IP被限制使用代理IP池轮换4.2 数据存储优化基础版直接将结果打印到控制台实际应用中建议import csv with open(comments.csv, w, encodingutf-8) as f: writer csv.writer(f) writer.writerow([用户, 评分, 内容]) # 在循环内改为 writer.writerow([user, rating, comment])5. 法律与伦理注意事项遵守robots.txt豆瓣的robots.txt明确禁止爬取/comments路径控制请求频率建议间隔2秒以上单日不超过1000次请求数据使用限制禁止商业用途仅用于个人分析研究敏感信息处理对用户名等个人信息做脱敏处理重要实际项目中建议使用豆瓣官方API需申请权限本文代码仅供学习HTTP请求和HTML解析原理。6. 扩展应用场景掌握基础爬虫技能后可以进一步开发情感分析使用SnowNLP分析短评情感倾向词云生成用jiebawordcloud可视化高频词汇时间序列分析结合评分数据观察口碑变化例如生成词云的代码片段from wordcloud import WordCloud import jieba text .join([c[comment] for c in comments]) wc WordCloud(font_pathmsyh.ttc).generate( .join(jieba.cut(text))) wc.to_file(wordcloud.png)7. 常见问题排查Q1返回空列表但浏览器能看见数据A可能是动态加载需要检查是否有XHR请求考虑使用selenium模拟浏览器Q2遇到SSL证书错误A添加verifyFalse参数仅限测试环境requests.get(url, verifyFalse)Q3中文显示乱码A确保统一使用UTF-8编码response.encoding utf-88. 项目总结与反思这个微型爬虫虽然只有12行核心代码但涵盖了Web爬取的完整流程请求→解析→提取→存储。在实际操作中发现几个关键点伪装策略豆瓣会检测Headers完整性必须包含Referer、Accept等字段元素定位当class名包含空格时需要用.代替空格soup.select(.comment-info.a) # 错误 soup.select(.comment-info.a) # 正确异常处理网络请求必须添加try-catchtry: html requests.get(url, timeout10).text except Exception as e: print(f请求失败: {str(e)})最后强调技术是把双刃剑请在法律框架内合理使用爬虫技术。对于需要大规模采集的场景建议联系平台获取正规API接口。