只需要3步骤,实现OCR图片批量识别,并保存到本地数据库,并同步远程数据库
- 创建一个带透明通道的mask图片(要同尺寸),放到
mask/{平台}/{标签}/目录下 - 修改配置文件
config.ini,按行从上到下的顺序写每个涂抹区域对应的含义 - 将需要ocr分析的图片放到
images/(或OCR_IMAGES_PATH)目录下,执行即可
| 文档 | 内容 |
|---|---|
| docs/ARCHITECTURE.md | 项目定位、分层架构、目录职责、技术栈、关键设计 |
| docs/DATA_FLOW.md | 采集端→SFTP→加工端全链路、两种采集模式、目录/文件/字段契约、入库 |
| docs/DEPLOYMENT.md | 容器/裸机部署、OCR 引擎接入与健壮性、环境变量表、常见问题 |
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple# 执行OCR识别和数据同步
python social_ocr.py
# 或明确指定模式
python social_ocr.py --mode manual
# 执行OCR识别但不进行数据同步
python social_ocr.py --mode manual --no-sync# 每小时执行一次OCR识别和数据同步
python social_ocr.py --mode schedule
# 每30分钟执行一次OCR识别和数据同步
python social_ocr.py --mode schedule --interval 30
# 每天10:00执行一次OCR识别和数据同步
python social_ocr.py --mode schedule --at-time "22:00"
# 每小时执行OCR识别但不进行数据同步
python social_ocr.py --mode schedule --no-sync
TZ='Asia/Shanghai' nohup python social_ocr.py --mode schedule --at-time "22:00" >> run.log 2>&1 &
在定时任务模式下,系统会按照指定的时间间隔或时间点自动执行OCR识别和数据同步任务。
socialmediaocr/
├── core/ # 核心功能模块
│ ├── run.py # 加工主流程:目录扫描 + 平台 parser 分发
│ ├── mask_ocr.py # 蒙版合成 + OCR识别 + 结果校验
│ ├── parsers/ # 各平台解析器(xhs/weibo/tiktok/coolapk)
│ ├── ocr.py # OCR行排序工具
│ ├── ppocr_api.py # PaddleOCR-json 引擎封装
│ └── logger.py # 日志
├── db/ # 数据库相关
│ ├── __init__.py # 记录构建(内存字典)+ 平台 appid 登记表 SOURCE_TYPES
│ └── data_sync.py # 同步远程MySQL
├── docker/ # 容器化部署(双容器:引擎 socket 服务 + 应用)
│ ├── docker-compose.yml
│ ├── Dockerfile.app
│ ├── Dockerfile.engine
│ └── download_engine.sh # 引擎包下载 + SHA256 校验
├── images/ # 待识别图片(上游采集落盘目录,可用 OCR_IMAGES_PATH 覆盖)
├── mask/ # 遮罩图片库(已拍平:{平台}/{标签}/)
├── docs/ # 项目文档(架构/数据流转/部署)
├── tmp/ # 临时文件
├── config.ini # OCR 加工规则:tag 字段提取顺序 + 中文段名→表英文列映射
├── social_ocr.py # 主入口文件
└── requirements.txt # 项目依赖
上游 sma_autoui 各平台 scraper 统一继承 BaseProfileScraper,每个采集运行目录
({平台}/{YYYYMMDD}/{设备}#{账号}/)产出:
user_info.json:用户信息(UserInfo 模型序列化)→ 同步到s_xhs_user_info_ocrpost_data.json:帖子/内容数据(PostInfo 模型序列化列表)→ 同步到内容大表{标签}#{标识}.png:截图(仅xhs/tiktok)→ 蒙版OCR后同步到内容大表
两条通道最终入库同一张表 s_xhs_data_overview_traffic_analysis,缺失字段为空。
OCR 引擎统一为 PaddleOCR(PaddleOCR-json v1.4.1),已移除历史上的 surya 分支。通过环境变量配置:
OCR_ENGINE: OCR引擎类型,仅支持PaddleOCR(设为其他值记 error 并跳过 OCR)OCR_ENGINE_PATH: 两种形态- 本地引擎二进制路径(如
/opt/paddleocr-json/PaddleOCR-json):pipe 子进程模式,按需拉起 remote://ip:port(如remote://ocr-engine:9985):socket 模式,连接独立部署的引擎服务(容器化部署使用)
- 本地引擎二进制路径(如
OCR_IMAGES_PATH: 采集落盘根目录(默认项目内images/)OCR_RECENT_DAYS: 处理最近N天的目录(默认2)OCR_ENGINE_RETRY_INTERVAL: 引擎初始化失败后的退避间隔秒数(默认 30),窗口内不重复拉起OCR_ENGINE_HEALTH_CHECK: 复用缓存引擎前是否先跑健康探针(默认 1 开;0/false/no关闭)
引擎为单例懒加载,命中缓存先跑健康探针(local 查子进程存活 / remote 发空指令测连通), 探针失败自动关闭旧实例并重连/重启,实现断线自愈;详见 docs/DEPLOYMENT.md。
连接信息与库名通过环境变量(.env)配置,不同环境各自维护:
MYSQL_HOST: MySQL服务器地址MYSQL_PORT: MySQL端口MYSQL_USER: 用户名MYSQL_PASSWORD: 密码MYSQL_DATABASE: 数据库名
入库目标表名属远程库契约(跨环境恒定),登记在 db/__init__.py 的
TABLE_CONTENT_DATA / TABLE_USER_INFO 常量,与 db/init.sql 建表名一致。
config.ini 职责是 OCR 加工规则,链路:OCR 文本行序 --[tags]--> 中文字段名 --[fields]--> MySQL 英文列名:
[tags]
note_data_overview_top = 曝光数,观看数,封面点击率
[fields]
# 英文列名 = 中文字段名,同一列多个中文别名用逗号分隔
view_count = 观看数
collection_time = 采集时间,采集日期每次任务启动时会校验 [tags] 字段均能在 [fields] 映射,漏配会告警提醒(该列入库时会被丢弃)。
平台 appid(远程库 source_type 字段)是入库契约的一部分,跨环境恒定,
登记在 db/__init__.py 的 SOURCE_TYPES 常量表,新平台接入时与 parser 一并添加:
SOURCE_TYPES = {
"xhs": "1894230222988058625",
...
}- 程序扫描
images/(或OCR_IMAGES_PATH)下最近N天的采集运行目录 - JSON直采通道:
user_info.json/post_data.json按上游统一模型解析后入库 - 截图通道:根据文件名标签应用对应遮罩图片 → OCR识别 → 按行序映射字段 → 有效性校验
- 两通道记录入库同一张MySQL表(缺失字段为空),用户信息入
s_xhs_user_info_ocr
OCR 引擎统一使用 PaddleOCR-json v1.4.1
的 Linux 便携包(PaddleOCR-json_v1.4.1_debian_x64_glibc2.31.tar.xz,要求 glibc>=2.31,
即 Debian 11+/Ubuntu 20.04+)。支持两种部署方式,共用同一套代码,仅 OCR_ENGINE_PATH 不同。
双容器:ocr-engine(引擎常驻 TCP 服务模式,监听 9985)+ app(常驻 schedule 模式,
每天 22:00 执行,通过 remote://ocr-engine:9985 连接引擎)。
# 1. 下载引擎包并校验 SHA256(仅首次;也可开发机下载后 scp 到 docker/ 目录)
bash docker/download_engine.sh
# 2. 准备 .env(MYSQL_* / SFTP_* 等,参考配置说明章节)
# 3. 构建并启动
docker compose -f docker/docker-compose.yml up -d --build
# 4. 验证
docker compose -f docker/docker-compose.yml ps # engine 应为 healthy
docker compose -f docker/docker-compose.yml logs -f app
docker compose -f docker/docker-compose.yml exec app python social_ocr.py --mode manual # 手动跑一轮全链路挂载说明(在 docker/docker-compose.yml 中按需调整):
/home/callfans/ocr:/data/ocr:采集数据目录(rw,容器内会清理过期日期目录)./logs:/app/logs:日志持久化到宿主项目目录
# 1. 下载并解压引擎到 /opt
bash docker/download_engine.sh
sudo mkdir -p /opt/paddleocr-json
sudo tar -xJf docker/PaddleOCR-json_v1.4.1_debian_x64_glibc2.31.tar.xz \
-C /opt/paddleocr-json --strip-components=1
sudo chmod +x /opt/paddleocr-json/PaddleOCR-json
# 2. .env 中指向本地二进制(注意 Linux 下无 .exe 后缀,pipe 模式按需拉起)
# OCR_ENGINE=PaddleOCR
# OCR_ENGINE_PATH=/opt/paddleocr-json/PaddleOCR-json
# 3. 安装服务(参考 pro/social_ocr.service,按实际路径/conda环境调整)
sudo cp pro/social_ocr.service /etc/systemd/system/social_ocr.service
sudo systemctl daemon-reload
sudo systemctl enable --now social_ocr.service
# 常用运维
sudo systemctl status social_ocr.service # 查看状态
sudo systemctl restart social_ocr.service # 重启
journalctl -u social_ocr.service -f # 跟踪日志(或看 logs/run.log)修改 service 文件后需 sudo systemctl daemon-reload 重新加载配置再 restart。
- glibc 版本不够(裸机):引擎包要求 glibc>=2.31,
ldd --version查看;不满足则改用容器部署 - 引擎启动报缺库:按报错内容在 Dockerfile.engine 的 apt 列表中补装对应组件
- 容器内解析不了
mysql-svr/callfans-rpa等内网主机名:bridge 网络默认继承宿主 DNS, 通常可解析;失败时在 compose 中启用extra_hosts映射 IP 兜底 - 引擎内存占用:常驻约 800MB~1GB,可在 compose 中用
mem_limit限制 - 挂载卷权限:app 容器以 uid=1000 运行(与宿主 callfans 对齐),若宿主数据目录属主不同需调整
- 本地 Windows 开发:
OCR_ENGINE_PATH指向 Windows 版PaddleOCR_json.exe即可,pipe 模式与 Linux 行为一致


