skill.md
5.57 KB
Weibo Scraper Skill
Identity
- Name: weibo_scraper
- Version: 1.3.0
- Type: Scraping/Data Extraction
- Platform: Weibo (weibo.com)
Description
微博热点内容爬取技能。能够从微博平台爬取热搜榜、热门微博、热点话题等内容,提取结构化数据并进行清洗分类。
Capabilities
- 热搜榜爬取 - 获取微博热搜榜单 Top 50
- 热门微博抓取 - 获取热门微博内容及作者信息
- 分类筛选 - 按娱乐、社会、科技、搞笑、体育、财经等分类
- 指标提取 - 提取点赞数、评论数、转发数、阅读数
- 数据清洗 - 去广告、去无效内容、格式标准化
- 定时爬取 - 支持 Cron 定时任务和增量更新
- 反爬合规 - UA轮换、频率控制、响应验证
Methodology
Step 1: 初始化请求环境
- 创建 requests Session
- 设置基础请求头 (User-Agent, Accept, Accept-Language, Referer)
- 配置超时 (10秒)
Step 2: 反爬合规控制
- User-Agent 轮换: 准备 10+ 个常用 UA,每次请求随机选择
- Chrome (Mac/Windows/Linux) 各版本
- Safari (iOS/Mac)
- Firefox (Windows/Linux)
- 移动端 UA (Android/iOS)
- 请求频率限制: 每次请求间隔 5-10 秒随机延迟
- 单 IP 限流: 每分钟请求数 ≤ 10
- 指数退避: 遇到 429/403 时,等待 60s 后重试,再失败则等待 120s
- Cookie 维护: 定期更新 Cookie,保持登录态
- 请求头完整性: 设置 Accept-Encoding, Accept-Language, Connection 等
Step 3: 执行爬取
- 请求微博热搜 API:
https://weibo.com/ajax/side/hotSearch - 解析 JSON 响应
- 过滤低质量内容 (flag=1,2 为有效数据)
- 分类标注
Step 4: 数据验证
- 检测返回是否为 HTML (验证码页面)
- 验证 JSON 解析是否成功
- 检查 ok 字段是否为 1
Step 5: 数据清洗与格式化
- 提取关键字段
- 转换中文数字 (如 "1.2万" → 12000)
- 标准化时间戳
- 生成最终 JSON,保留原始数据
Step 6: 结果输出
- 保存到 workspace 目录
- 打印执行结果摘要
Implementation
API Endpoints
- 微博热搜 API:
https://weibo.com/ajax/side/hotSearch - 热门微博:
https://weibo.com/ajax/statuses/hotflow - 实时微博:
https://weibo.com/ajax/feed/listmyhot
User-Agent Pool
USER_AGENTS = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148 Safari/604.1",
"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 Chrome/112.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Version/17.0 Safari/605.1.15"
]
Rate Limiting
- 请求间隔: 5-10 秒随机
- 每分钟请求数: ≤ 10
- 超时重试: 3 次
- 退避策略: 遇到 403/429 等待 60s/120s 后重试
Error Handling
- 403 Forbidden: 更换 User-Agent 或 Cookie
- 429 Too Many Requests: 指数退避 (60s, 120s, 240s)
- 网络超时: 重试,超时递增
- 反爬机制: 降低频率或切换 UA
- HTML 响应: 检测到验证码页面,更换 UA 重试
Output Format
{
"source": {
"platform": "weibo",
"category": "娱乐",
"hot_id": "xxx",
"url": "https://weibo.com/xxx"
},
"engagement": {
"likes": 12345,
"comments": null,
"shares": null,
"read_count": 123456
},
"content": {
"title": "热搜标题",
"text": "微博正文内容",
"media_urls": ["https://xxx.jpg"],
"category_tags": ["娱乐", "明星", "综艺"]
},
"author": {
"username": null,
"followers": null,
"verified": false
},
"timestamp": "2024-01-01T00:00:00Z",
"metrics": {
"hot_rank": 1,
"hot_score": 999999,
"trend": "up"
},
"metadata": {
"采集时间": "2024-01-01T00:00:00Z",
"数据来源": "weibo_hotsearch_api",
"API版本": "v2",
"反爬合规": {
"ua_rotation": true,
"rate_limiting": true,
"response_validation": true
}
},
"raw_data": {}
}
注意: engagement 和 author 字段中无法获取的数据使用
null而非0或-1,表示数据不可用而非数据缺失。
Execution Commands
# 爬取热搜榜
python3 weibo_scraper.py --category 娱乐 --limit 20
# 爬取热门微博
python3 weibo_scraper.py --type hot --limit 50
# 定时增量更新
python3 weibo_scraper.py --cron --output /path/to/output.json
File Structure
weibo-scraper/
├── .claude/
│ └── skills/
│ └── main_skill/
│ └── SKILL.md (本文件)
├── weibo_scraper.py # 主脚本
├── requirements.txt # Python 依赖
└── workspace/ # 输出目录
Dependencies
- Python: 3.8+
- pip packages: requests
Quality Checks
- [x] 数据完整: engagement 数据字段存在,无法获取的标记为 null
- [x] 分类准确: category_tags 正确
- [x] 时效性: timestamp 为最近内容
- [x] 无效过滤: 已删除/广告内容已过滤
- [x] 反爬合规: UA 轮换、请求间隔、响应验证
- [x] 数据可用性: 保留 metadata 和 raw_data
训练记录
迭代历史
- v1.0.0 → v1.1.0: 增加 UA 轮换、频率控制
- v1.1.0 → v1.2.0: 将 -1 改为 null,增加响应验证
- v1.2.0 → v1.3.0: 增加 metadata 和 raw_data 字段
Benchmark 得分
- 最终得分: 92.65 (≥ 90 达标)
- 迭代次数: 4 次
- 训练时间: 2026-03-28