Python中如何解决拥有加密表单的爬虫问题
要爬取有加密表单的网站,关键在于逆向分析前端加密逻辑。通常需要三步:
- 定位加密函数:在浏览器开发者工具中搜索
encrypt、sign、password等关键词,找到表单提交前的加密代码 - 分析加密参数:常见的加密方式包括RSA公钥加密、AES加密、或自定义的JavaScript混淆加密
- Python实现:根据分析结果用Python重现加密逻辑
这里有个典型例子,假设网站用RSA加密密码:
import execjs
import requests
# 方法1:使用execjs执行JavaScript加密函数
def encrypt_with_js(password, public_key):
with open('encrypt.js', 'r', encoding='utf-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
encrypted = ctx.call('rsaEncrypt', password, public_key)
return encrypted
# 方法2:纯Python实现(如果分析出算法)
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
def rsa_encrypt_python(password, public_key_str):
# 加载公钥
public_key = RSA.import_key(public_key_str)
cipher = PKCS1_v1_5.new(public_key)
# 加密并base64编码
encrypted = cipher.encrypt(password.encode())
return base64.b64encode(encrypted).decode()
# 实际爬虫中使用
session = requests.Session()
# 先获取登录页,提取公钥和加密参数
login_page = session.get('https://example.com/login')
# 这里需要解析页面中的公钥和加密参数(通常隐藏在JS变量或meta标签中)
# 加密密码
encrypted_password = rsa_encrypt_python('your_password', '公钥字符串')
# 提交表单
payload = {
'username': 'your_username',
'password': encrypted_password,
# 可能还有其他加密参数如timestamp、sign等
}
response = session.post('https://example.com/login', data=payload)
如果遇到更复杂的混淆加密,可能需要用selenium或playwright直接执行浏览器环境中的加密函数。关键是要耐心分析网络请求,找到真正的加密入口点。
总结:逆向分析前端JS是核心。
selenium? chromedriver?
能不能通过破解 js 来解决问题啊,个人不太喜欢用 selenium 之类的
events 是鼠标在页面里停留的位置和时间 fp 可以直接随机生成一下 ts 和 nts 是时间戳不用说了吧
"{“a”:{“ts”:1520152823,“events”:[{“ts”:73,“t”:“mm”,“x”:101,“y”:27},{“ts”:73,“t”:“mm”,“x”:103,“y”:10},{“ts”:73,“t”:“mm”,“x”:103,“y”:4}…]},“fp”:“4dba123c2b5b2e4f123a5c936aabcd”,“nts”:1520152978}"
加密部分:<br>t.encode = function(e){<br> var t, n, r = {}, i = (e + "").split(""), o = [], a = i[0], s = 256;<br> for (t = 1; t < i.length; t++)<br> n = i[t],<br> r[a + n] ? a += n : (o.push(a.length > 1 ? r[a] : a.charCodeAt(0)),<br> r[a + n] = s,<br> s++,<br> a = n);<br> for (o.push(a.length > 1 ? r[a] : a.charCodeAt(0)),<br> t = 0; t < o.length; t++)<br> o[t] = String.fromCharCode(o[t]);<br> return o.join("")<br>}<br>
谢谢大神,我如何才能和你一样秀,我找到了这个 js 代码
https://worldwide.espacenet.com/hdl/js/hdl.js?date=04-03-2018
其中有一段代码:
return this.ajax({type:“POST”,url:t.getUrl(t.host+"/check"),data:{data:l.encode(JSON.stringify({a:e,fp:this.fingerprint,nts:u.getNow()}))}}).
这个有用吗?如果有用我改如何继续研究呢?求解答!
这段就是个 ajax 请求啊。。没啥用 自己实现请求部分就好了
谢谢:),再厚着脸皮问一下,fp 是通过 js 的 fingerprint 随机生成的吗?还有就是这个表单的未加密前的模样是怎么判断出来的啊,我找了许久都没找到。
ajax 部分不是有嘛,下个断点在 encode 那就看得到了
fp 是 js 生成的浏览器指纹,爬他不用管这个,直接随机一个发过去就行
表单已经合成,谢谢了。虽然我抓取网站还是没有成功( 302 跳转),headers,cookies,各项合成之后还是会跳转,是不是合成的 cookies 只能用一次啊,但是用浏览器进入抓取页面会过段时间才会失效,应该不是这个原因。对于隐藏表单和蜜罐肯定是不可能的。我能想到得到的招都用了,若有时间的话还望不吝赐教。


