auto_api

这是大公司招聘API直连爬取模块,与之前兴业银行的"Playwright拦截响应"方式不同,这里大部分公司是直接调用其招聘后台API接口获取数据。

整体结构

baidu_data_proc_api.py 里的 api_proc 是总入口路由,按公司编号分发:

编号 公司 文件
com_90001 百度 baidu_data_proc_api
com_90002 软通动力 isoftstone_data_proc_api
com_90003 京东 jd_data_proc_api
com_90004 金蝶 kingdee_data_proc_api
com_90005 中国人保 picc_data_proc_api

三种不同的数据获取方式

各公司技术方案不同,对应三种截然不同的爬取策略:

① 直接POST接口(百度、软通动力)

直接构造 HTTP 请求调用招聘后台 API,拿到分页 JSON 数据。百度额外引入了代理池(getProxy),通过递归重试最多3次获取可用代理,用于绕过IP限制。软通动力则需要处理两套不同的 API 响应格式(社招返回 code/data/list,校招返回 results/count),在 get_isoftstone_job_json 里做了格式自动适配。

② 解析JS文件(金蝶)

金蝶的职位数据不是通过接口返回,而是直接写在一个静态 JS 文件里(jobs.js)。用正则从 JS 文本里提取 jobs = [...] 数组,再解析成 JSON。这是一种比较少见的数据发布方式,通常是静态站点为了避免 API 被滥用而采用的方案。

③ Playwright渲染详情页(软通动力)

列表数据通过API拿到后,详情页是动态渲染的 SPA,必须用 Playwright 打开浏览器等待 JS 执行完(wait_for_load_state("networkidle") + 额外等5秒)才能拿到完整内容。软通动力同时用了 ThreadPoolExecutor 避免与外层已有的事件循环冲突。


每个公司处理完数据后的统一落盘流程

无论哪种获取方式,最终都走同一套处理逻辑:

获取到职位列表 JSON
        │
        ├─ 已存在同名文件?
        │   └─ 只更新文件 mtime(标记"本次爬到了"),跳过
        │
        ├─ transform_job_json
        │   把各公司私有字段名 → 系统统一字段名
        │   写入 detail_xxx.json
        │
        ├─ 生成 / 获取 HTML 文件
        │   百度:requests 直接拉详情页 HTML
        │   软通:Playwright 渲染后保存
        │   金蝶:本地用 generate_html 拼一段完整 HTML
        │
        └─ detail_xxx.html + detail_xxx.json 落盘
               │
               └─ 进入后续 ann_md → ann_model 解析流水线

几个值得注意的设计细节

文件名用 URL 的 MD5 哈希hashlib.md5(_fullurl.encode()).hexdigest() 作为文件名,保证同一个 URL 永远映射到同一个文件,天然实现去重。

更新 mtime 而不是跳过:已爬取的文件不重新下载,但会调用 os.utime 更新修改时间。这样系统可以通过文件修改时间判断"这条数据在本次爬取中是否仍然有效",过期的文件会被下游清理任务识别并删除。

金蝶的 generate_html 设计思路与兴业银行一致:API 返回的是干净 JSON,但为了复用后续解析流水线,故意把它重新渲染成一段格式化 HTML 再落盘。

翻页策略有两档:默认爬5页(快速模式),配置 method=cp_full 时爬全量(最多100页)。百度爬取间隔30秒,软通1秒,体现了对不同网站反爬强度的针对性处理。


项目分区导航xingye_proc ⬅️ | 00-auto_api | ➡️ baidu_data_proc_api