概述
在爬取国家企业信用信息公示系统时,主要面临双重挑战:一是动态生成的 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. 验证码处理
当触发极验验证时,流程如下:
- 访问验证码接口获取
gt和challenge参数。 - 将参数发送至第三方打码平台(如 2captcha),获取任务 ID。
- 等待平台返回解算结果(通常需 15-20 秒),获取
geetest_validate等凭证。 - 携带凭证访问验证接口,获取
token值。
3. 数据请求与解析
使用上述所有参数及 Cookie 构造列表页请求,解析详情页 URL 后发起最终请求,即可获取企业工商信息。
运行日志参考
1.设置 cookie 成功:1599319589.733|-1|tig5%2FrcdXMP5mCDrEIz6sGfxgDo%3D
2.更新 cookie 成功:1599319589.99|0|pZbcb9vKT%2FaYREOJJrcpgCyXgMU%3D
3.Set-Cookie 成功 (JSESSIONID, SECTOKEN, tlb_cookie)
4.获取 gt, challenge 成功:{"success":1,"challenge":"de9f8bb4499c6581b74b4e7b5f7863cd","gt":"62756445cd524543f5a16418cd920ffd"}
5.发送 2captcha 成功,获取 task_id: OK|64672632650
6.按照 2captcha 官方要求,需要等待 15-20s, 等待中...
7.OK|{"geetest_challenge":"de9f8bb4499c6581b74b4e7b5f7863cd","geetest_validate":"f5807eb51dedb1d73b","geetest_seccode":"f5807eb51dedb1d73b|jordan"}
8.获取 token 成功:34898487
9.详情页 URL 生成完毕
10.解析结果示例:{'credit_code': '91110000802100433B', 'company_name': '北京百度网讯科技有限公司', ...}
总结
该系统的核心难点在于每次搜索都接入了极验验证码,且伴随复杂的 Cookie 校验。如果去硬刚破解 JS 耗时耗力,这里我们直接使用了第三方的打码平台来辅助验证。以上流程仅供参考,实际应用中需注意频率控制与合规性。

