作为一名长期深耕Python爬虫领域的开发者,我经常需要从各类视频平台获取数据进行分析。这次要分享的是一个针对AcFun全球硬核榜单的爬虫项目,它能自动采集每日热门视频数据,适用于内容分析、竞品监测等场景。相比市面上那些只能爬取单页数据的教程,这个方案实现了全站自动化采集、数据清洗和持久化存储,整套代码不到200行但功能完整。
提示:虽然AcFun的反爬机制相对宽松,但实际开发中仍需遵守robots.txt规则,控制请求频率在15-20次/分钟,避免对服务器造成压力。
选择Python作为开发语言主要考虑其丰富的爬虫生态库。具体技术栈如下:
python复制# 典型依赖配置示例
requirements = [
'requests==2.31.0',
'parsel==1.8.1',
'retrying==1.3.3',
'pandas==2.0.3'
]
整个系统采用分层架构,数据流转如下:
AcFun的API接口需要处理以下特殊头信息:
python复制headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.acfun.cn/rank/list',
'Accept-Encoding': 'gzip' # 必须声明支持压缩
}
# 关键请求参数
params = {
'channelId': 155, # 硬核分区ID
'subChannelId': 0,
'rankLimit': 30, # 每页条目数
'rankPeriod': 'DAY' # 日榜
}
注意:实测发现AcFun对Cookie验证不严格,但需要模拟完整浏览器环境。建议每次请求随机休眠2-5秒。
通过分析网页结构,发现视频数据藏在JavaScript变量中。常规解析方法失效时,可以采用:
json.loads()转换python复制import re
import json
# 提取JS中的视频数据
raw_data = re.search(r'window.__INITIAL_STATE__ = ({.*?});', html).group(1)
video_list = json.loads(raw_data)['rankList']['rankList']
为避免重复采集,采用复合去重策略:
sql复制-- SQLite表结构设计
CREATE TABLE IF NOT EXISTS acfun_videos (
video_id TEXT PRIMARY KEY,
title TEXT NOT NULL,
up_name TEXT,
view_count INTEGER,
danmu_count INTEGER,
collect_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
以下是核心组件的串联实现:
python复制class AcFunSpider:
def __init__(self):
self.session = requests.Session()
self.session.headers.update(DEFAULT_HEADERS)
self.visited = set() # 去重集合
@retry(stop_max_attempt_number=3)
def fetch_page(self, page_type='DAY'):
params = {'rankPeriod': page_type}
resp = self.session.get(API_URL, params=params)
return resp.json() if resp.status_code == 200 else None
def parse_video(self, item):
return {
'video_id': item['contentId'],
'title': item['title'],
'up_name': item['user']['name'],
'view_count': item['viewCount']
}
def run(self):
for rank_type in ['DAY', 'WEEK', 'MONTH']:
data = self.fetch_page(rank_type)
for item in data['rankList']:
if item['contentId'] not in self.visited:
video_data = self.parse_video(item)
self.save_to_db(video_data)
| 异常现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回空数据 | 接口参数错误 | 验证channelId是否变更 |
| 403状态码 | 请求头缺失 | 补全Referer和Cookie |
| 数据重复 | 去重失效 | 检查video_id提取逻辑 |
这个基础框架还可以进一步扩展:
python复制# 示例:简单的播放量分析
df = pd.read_sql('SELECT * FROM acfun_videos', con)
top10 = df.sort_values('view_count', ascending=False).head(10)
在实际部署时,建议将配置参数(如请求间隔、数据库路径)抽离到config.py文件中,方便不同环境切换。这个项目虽然代码量不大,但涵盖了爬虫开发的全流程要点,特别适合作为中级爬虫工程师的练手项目。