链路追踪
定时任务
@echo off
echo 正在启动中...
call E:\chu\python310_ve\Scripts\activate.bat
cd /d E:\chu\qzclawler
git pull
python main.py -m cp -f 51
1. 任务启动指令拆解
命令:python main.py -m cp -f 51
python main.py: 启动主程序。-m cp: 参数m通常代表mode(模式)。cp极大概率对应 "Company",即“公司官网抓取模式”。-f 51: 参数f代表file。它直接指令程序去读取setting_com_51.ini这个配置文件。
2. 链路追踪:本次任务在做什么?
当这个任务运行时,程序会根据 setting_com_51.ini 里的配置,依次对以下企业进行“地毯式”扫描:
- 松山湖材料实验室 (
com_00075)- 目标:扫描校招、社招和海外招聘链接。
- 手段:使用
template_01005规则,并运行gen_00005_3自定义函数。
- 四三九九网络 (4399) (
com_00498)- 目标:抓取其官网的社招和校招岗位。
- 关键点:使用了
template_50150。注意其json_domain指向了微信端接口 (wx-hr.img4399.com),这意味着爬虫是在模拟手机端请求以获取更干净的 JSON 数据。
- 科捷智能 (
com_00499)- 平台:该公司使用的是飞书招聘 (ATS)。程序会针对飞书的页面结构进行解析。
3. 完整的自动化流水线
这个定时任务配合之前上传的 API 模块,形成了一个完整的闭环:
- 代码同步 (
git pull):确保脚本和.ini配置文件是最新的(比如你在另一台机器修改了 51 号文件里的 URL,这里会自动生效)。 - 环境激活 (
activate.bat):进入隔离的 Python 3.10 环境,确保PaddleOCR、requests等依赖库版本正确。 - 读取配置 (
-f 51):加载 4399、松山湖等公司的抓取规则。 - 网页抓取:程序访问配置文件中的
urls。 - 数据清洗与比对:
- 调用
quanzhi_api.py里的check_cloud接口。 - 逻辑:如果该职位在服务器上已经有了,就跳过;如果是新出的(如 2025 春招新岗位),则继续。
- 调用
- 结构化处理:
- 如果是文本,直接处理。
- 如果遇到招聘海报(图片),调用
ocr_api.py识别文字。 - 调用
openai4o_api.py或doubao_api.py将乱七八糟的描述转化为标准的 JSON 字段(薪资、地点、要求)。
- 入库 (
ann_add):最后通过quanzhi_api.py将结构化好的数据 POST 到正式环境服务器 (121.36.63.42)。
4. 关键观察点
- 并发性:从提供的
image_437de9.png来看,文件夹里从01到51有几十个配置文件。这说明你的系统采用了分片处理。 - 任务分工:
-f 01可能负责腾讯、阿里等大厂。-f 51则负责像 4399、松山湖实验室这些特定领域的企业。- 这种设计允许你开启多个定时任务并行工作,互不干扰。
1. 启动入口:main.py
当你运行 python main.py -m cp -f 51 时,程序从 main.py 的 if __name__ == "__main__": 块开始执行。
- 参数解析:使用
argparse模块接收参数。-m cp:指定运行模式。根据main.py逻辑,cp模式会进入公司数据抓取流程。-f 51:指定配置文件后缀。程序会拼接成setting_com_51.ini。
- 实例化:程序会同时创建三个核心类的实例:
s = SpiderSch(args.file)(学校爬虫)cs = SpiderCom(args.file)(公司爬虫)d = SpiderData(s)(数据处理)
2. 配置读取:从 setting_com_51.ini 到内存
配置是在 SpiderCom 类初始化或运行初期读取的。
- 读取位置:在
spider_com.py中,通常会在构造函数__init__或run方法里使用configparser加载setting_com_51.ini。 - 去向:配置信息会被解析成一个字典或对象。例如,日志中看到的
com_00220(OPPO)的 URL、模板 ID(template_...)、函数名(gen_...)等,都是从这个.ini文件中提取的。
3. 核心执行链路(Data Flow Link)
根据 Traceback 日志,链路如下:
main.py->run_periodically/clawler_main: 这是调度层。它根据-m cp参数决定调用cs.run()(即SpiderCom的主逻辑)。spider_com.py->run(): 遍历.ini文件中定义的所有公司编号(如com_00220,com_00221...)。spider_com.py->get_page_data():- 使用 Playwright 打开公司招聘的列表页(如 OPPO 的职位搜索页)。
- 根据模板找到所有的职位链接(
link)。
spider_com.py->get_page_detail_data(): 针对列表页抓取到的每一个职位,循环调用详情页抓取逻辑。spider_com.py->get_page_detail_content():- 深度抓取:打开具体的职位介绍页面。
- 提取内容:抓取 JD(职位描述)、要求、地点等。
- 报错点:你看到的报错就在这一层,尤其是详情页加载后的等待(
time.sleep)阶段。
4. 数据落地链路
- 本地临时存储:抓取到的原始 JSON 数据会存放在
E:\chu\clawler_data/data/tmp/公司编号/下。 - 云端上报:在
spider_data.py或通过api/quanzhi_api.py,程序会将解析后的结构化数据通过requests.post发送到华为云服务器(121.36.63.42)。
总结流程图
- 输入:命令行参数
-f 51 - 加载:读取
./setting_com_51.ini里的公司列表和规则 - 循环:
- 打开列表页 -> 获取多个详情页URL
- 逐个打开详情页 -> 提取 JD文本
- 处理:调用
SpiderData进行清洗或 OCR - 输出:写入本地 JSON,并调用
quanzhi_api.py上传到正式环境数据库
💬 评论