过去十年,中国电影产业经历了高速增长期与内容升级期的双重阶段。无论是票房纪录的不断刷新,还是类型片多元化的发展趋势,都让电影数据的价值被进一步放大。
在这个过程中,豆瓣电影逐渐成为影迷、媒体、研究机构的重要参考平台。它不仅是影评交流的社区,更是电影口碑和市场走势的风向标。对于数据分析人员来说,豆瓣的数据就像电影产业的“温度计”,能够直接反映观众偏好与行业动态。
本次案例源于一个电影数据分析项目——起初我们只需要采集豆瓣Top 250榜单做影评与分数趋势分析。但随着研究范围扩大到全部高分电影与每日新片,数据规模呈指数级上升,原本的采集架构瞬间陷入性能和反爬的双重困境。于是,我们以侦探的视角,完整追踪了架构应对数据暴涨的演变过程。
针对不同阶段的采集范围,我们记录了核心指标(目标站点:https://movie.douban.com
):
阶段 | 采集范围 | 页面总量 | 单日请求数 | 失败率 | 平均响应时间 |
---|---|---|---|---|---|
初期 | Top 250(10 页) | 250 | 250 | 0.8% | 0.7s |
中期 | 高分电影(约 800 页) | 20,000 | 25,000 | 5% | 1.9s |
高峰 | 高分+新片(约 3,000 页) | 120,000 | 1,200,000 | 18% | 5.1s |
调查发现:
在我们的调查中,采集架构的演进可以看作一条案发时间线:
[阶段1:单机脚本]
↓(轻量需求,性能足够)
[阶段2:多进程并发]
↓(提升速度,但触发封锁)
[阶段3:引入代理池 + 分布式调度]
↓(降低封锁率,但调度压力上升)
[阶段4:分布式集群 + 异步IO + 自动扩缩容]
当日请求量突破数十万次后,单一IP已无法满足需求,我们引入了爬虫代理,通过动态分配IP的方式,降低限制概率并支持并发请求。
import requests
from concurrent.futures import ThreadPoolExecutor
from lxml import etree
# 代理配置(亿牛云示例)
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_username = "16YUN"
proxy_password = "16IP"
# 拼接代理URL
proxy_meta = f"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}"
proxies = {
"http": proxy_meta,
"https": proxy_meta,
}
# 抓取豆瓣Top250页面
def fetch_page(start):
url = f"https://movie.douban.com/top250?start={start}&filter="
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if resp.status_code == 200:
html = etree.HTML(resp.text)
titles = html.xpath('//div[@class="hd"]/a/span[1]/text()')
print(f"[成功] 第 {start//25+1} 页 | 电影: {titles}")
else:
print(f"[失败] 第 {start//25+1} 页 | 状态码: {resp.status_code}")
except Exception as e:
print(f"[错误] 第 {start//25+1} 页 | 原因: {e}")
if __name__ == "__main__":
starts = [i * 25 for i in range(10)] # Top250 共10页
with ThreadPoolExecutor(max_workers=5) as pool:
pool.map(fetch_page, starts)
特点:
lxml
解析速度快,适合批量HTML数据提取。[单机爬虫脚本]
↓(任务轻,稳定运行)
[多进程并发]
↓(速度提升,但封锁增加)
[引入代理池 + 分布式调度]
↓(多节点协作,封锁率下降)
[分布式集群 + 异步IO + 自动扩缩容]
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。