1. 项目背景与核心思路去年帮朋友做影视数据分析时需要快速获取《黑豹》的豆瓣短评数据。传统爬虫教程往往从零开始搭建完整框架但对于这种轻量级需求其实用Python标准库requests就能12行代码搞定。这种极简爬虫特别适合临时数据采集需求无需复杂环境配置直接上手就能跑通。核心原理是利用requests模拟浏览器请求通过豆瓣短评接口获取JSON数据。这里有个关键技巧豆瓣对未登录用户只开放前20页短评每页20条而登录后可爬取更多数据。不过要注意频率控制实测连续请求超过10次/分钟会触发429错误。2. 环境准备与工具选型2.1 基础环境配置推荐使用Python 3.6版本主要依赖两个库pip install requests pip install pandas # 非必须用于数据整理选择requests库而非Scrapy等框架的原因轻量级无需创建完整爬虫项目学习成本低API设计直观适合新手调试方便直接打印响应内容2.2 接口分析技巧通过Chrome开发者工具抓包发现短评接口格式https://movie.douban.com/subject/[电影ID]/comments?start[偏移量]limit20《黑豹》电影ID5360029关键参数start分页偏移量0,20,40...limit固定值20注意务必添加User-Agent头部否则会返回403错误。实测可用的UAUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.363. 核心代码实现与解析3.1 基础爬取代码import requests headers {User-Agent: Mozilla/5.0} comments [] for i in range(0, 200, 20): # 爬10页数据 url fhttps://movie.douban.com/subject/5360029/comments?start{i} resp requests.get(url, headersheaders) comments.extend([item[content] for item in resp.json()[comments]]) print(f已获取第{i//201}页数据)代码关键点解析range(0, 200, 20)控制爬取页数20010页×20条resp.json()自动解析JSON响应列表推导式快速提取评论内容3.2 异常处理增强版实际运行时会遇到各种异常建议增加以下处理import time from random import uniform for i in range(0, 200, 20): try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() # 检查HTTP错误 data resp.json() if comments not in data: print(可能触发反爬尝试降低频率) break comments.extend([item[content] for item in data[comments]]) time.sleep(uniform(0.5, 1.5)) # 随机延迟 except Exception as e: print(f第{i//201}页出错{str(e)}) break4. 反爬机制与应对策略4.1 豆瓣的反爬措施频率限制单IP请求过快会返回429状态码User-Agent验证缺失或不常见的UA会被拦截Cookie验证部分接口需要携带登录态行为分析连续规律请求可能触发验证码4.2 合规爬取建议遵守robots.txt规则豆瓣允许爬取电影页面但禁止商业用途建议间隔请求至少1秒以上使用代理IP池需自行搭建proxies {http: http://your_proxy:port} requests.get(url, proxiesproxies)获取公开API权限豆瓣开放平台提供正式API接口需要申请API Key并遵守调用限制5. 数据存储与分析示例5.1 存储到CSV文件import pandas as pd df pd.DataFrame({comment: comments}) df.to_csv(black_panther_comments.csv, indexFalse, encodingutf-8-sig)5.2 简单词频分析from collections import Counter import jieba # 中文分词库 text .join(comments) words [w for w in jieba.cut(text) if len(w) 1] # 过滤单字 word_counts Counter(words).most_common(20) print(高频词Top20:, word_counts)6. 常见问题排查指南问题现象可能原因解决方案返回403错误缺少User-Agent或Cookie添加合法UA头返回429错误请求频率过高增加延迟或使用代理JSON解析失败接口返回HTML验证页检查响应内容格式数据缺失页面结构变更更新CSS选择器/XPath连接超时网络问题或IP被封更换网络环境7. 进阶优化方向登录态保持使用session对象保存cookiessession requests.Session() session.post(login_url, datacredentials) session.get(api_url) # 自动携带cookies异步爬取提升效率import aiohttp async with aiohttp.ClientSession() as session: async with session.get(url) as resp: data await resp.json()使用Selenium应对动态渲染from selenium import webdriver driver webdriver.Chrome() driver.get(url) comments driver.find_elements_by_css_selector(.comment-item)我在实际爬取时发现工作日下午的请求成功率明显高于晚间高峰时段。建议在代码中添加自动重试机制当连续3次请求失败后暂停10分钟再继续。另外保存中间结果到文件也很重要避免程序中断导致数据丢失。