397 lines
11 KiB
Markdown
397 lines
11 KiB
Markdown
# 百家号数据采集与分析系统
|
||
|
||
## 项目简介
|
||
|
||
本项目是一个面向百家号平台的自动化数据采集、分析与监控系统,支持多账号管理、定时数据同步、数据验证和短信告警等功能。
|
||
|
||
## 核心功能
|
||
|
||
### 1. 数据采集
|
||
- **Cookie管理**:通过mitmproxy自动捕获账号Cookie,支持批量同步至数据库
|
||
- **文章抓取**:抓取百家号文章数据,包括标题、内容、发布时间等
|
||
- **统计数据获取**:获取发文统计(曝光量、阅读量、点击率)和收入数据
|
||
|
||
### 2. 数据分析
|
||
- **多维度统计**:按日/周/月维度生成统计报表
|
||
- **环比计算**:自动计算周环比、月环比增长率
|
||
- **数据导出**:支持导出为CSV格式,便于数据分析
|
||
|
||
### 3. 数据同步
|
||
- **守护进程**:systemd服务,定时自动同步数据
|
||
- **批量导入**:支持历史数据批量导入
|
||
- **增量更新**:支持指定日期的增量数据更新
|
||
|
||
### 4. 数据验证与监控
|
||
- **数据一致性验证**:校验JSON/CSV/数据库三个数据源的一致性
|
||
- **短信告警**:集成阿里云短信服务,数据异常时自动发送告警(错误代码2222)
|
||
- **验证报告**:生成详细的验证报告,支持保存到专门目录
|
||
|
||
### 5. 代理管理
|
||
- **天启代理集成**:支持HTTP代理,避免IP限制
|
||
- **智能重试机制**:
|
||
- 同一代理最多尝试3次
|
||
- 超时/连接错误立即更换代理
|
||
- 最多更换3次代理(共尝试4个不同代理)
|
||
- **错误处理**:自动识别errno=10000015(异常请求),立即更换代理
|
||
|
||
## 技术栈
|
||
|
||
- **Python 3.8+**
|
||
- **数据库**:MySQL 8.0+ (pymysql)
|
||
- **网络请求**:requests, urllib3
|
||
- **抓包工具**:mitmproxy 10.0+
|
||
- **定时任务**:schedule
|
||
- **短信服务**:阿里云短信SDK (alibabacloud_dysmsapi20170525)
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
xhh_baijiahao/
|
||
├── db/ # 数据库SQL脚本
|
||
│ ├── ai_articles.sql # 文章表
|
||
│ ├── ai_authors.sql # 作者表
|
||
│ ├── ai_statistics_days.sql # 日统计表
|
||
│ ├── ai_statistics_weekly.sql # 周统计表
|
||
│ └── ai_statistics_monthly.sql # 月统计表
|
||
│
|
||
├── ai_sms/ # 阿里云短信服务
|
||
│ └── ai_sms/ # 短信SDK示例代码
|
||
│
|
||
├── 核心模块
|
||
├── bjh_analytics.py # 百家号数据分析API(主要)
|
||
├── bjh_analytics_date.py # 指定日期数据抓取
|
||
├── bjh_articles_crawler.py # 文章爬虫
|
||
├── export_to_csv.py # 数据导出CSV
|
||
├── import_csv_to_database.py # CSV导入数据库
|
||
│
|
||
├── Cookie管理
|
||
├── mitmproxy_capture.py # mitmproxy Cookie捕获
|
||
├── 一键捕获Cookie.py # 快速Cookie捕获工具
|
||
├── sync_cookies_to_db.py # 批量Cookie同步
|
||
├── add_single_cookie_to_db.py # 单账号Cookie导入
|
||
├── add_account_from_cookie.py # 从Cookie添加账号
|
||
│
|
||
├── 守护进程与定时任务
|
||
├── data_sync_daemon.py # 数据同步守护进程(主要)
|
||
├── bjh_data_daemon.py # 备用守护进程
|
||
├── bjh_daemon.service # systemd服务配置
|
||
├── deploy_daemon.sh # 守护进程部署脚本
|
||
├── install_service.sh # 服务安装脚本
|
||
├── diagnose_service.sh # 服务诊断脚本
|
||
│
|
||
├── 数据验证与告警
|
||
├── data_validation.py # 数据验证核心
|
||
├── data_validation_with_sms.py # 数据验证+短信告警
|
||
├── test_validation_sms.sh # Linux测试脚本
|
||
├── test_validation_sms.bat # Windows测试脚本
|
||
│
|
||
├── 批量任务
|
||
├── batch_import_history.py # 历史数据批量导入
|
||
├── fetch_date_statistics.py # 指定日期统计获取
|
||
├── update_day_revenue.py # 日收益更新
|
||
│
|
||
├── 配置文件
|
||
├── database_config.py # 数据库配置
|
||
├── log_config.py # 日志配置
|
||
├── sms_config.json # 短信服务配置
|
||
├── requirements.txt # Python依赖
|
||
│
|
||
└── 快捷脚本
|
||
├── 一键捕获Cookie.bat # Windows一键Cookie捕获
|
||
├── 启动数据同步守护进程.bat # Windows启动守护进程
|
||
└── 抓取百家号文章.bat # Windows文章抓取
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
核心依赖:
|
||
- `requests>=2.31.0`
|
||
- `pymysql>=1.1.0`
|
||
- `mitmproxy>=10.0.0`
|
||
- `schedule>=1.2.0`
|
||
- `python-dateutil>=2.8.0`
|
||
|
||
### 2. 配置数据库
|
||
|
||
编辑 `database_config.py`,配置MySQL连接信息:
|
||
|
||
```python
|
||
DB_CONFIG = {
|
||
'host': 'your_host',
|
||
'port': 3306,
|
||
'user': 'your_user',
|
||
'password': 'your_password',
|
||
'database': 'ai_article',
|
||
'charset': 'utf8mb4'
|
||
}
|
||
```
|
||
|
||
### 3. 初始化数据库
|
||
|
||
执行 `db/` 目录下的SQL脚本创建表:
|
||
|
||
```bash
|
||
mysql -u root -p ai_article < db/ai_authors.sql
|
||
mysql -u root -p ai_article < db/ai_articles.sql
|
||
mysql -u root -p ai_article < db/ai_statistics_days.sql
|
||
mysql -u root -p ai_article < db/ai_statistics_weekly.sql
|
||
mysql -u root -p ai_article < db/ai_statistics_monthly.sql
|
||
```
|
||
|
||
### 4. 捕获Cookie
|
||
|
||
#### Windows:
|
||
```bash
|
||
一键捕获Cookie.bat
|
||
```
|
||
|
||
#### Linux:
|
||
```bash
|
||
python3 mitmproxy_capture.py
|
||
```
|
||
|
||
### 5. 同步Cookie到数据库
|
||
|
||
```bash
|
||
python3 sync_cookies_to_db.py
|
||
```
|
||
|
||
### 6. 启动数据同步守护进程
|
||
|
||
#### Linux (推荐使用systemd):
|
||
```bash
|
||
# 部署服务
|
||
sudo bash deploy_daemon.sh
|
||
|
||
# 启动服务
|
||
sudo systemctl start bjh_daemon
|
||
|
||
# 查看状态
|
||
sudo systemctl status bjh_daemon
|
||
|
||
# 查看日志
|
||
journalctl -u bjh_daemon -f
|
||
```
|
||
|
||
#### Windows:
|
||
```bash
|
||
启动数据同步守护进程.bat
|
||
```
|
||
|
||
#### 手动运行:
|
||
```bash
|
||
python3 data_sync_daemon.py
|
||
```
|
||
|
||
## 主要功能使用
|
||
|
||
### 批量导入历史数据
|
||
|
||
```bash
|
||
python3 batch_import_history.py
|
||
```
|
||
|
||
支持交互式选择:
|
||
- 账号选择(单个/多个/全部)
|
||
- 日期范围设置
|
||
- 是否使用代理
|
||
- 数据库/文件来源选择
|
||
|
||
### 获取指定日期统计数据
|
||
|
||
```bash
|
||
python3 fetch_date_statistics.py 2025-12-26
|
||
```
|
||
|
||
### 导出数据为CSV
|
||
|
||
```bash
|
||
python3 export_to_csv.py
|
||
```
|
||
|
||
### 数据验证与短信告警
|
||
|
||
```bash
|
||
# 执行验证
|
||
python3 data_validation_with_sms.py
|
||
|
||
# 测试短信功能
|
||
python3 data_validation_with_sms.py --test-sms
|
||
```
|
||
|
||
验证报告保存在 `validation_reports/` 目录。
|
||
|
||
### 添加单个账号Cookie
|
||
|
||
```bash
|
||
python3 add_single_cookie_to_db.py
|
||
```
|
||
|
||
支持交互式输入:
|
||
- Username / 昵称
|
||
- App ID / 领域
|
||
- Cookie (多种格式)
|
||
|
||
## 数据库表结构
|
||
|
||
### ai_authors - 作者表
|
||
- `id`: 主键
|
||
- `author_name`: 作者名称(使用username或nick)
|
||
- `app_id`: 百家号app_id
|
||
- `toutiao_cookie`: Cookie字符串
|
||
- `channel`: 渠道(1=百家号)
|
||
- `status`: 状态(active/inactive)
|
||
|
||
### ai_statistics_days - 日统计表
|
||
- `author_id`: 作者ID
|
||
- `stat_date`: 统计日期
|
||
- `day_revenue`: 当日收益
|
||
- `daily_published_count`: 当日发文量
|
||
- `cumulative_published_count`: 累计发文量
|
||
- 唯一键:`uk_author_stat_date(author_id, channel, stat_date)`
|
||
|
||
### ai_statistics_weekly - 周统计表
|
||
- `author_id`: 作者ID
|
||
- `stat_weekly`: 周一日期(自然周)
|
||
- `weekly_revenue`: 当周收益(从日数据汇总)
|
||
- `revenue_wow_growth_rate`: 周环比增长率
|
||
|
||
### ai_statistics_monthly - 月统计表
|
||
- `author_id`: 作者ID
|
||
- `stat_monthly`: 每月1日日期
|
||
- `monthly_revenue`: 当月收益(从日数据汇总)
|
||
- `revenue_mom_growth_rate`: 月环比增长率
|
||
|
||
## 代理配置
|
||
|
||
项目支持天启代理,API配置在代码中:
|
||
|
||
```python
|
||
PROXY_API = "http://api.tianqiip.com/getip?secret=xxx&num=1&type=txt&port=1&mr=1&sign=xxx"
|
||
```
|
||
|
||
代理特性:
|
||
- IP白名单认证,无需账号密码
|
||
- 返回格式:纯文本 `IP:端口`
|
||
- 智能重试:超时/连接错误立即更换代理
|
||
- 双重限制:同一代理最多3次,最多更换3次代理
|
||
|
||
## 短信告警配置
|
||
|
||
编辑 `sms_config.json`:
|
||
|
||
```json
|
||
{
|
||
"access_key_id": "your_access_key_id",
|
||
"access_key_secret": "your_access_key_secret",
|
||
"sign_name": "your_sign_name",
|
||
"template_code": "SMS_486210104",
|
||
"phone_numbers": "13621242430",
|
||
"endpoint": "dysmsapi.aliyuncs.com"
|
||
}
|
||
```
|
||
|
||
## 守护进程配置
|
||
|
||
### systemd服务配置 (bjh_daemon.service)
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=百家号数据同步守护进程(含数据验证与短信告警)
|
||
After=network.target mysql.service
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=root
|
||
WorkingDirectory=/root/xhh_baijiahao
|
||
ExecStart=/usr/bin/python3 data_sync_daemon.py
|
||
Restart=always
|
||
|
||
Environment="LOAD_FROM_DB=true"
|
||
Environment="USE_PROXY=true"
|
||
Environment="ENABLE_VALIDATION=true"
|
||
Environment="NON_INTERACTIVE=true"
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
### 环境变量配置
|
||
|
||
- `LOAD_FROM_DB`: 是否从数据库加载Cookie (true/false)
|
||
- `USE_PROXY`: 是否使用代理 (true/false)
|
||
- `DAYS`: 抓取天数 (默认7)
|
||
- `MAX_RETRIES`: 最大重试次数 (默认3)
|
||
- `RUN_NOW`: 是否立即执行 (true/false)
|
||
- `ENABLE_VALIDATION`: 是否启用验证 (true/false)
|
||
- `NON_INTERACTIVE`: 非交互模式 (true/false)
|
||
|
||
## 日志管理
|
||
|
||
日志文件位置:
|
||
- 守护进程:`logs/data_sync_daemon.log`
|
||
- 数据库操作:`logs/database.log`
|
||
- Cookie同步:`logs/cookie_sync.log`
|
||
- 验证报告:`validation_reports/validation_report_YYYYMMDD_HHMMSS.txt`
|
||
|
||
查看实时日志:
|
||
```bash
|
||
tail -f logs/data_sync_daemon.log
|
||
```
|
||
|
||
## 常见问题
|
||
|
||
### 1. Cookie失效
|
||
- 症状:API返回 `errno=10000015`(异常请求)
|
||
- 解决:重新捕获Cookie并同步到数据库
|
||
|
||
### 2. 代理超时
|
||
- 症状:请求超时15秒
|
||
- 解决:系统自动更换新代理,最多尝试4个不同代理
|
||
|
||
### 3. 数据验证失败
|
||
- 症状:短信收到错误代码2222
|
||
- 解决:查看 `validation_reports/` 中的详细报告
|
||
|
||
### 4. 守护进程停止
|
||
- 诊断:`sudo bash diagnose_service.sh`
|
||
- 重启:`sudo systemctl restart bjh_daemon`
|
||
|
||
## 开发说明
|
||
|
||
### 添加新账号
|
||
1. 使用 `一键捕获Cookie.py` 捕获Cookie
|
||
2. 运行 `sync_cookies_to_db.py` 同步到数据库
|
||
3. 或使用 `add_single_cookie_to_db.py` 手动添加
|
||
|
||
### 修改统计维度
|
||
- 日统计:修改 `ai_statistics_days` 表结构
|
||
- 周统计:修改 `ai_statistics_weekly` 表结构
|
||
- 月统计:修改 `ai_statistics_monthly` 表结构
|
||
|
||
### 自定义代理
|
||
修改 `bjh_analytics.py` 和 `bjh_analytics_date.py` 中的代理获取逻辑:
|
||
```python
|
||
def fetch_proxy(self, force_new: bool = False):
|
||
# 自定义代理获取逻辑
|
||
pass
|
||
```
|
||
|
||
## 贡献指南
|
||
|
||
欢迎提交Issue和Pull Request!
|
||
|
||
## 许可证
|
||
|
||
本项目仅供学习和研究使用。
|
||
|
||
## 联系方式
|
||
|
||
如有问题,请通过Issue反馈。
|