feat: 完善代理重试机制,添加数据验证告警,新增README文档
This commit is contained in:
396
README.md
Normal file
396
README.md
Normal file
@@ -0,0 +1,396 @@
|
||||
# 百家号数据采集与分析系统
|
||||
|
||||
## 项目简介
|
||||
|
||||
本项目是一个面向百家号平台的自动化数据采集、分析与监控系统,支持多账号管理、定时数据同步、数据验证和短信告警等功能。
|
||||
|
||||
## 核心功能
|
||||
|
||||
### 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反馈。
|
||||
Reference in New Issue
Block a user