Python爬虫如何破解JS加密的Cookie
在使用Python进行网站爬取时,经常会遇到JS加密的Cookie。这时就需要使用一些技巧来破解Cookie。下面是Python爬虫如何破解JS加密的Cookie的完整攻略,包括以下几个步骤:
首先,我们需要了解网站的Cookie加密方式。通常,网站采用JS代码动态生成Cookie,然后通过Ajax发送给服务器。这时我们需要分析JS代码来确定Cookie加密算法。
我们可以使用浏览器的开发者工具或者Chrome插件 EditThisCookie
查看cookie的值,然后观察cookie的值是否经过加密处理。如果cookie的值经过了加密处理,那么我们就需要找到加密算法,并使用Python代码实现。
在确定加密算法后,我们需要使用Python模拟请求,获取加密后的Cookie值。通常,我们可以使用 requests
模块来发送请求,然后通过解析响应数据,获取Cookie的值。
得到加密后的Cookie值后,我们需要对Cookie值进行解密。这时,我们需要逆向加密算法,找到加密算法的逆运算。逆向加密算法通常涉及到一些高级技术,例如反汇编、调试器等。
如果加密算法比较简单,我们可以手动逆向加密算法,并编写Python代码实现。如果加密算法比较复杂,我们可以考虑使用 pyv8
库实现JS代码的执行,或者使用 selenium
模拟浏览器操作。
以下是一个示例,我们在获取v2ex.com的Cookie值时,会发现Cookie值经过了一定的加密处理。我们可以查看网站的JS代码,发现加密算法位于 http://www.v2ex.com/app/tpl/
目录下的 index.js
文件中。
具体来说,在 index.js
文件中,通过如下代码加密Cookie值:
var _4 = "";
for (var _5 = 0; _5 < 3; _5++) {
_4 += String.fromCharCode(Math.random() * 26 + "a".charCodeAt(0))
}
var _6 = new Date().getTime();
var _7 = _6 + "" + parseInt(Math.random() * 1000);
var _8 = hex_md5(_7 + _4);
这段代码包含了两个加密操作:生成一个随机字符串,然后使用该随机字符串和当前时间戳拼接生成一个字符串,并对该字符串使用 md5 加密。接着,我们可以编写Python代码模拟请求,获取加密后的Cookie值:
import requests
url = 'http://www.v2ex.com/'
# 模拟请求,获取cookie
session = requests.session()
response = session.get(url)
cookie = response.cookies.get_dict()
cookie_value = cookie['2fm']
这里,我们使用了 requests
库模拟请求,获取Cookie值。从响应中获取的Cookie值是经过加密处理的。接着,我们可以解密Cookie值:
import hashlib
# 解密cookie
ts = cookie_value[:13]
nonce = cookie_value[13:16]
sig = cookie_value[16:]
reverse_sig = sig[::-1]
reverse_nonce = nonce[::-1]
sig_value = reverse_sig[:10] + reverse_nonce + reverse_sig[10:]
hash_value2 = hashlib.md5()
hash_value2.update(ts.encode())
hash_value2.update(bytes.fromhex(sig_value))
cookie_value_decrypted = f'{ts}{nonce}{hash_value2.hexdigest()}'
print(cookie_value_decrypted)
这里,我们首先从加密后的Cookie值中,提取出时间戳、随机字符串和加密字符串。接着,我们根据加密算法,进行逆向操作,将加密字符串进行解密。最后,我们得到了解密后的Cookie值。
以下是另一个示例,我们在获取zhihu.com的Cookie值时,会发现Cookie值同样经过了加密处理。不同的是,我们需要使用JS代码实现逆向加密算法。
具体来说,在获取zhihu.com的Cookie值时,我们可以模拟登录操作,并附带Cookie信息。在登录成功后,我们可以通过Chrome开发工具查看Cookie。查看Cookie时我们会看到Cookie的值包含了一个 _zap
前缀,该前缀是加密后的字符串。接着,我们可以从zhihu.com的JS代码中找到加密算法。
以下是zhihu.com的加密算法:
window.btoa(unescape(encodeURIComponent(JSON.stringify({data: "encrypted_data"}))))
该加密算法使用了 window.btoa()
进行Base64编码,然后使用 unescape()
对编码值进行解码。Base64编码的数据里面包含了 encrypted_data
,是实际的Cookie值。
我们可以使用 PyV8
库来实现JS代码的执行,也可以使用 selenium
模拟浏览器操作来实现JS代码的执行,接着获取加密后的Cookie值,并进行解密。具体实现方法可以参考如下代码:
import requests
import execjs
import json
url = 'https://www.zhihu.com/signin'
# 模拟登录
session = requests.session()
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
})
response = session.get(url)
# 执行JS代码
js = response.text
ctx = execjs.compile(js)
encrypted_data = ctx.eval('window.btoa(unescape(encodeURIComponent(JSON.stringify({data: "encrypted_data"})))))')
# 解密
cookie_value = f'_zap={encrypted_data}'
decoded_data = base64.b64decode(cookie_value[5:])
json_data = json.loads(decoded_data)
cookie_value_decrypted = json_data.get('data', '')
print(cookie_value_decrypted)
在上面的代码中,我们在模拟登录之后,执行JavaScript代码获得加密后的Cookie值,并使用 base64.b64decode()
对加密数据进行解码。在解码后的数据中提取出 encrypted_data
,这就是实际的Cookie值。最后,我们对该值进行解密,得到了解密后的Cookie值。
总之,Python爬虫如何破解JS加密的Cookie,需要熟练掌握JS加密算法、逆向算法和Python模拟请求等技术。在实践中,需要根据实际情况进行实现和优化。