欢迎光临
我们一直在努力

Python迷你爬虫实战:12行代码抓取豆瓣短评

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秒

  • 使用代理IP池(进阶方案):
  • 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权限。

    赞(0)
    未经允许不得转载:171主机测评 » Python迷你爬虫实战:12行代码抓取豆瓣短评
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址