如何用Python与requests/requests-html自动化处理JS加密值的页面请求
用Python + requests/requests-html实现无Selenium的加密值生成与页面跳转自动化
核心思路
要完成这个流程,关键是提取页面中生成加密值的JS逻辑,在Python环境中执行该逻辑得到加密值,再携带值请求目标页面,全程无需浏览器模拟。
步骤与实现代码
1. 安装依赖
先确保需要的库已安装:
pip install requests requests-html pyexecjs
注:
pyexecjs需要依赖Node.js环境,请提前安装好Node.js。
2. 加载第一页并提取加密JS代码
用requests-html的会话加载第一页,找到包含加密逻辑的JS代码(可能是页面内的script标签,也可能是外部JS文件):
from requests_html import HTMLSession import execjs # 初始化会话,保持请求上下文 session = HTMLSession() # 加载第一页 page_a_url = "https://your-domain.com/page-a" page_a = session.get(page_a_url) # 提取加密逻辑所在的JS代码 # 情况1:加密函数在页面内的script标签中 js_code = "" for inline_script in page_a.html.xpath('//script[not(@src)]'): # 替换成你找到的加密函数名,比如generateEncryptedKey if 'generateEncryptedValue' in inline_script.text: js_code = inline_script.text break # 情况2:加密函数在外部JS文件中 # js_src = page_a.html.xpath('//script[contains(@src, "encrypt")]/@src')[0] # if not js_src.startswith('http'): # js_src = f"{page_a_url.rsplit('/', 1)[0]}/{js_src}" # js_code = session.get(js_src).text
3. 执行JS生成加密值
用execjs编译并调用加密函数,生成目标值:
# 处理JS中的全局依赖(比如window对象),如果需要的话 js_code = "var window = {};\n" + js_code # 编译JS并调用加密函数 ctx = execjs.compile(js_code) encrypted_value = ctx.call('generateEncryptedValue')
4. 携带加密值请求第二页
用同一个会话发送请求,确保上下文一致:
page_b_url = "https://your-domain.com/page-b" # 根据实际情况选择GET/POST,参数位置可能是URL参数、表单数据或请求头 response = session.get(page_b_url, params={'enc_key': encrypted_value}) # 验证请求结果 print(f"请求状态码: {response.status_code}") print(f"页面内容预览: {response.text[:500]}")
常见问题处理
- JS依赖缺失:如果加密函数依赖其他全局变量或辅助函数,需要把这些依赖代码也一起提取到
js_code中,否则execjs执行会报错。 - 异步加密函数:如果加密逻辑是异步的(比如用Promise),可以把异步逻辑封装成同步函数,或者用execjs的
eval方法处理Promise的then回调。 - 会话一致性:全程使用同一个
HTMLSession实例,避免Cookie或其他请求头不一致导致的验证失败。
内容的提问来源于stack exchange,提问作者Lewis Lee
相关产品推荐
相关产品推荐

