在编写Python爬虫的过程中,目标网站常常把关键的请求参数生成逻辑写进一段被混淆过的JavaScript代码里。这类代码往往通过字符串拼接、十六进制编码、_eval_动态执行等方式隐藏真实算法,导致我们直接用requests库请求接口时拿不到正确的签名或token。要稳定获取数据,就必须理解混淆代码的执行机制,并在Python环境中还原或调用它。

JavaScript混淆的常见形式与底层原理
最常见的混淆手法是将原始函数名和字符串全部替换成无意义短名,再用数组存放字面量,通过下标访问。例如一段代码可能先定义var _0xabc = ['log', 'user', 'token'],随后用_0xabc[2]代替原来的token字符串。这种手段不改变逻辑,只是提高人工阅读成本。更深一层的混淆会使用eval或Function构造器执行由十六进制转成的字符串,只有在运行时才还原出真实代码。
从底层看,浏览器加载这类脚本后会按ECMAScript标准正常解析执行,混淆并没有加密只是干扰阅读。因此只要能在Python里拿到同一段源码,并用具备JS执行能力的引擎跑起来,就能得到和浏览器一致的参数。理解这一点非常关键:我们不必逐行破译混淆,而是借助执行环境“借壳生蛋”。
另外还有一些网站会插入死代码、控制流平坦化,把顺序执行打散成switch结构。这类情况如果纯靠正则抠函数会很痛苦,此时逆向工具的价值就体现出来了。但无论哪种混淆,最终目的都是延迟或隐藏核心算法,只要定位到生成请求参数的那个出口函数,问题就解决了一大半。
用正则表达式在Python中提取与还原混淆逻辑
当混淆程度较轻时,正则是最快的切入方式。比如我们看到页面里有一段_0x12ab('0x1')这样的调用,可以先把定义字符串数组的语句抓出来,用Python的re模块匹配vars+_w+s*=s*[([^]]+)],把数组内容解析成列表,再写一个小替换函数把_0x12ab('0x1')映射成真实字符串。
下面给出一个简单的处理示例,演示如何提取数组并还原调用:
import re
js_code = """
var _0xa = ['secret', 'token', 'get'];
function h(i){ return _0xa[i]; }
"""
# 提取数组
m = re.search(r"vars+(_0xw+)s*=s*[([^]]+)]", js_code)
arr_name = m.group(1)
items = re.findall(r"'([^']+)'", m.group(2))
mapping = {str(i): items[i] for i in range(len(items))}
# 还原 h(0) 之类的调用
call = "h(1)"
idx = re.search(r"h((d+))", call).group(1)
print(mapping.get(idx)) # 输出 token
这种方法的优势是轻量、不依赖外部运行时,适合参数生成逻辑固定在明文数组中的场景。但它有明显短板:一旦混淆使用了eval(hex)或者动态解密,正则就无能为力,因为目标字符串在执行前根本不存在于源码文本里。
因此实际项目中,正则通常用来做“定位”和“辅助提取”,比如快速找到包含sign、token字样的函数边界,而不是完整还原算法。配合后面说的执行引擎,效率会高很多。
借助逆向工具与JS运行环境完成完整解析
对于重度混淆,推荐在Python中调用execjs或pyexecjs库,把整段JS交给Node.js执行。我们首先用requests把脚本下载到本地,稍作修补(比如补一个window或document的空对象),然后用execjs.compile加载,直接调用暴露出的参数生成函数。
示例代码如下,假设远程JS里有一个genToken(p)函数:
import execjs
import requests
script = requests.get('https://ipipp.com/assets/confused.js').text
# 修补浏览器全局对象
script = "var window={};var document={};" + script
ctx = execjs.compile(script)
token = ctx.call('genToken', 'testuser')
print(token)
如果目标网站检测Node环境,还可以用puppeteer或playwright启动真实浏览器,在页面上下文里拿到参数后再传回Python。这类逆向工具虽然资源占用大,但几乎能通杀所有混淆与反调试。选择正则还是引擎,取决于混淆强度和爬取规模:小规模轻混淆用正则快,大规模强混淆用执行环境稳。
最后提醒,无论用哪种方式,都应注意目标网站的robots与法律边界,把请求频率控制在合理范围。把解析出的参数用于正常数据采集,而非突破付费墙或滥用接口,才能让爬虫项目长期稳定运行。
Python爬虫JavaScript混淆逆向工具修改时间:2026-08-18 00:34:35