--- title: "00-auto_on_response" created: 2026-04-02 tags: - 项目 aliases: - auto_on_response --- # auto_on_response > 这是针对**兴业银行招聘网站**的专项爬虫模块,采用了一种特殊的**网络请求拦截**方式来获取数据,而不是解析 HTML。 --- ## 为什么要拦截网络请求 兴业银行的招聘页面是前后端分离的 SPA(单页应用),职位数据通过 Ajax 请求从接口 `https://job.cib.com.cn/ersApi/recruitposition/portalPage` 动态加载,页面 HTML 里根本没有职位内容。用之前 `gen_000xx.py` 那套解析 HTML 的方式行不通,所以改为直接拦截浏览器发出的 API 响应,拿到原始 JSON 数据。 --- ## 两个文件的分工 [[01-main_proc|main_proc]] 是入口路由,根据 `_key`(公司编号)决定调用哪个专项处理函数。目前只有 `com_91000`(兴业银行)一个分支,后续新增其他特殊公司时在这里加 `elif` 即可。 [[02-xingye_proc|xingye_proc]] 是兴业银行的具体处理逻辑,分三层: --- ## `xingye_proc.py` 内部三层结构 **第一层** `xingye_proc`**:注册监听 + 翻页控制** 用 Playwright 的 `page.on('response', handler)` 注册一个响应拦截器,然后打开招聘页面 URL,之后循环点击"下一页"按钮,每次翻页等待 30 秒(给 Ajax 请求留出时间)。翻页上限默认 3 页,如果配置了 `method=cp_full` 则爬取全部(最多 100 页)。 **第二层** `response_handler`**:过滤响应 + 触发解析** 每次浏览器收到任何网络响应都会触发这个函数,但只处理目标 API 接口的响应。确认 `message == '成功'` 后,遍历返回的职位列表,逐条交给第三层处理。 **第三层** `xingye_json`**:数据转换 + 落盘** 把接口返回的原始字段(`positionName`、`publishTime`、`departmentDesc` 等)映射成系统统一的字段格式(`announcement_name`、`publish_time`、`hd_dept` 等),同时用 `generate_html` 把结构化数据拼成一段伪 HTML 文本,写入 `.html` 文件——这样后续的 `ann_md.py` → `ann_model.py` 解析流水线就可以无缝复用,不需要为这家银行单独适配。 --- ## 关键设计点 `generate_html` 这个函数值得单独说一下。接口返回的是干净的 JSON,本来不需要转成 HTML,但整个系统后续的解析链路(`Html2txt` → 大模型)都是以 HTML/纯文本为输入设计的。所以这里故意把 JSON 字段拼成 `