154 lines
3.6 KiB
Markdown
154 lines
3.6 KiB
Markdown
|
|
# 微信公众号抓取指南
|
||
|
|
|
||
|
|
## 当前项目中的两条公众号数据链路
|
||
|
|
|
||
|
|
项目里当前同时存在两种公众号处理方式:
|
||
|
|
|
||
|
|
1. 官方接口抓取链路
|
||
|
|
2. 微信公众平台后台登录态探测链路
|
||
|
|
|
||
|
|
它们用途不同,不要混用理解。
|
||
|
|
|
||
|
|
## 1. 官方接口抓取链路
|
||
|
|
|
||
|
|
### 对应文件
|
||
|
|
|
||
|
|
- `crawler/wechat_crawler.py`:高德地图公众号
|
||
|
|
- `crawler/baidu_map_crawler.py`:百度地图公众号
|
||
|
|
- `crawler/wechat_mp_crawler_base.py`:通用基类
|
||
|
|
|
||
|
|
### 这条链路的特点
|
||
|
|
|
||
|
|
- 被 `main.py` 正式集成
|
||
|
|
- 依赖 `AppID/AppSecret`
|
||
|
|
- 通过微信官方素材接口和草稿接口获取内容
|
||
|
|
- 可直接进入统一向量库流程
|
||
|
|
|
||
|
|
### 环境变量
|
||
|
|
|
||
|
|
```env
|
||
|
|
WECHAT_APPID=...
|
||
|
|
WECHAT_APPSECRET=...
|
||
|
|
BAIDU_MAP_APPID=...
|
||
|
|
BAIDU_MAP_APPSECRET=...
|
||
|
|
```
|
||
|
|
|
||
|
|
### 当前抓取逻辑
|
||
|
|
|
||
|
|
1. 先取 `access_token`
|
||
|
|
2. 读取永久图文素材数量
|
||
|
|
3. 如果永久素材为空,回退读取草稿箱
|
||
|
|
4. 解析图文内容
|
||
|
|
5. 根据关键词过滤
|
||
|
|
6. 保存为 JSON
|
||
|
|
7. 如果通过 `crawl_and_save(..., save_to_rag=True)` 调用,则写入向量库
|
||
|
|
|
||
|
|
### 直接运行示例
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python crawler/wechat_crawler.py
|
||
|
|
python crawler/baidu_map_crawler.py
|
||
|
|
```
|
||
|
|
|
||
|
|
### 通过主流程运行
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python main.py --mode crawl --sources wechat
|
||
|
|
python main.py --mode crawl --sources baidu
|
||
|
|
python main.py --mode full --sources wechat,baidu
|
||
|
|
```
|
||
|
|
|
||
|
|
### 数据结构
|
||
|
|
|
||
|
|
官方接口解析后的文章字段包括:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"title": "文章标题",
|
||
|
|
"author": "作者",
|
||
|
|
"digest": "摘要",
|
||
|
|
"content": "正文纯文本",
|
||
|
|
"content_html": "正文HTML",
|
||
|
|
"content_source_url": "原文地址",
|
||
|
|
"thumb_url": "封面图地址",
|
||
|
|
"url": "微信文章URL",
|
||
|
|
"date": "2026-04-29",
|
||
|
|
"update_time": "2026-04-29 10:00:00",
|
||
|
|
"timestamp": 1777428000,
|
||
|
|
"source": "高德地图公众号",
|
||
|
|
"crawl_time": "2026-04-29 10:05:00"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 2. 后台登录态探测链路
|
||
|
|
|
||
|
|
### 对应文件
|
||
|
|
|
||
|
|
- `crawler/wechat_mp_backend_client.py`
|
||
|
|
|
||
|
|
### 这条链路的用途
|
||
|
|
|
||
|
|
- 用公众号后台登录 Cookie 做验证和排查
|
||
|
|
- 可搜索公众号账号、列文章、尝试抓正文
|
||
|
|
- 适合测试“高德地图官方号 / 百度地图官方号”是否能拿到有效文章
|
||
|
|
- 默认不被 `main.py` 调用
|
||
|
|
|
||
|
|
### 需要的条件
|
||
|
|
|
||
|
|
- 有效的 `WECHAT_MP_COOKIE`
|
||
|
|
- 可用的微信公众号后台登录态
|
||
|
|
- 抓正文时需要本机 Edge + Selenium
|
||
|
|
|
||
|
|
### 示例
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python -m crawler.wechat_mp_backend_client --biz-query AMap --count 5 --fetch-content
|
||
|
|
```
|
||
|
|
|
||
|
|
## IP 白名单说明
|
||
|
|
|
||
|
|
如果走的是“官方接口抓取链路”,可能遇到微信 IP 白名单限制;见:
|
||
|
|
|
||
|
|
- [WECHAT_IP_WHITELIST_GUIDE.md](WECHAT_IP_WHITELIST_GUIDE.md)
|
||
|
|
|
||
|
|
如果走的是“后台登录态探测链路”,它依赖的是 Cookie 和后台权限,不走 `AppID/AppSecret` 白名单流程。
|
||
|
|
|
||
|
|
## 当前项目中的实际边界
|
||
|
|
|
||
|
|
- `main.py` 当前只接入官方接口抓取链路
|
||
|
|
- 后台登录态探测工具主要用于验证真实公众号文章能否访问
|
||
|
|
- “探测成功”不等于“主流程已改为走后台链路”
|
||
|
|
|
||
|
|
## 常见问题
|
||
|
|
|
||
|
|
### 配置了公众号数据源但被跳过
|
||
|
|
|
||
|
|
检查:
|
||
|
|
|
||
|
|
- `WECHAT_APPID` / `WECHAT_APPSECRET`
|
||
|
|
- `BAIDU_MAP_APPID` / `BAIDU_MAP_APPSECRET`
|
||
|
|
|
||
|
|
### access_token 获取失败
|
||
|
|
|
||
|
|
优先检查:
|
||
|
|
|
||
|
|
1. AppID 和 AppSecret 是否正确
|
||
|
|
2. IP 是否在白名单
|
||
|
|
3. 公众号是否具备接口权限
|
||
|
|
|
||
|
|
### 探测工具能拿到文章,但主流程抓不到
|
||
|
|
|
||
|
|
这是正常现象,说明:
|
||
|
|
|
||
|
|
- 后台登录态探测链路可用
|
||
|
|
- 但 `main.py` 仍在走官方接口链路
|
||
|
|
|
||
|
|
## 已删除的旧说明
|
||
|
|
|
||
|
|
以下说法不再准确:
|
||
|
|
|
||
|
|
- 当前项目只有一种公众号抓取方式
|
||
|
|
- 所有“高德 / 百度”测试结果都来自官方接口
|
||
|
|
- 后台登录态探测工具已经接入 `main.py`
|
||
|
|
|