概述
在爬取国家企业信用信息公示系统时,主要面临双重挑战:一是动态生成的 Cookie 校验机制(__jsluid_h, __jsl_clearance),二是随机出现的极验验证码(滑动或点选)。直接硬刚破解 JS 耗时较长,本方案采用分步模拟浏览器行为结合第三方打码平台的方式实现稳定抓取。
核心流程分析
1. Cookie 链初始化
网站通过多次访问建立信任会话,需按顺序完成以下三步:
- 首次访问首页,获取
__jsluid_h及响应生成的__jsl_clearance。 - 二次访问首页,更新
__jsl_clearance。此步骤涉及混淆的 JS 执行,建议先还原代码调试,再改写逻辑。 - 三次访问,确保
JSESSIONID、SECTOKEN及tlb_cookie等关键 Session 信息写入。
以下是更新 __jsl_clearance 的关键 Python 代码片段,利用 execjs 在本地模拟 Node.js 环境执行清理脚本:
import re
import execjs
def update_jsl_clearance(s, url):
resp = s.get(url)
js_pre = """ var document = {}; var location = {pathname:"pathname", search:"search"}; function getCookie(func, time){ func(); }; """
# 提取并清理检测浏览器的相关代码
js_str = js_pre + re.findall('<script>(.+?)</script>', resp.text)[0]
replace_str = re.findall(r'function go.+?var .{7,10}=.{7,10};(.+?)var .{7,10}=new Date', resp.text)[0]
js_str = js_str.replace(replace_str, '')
# 替换 setTimeout 防止执行失败
js_str = js_str.replace('setTimeout', 'getCookie')
ctx = execjs.compile(js_str)
__jsl_clearance = ctx.eval('document.cookie')
__jsl_clearance = re.findall('__jsl_clearance=(.+?);Max', __jsl_clearance)[0]
s.cookies.set('__jsl_clearance', __jsl_clearance)
print(f'更新 cookie 成功:{__jsl_clearance}')
2. 验证码处理
当触发极验验证时,流程如下:

