1. 项目背景与目标解析
最近在重温漫威电影《黑豹》,想看看观众对这部开创性超级英雄电影的真实评价。豆瓣作为国内最权威的影视评分平台,短评区往往藏着最真实的观众声音。但手动翻页查看效率太低,于是决定用Python写个迷你爬虫快速抓取这些数据。
这个12行代码的迷你爬虫核心价值在于:
- 极简实现:仅用requests+正则表达式两个基础库
- 快速验证:无需复杂环境配置,适合临时数据采集需求
- 教学示范:展示最基础的网页抓取逻辑
注意:实际生产环境建议遵守robots.txt规则并控制请求频率,避免对目标服务器造成压力。本文示例仅用于技术学习。
2. 技术选型与工具准备
2.1 为什么选择requests+正则组合
传统爬虫教程多推荐BeautifulSoup或lxml解析HTML,但对于简单的短评抓取,正则表达式反而更轻量:
import re
pattern = re.compile(r'<span class="short">(.*?)</span>')
相比DOM解析器,正则的优势在于:
- 零额外依赖:Python内置re模块
- 执行效率高:直接文本匹配比构建DOM树更快
- 代码简洁:单行模式匹配替代多行节点遍历
2.2 环境配置要点
确保你的Python环境已安装requests库:
pip install requests
实测环境兼容性:
- Python 3.6+均可运行
- Windows/macOS/Linux全平台支持
- 无需虚拟环境(但建议用venv隔离)
3. 核心代码逐行解析
完整代码如下(含详细注释):
import requests, re
url = 'https://movie.douban.com/subject/6390825/comments?limit=20'
headers = {'User-Agent': 'Mozilla/5.0'} # ① 伪装浏览器请求
resp = requests.get(url, headers=headers) # ② 发送HTTP请求
html = resp.text # ③ 获取网页源码
comments = re.findall(r'<span class="short">(.*?)</span>', html) # ④ 正则提取
for i, comment in enumerate(comments[:10]): # ⑤ 打印前10条
print(f"{i+1}. {comment.strip()}") # ⑥ 格式化输出
关键点解析:
请求头设置
:豆瓣会拦截无User-Agent的请求,模拟浏览器访问是必须的
URL构造
:通过修改
limit=20
参数可调整每页获取数量(最大100)
异常处理
:生产环境应添加try-catch处理网络异常,示例省略了这部分
正则优化
:
.*?
非贪婪匹配确保准确获取标签间内容
4. 实战中的问题与解决方案
4.1 反爬机制应对策略
测试时可能遇到以下情况:
requests.exceptions.HTTPError: 429 Too Many Requests
解决方案:
import time, random
time.sleep(random.uniform(1, 3)) # 随机等待1-3秒
proxies = {'http': 'http://proxy_ip:port'}
requests.get(url, proxies=proxies)
4.2 数据清洗技巧
原始数据可能包含:
- HTML实体编码(如 &)
- 多余空白字符
- 表情符号/特殊字符
清洗函数示例:
import html
def clean_text(text):
text = html.unescape(text) # 转换HTML实体
text = ' '.join(text.split()) # 合并连续空白
return text.strip()
5. 数据存储与扩展应用
5.1 基础存储方案
将结果保存到CSV:
import csv
with open('comments.csv', 'w', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['序号', '短评'])
for i, comment in enumerate(comments):
writer.writerow([i+1, comment])
5.2 情感分析扩展
结合SnowNLP进行简单情感分析:
from snownlp import SnowNLP
sentiments = [SnowNLP(c).sentiments for c in comments]
avg_score = sum(sentiments)/len(sentiments)
print(f"平均情感得分:{avg_score:.2f}") # 1为积极,0为消极
6. 法律与伦理边界
6.1 robots.txt检查
访问 https://www.douban.com/robots.txt 可见关键限制:
User-agent: *
Disallow: /subject_search
Disallow: /amazon_search
Disallow: /search
合规要点:
- 避免频繁请求(建议≥5秒/次)
- 不爬取用户隐私数据
- 商业用途需获得授权
6.2 数据使用建议
合法使用场景包括:
- 个人影评分析
- 学术研究
- 非商业的统计可视化
我在实际使用中发现,通过控制请求频率(如每10分钟抓取一次),既能满足数据分析需求,又不会对服务器造成负担。对于需要大规模数据的情况,建议联系豆瓣官方获取API权限。


