auto_on_response
这是针对兴业银行招聘网站的专项爬虫模块,采用了一种特殊的网络请求拦截方式来获取数据,而不是解析 HTML。
为什么要拦截网络请求
兴业银行的招聘页面是前后端分离的 SPA(单页应用),职位数据通过 Ajax 请求从接口 https://job.cib.com.cn/ersApi/recruitposition/portalPage 动态加载,页面 HTML 里根本没有职位内容。用之前 gen_000xx.py 那套解析 HTML 的方式行不通,所以改为直接拦截浏览器发出的 API 响应,拿到原始 JSON 数据。
两个文件的分工
main_proc 是入口路由,根据 _key(公司编号)决定调用哪个专项处理函数。目前只有 com_91000(兴业银行)一个分支,后续新增其他特殊公司时在这里加 elif 即可。
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 字段拼成 <div>职位名 xxx</div> 这样的伪 HTML,让数据能平滑地进入已有流水线,避免为一家公司专门改动核心处理逻辑。
与通用模块的对比
通用路径(大多数公司) 兴业银行专项路径
│ │
页面渲染完成 注册响应拦截器
│ │
取 HTML 内容 浏览器发出 Ajax 请求
│ │
gen_000xx.py 解析 response_handler 捕获
│ │
提取职位列表 直接拿到 JSON 数据
│ │
└──────────── 统一字段格式 ─────────────┘
│
后续解析流水线
项目分区导航:page_00001 ⬅️ | 00-auto_on_response | ➡️ main_proc
💬 评论