Python中如何解决拥有加密表单的爬虫问题

欧专局: 在每次查询的时候都会运行 check提供需求页面的 cookie 的 browser.presence 项

需求页面: 欧专局专利

check 表单截图如下: check


Python中如何解决拥有加密表单的爬虫问题

10 回复

要爬取有加密表单的网站,关键在于逆向分析前端加密逻辑。通常需要三步:

  1. 定位加密函数:在浏览器开发者工具中搜索encryptsignpassword等关键词,找到表单提交前的加密代码
  2. 分析加密参数:常见的加密方式包括RSA公钥加密、AES加密、或自定义的JavaScript混淆加密
  3. 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)

如果遇到更复杂的混淆加密,可能需要用seleniumplaywright直接执行浏览器环境中的加密函数。关键是要耐心分析网络请求,找到真正的加密入口点。

总结:逆向分析前端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 &lt; i.length; t++)<br> n = i[t],<br> r[a + n] ? a += n : (o.push(a.length &gt; 1 ? r[a] : a.charCodeAt(0)),<br> r[a + n] = s,<br> s++,<br> a = n);<br> for (o.push(a.length &gt; 1 ? r[a] : a.charCodeAt(0)),<br> t = 0; t &lt; 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 只能用一次啊,但是用浏览器进入抓取页面会过段时间才会失效,应该不是这个原因。对于隐藏表单和蜜罐肯定是不可能的。我能想到得到的招都用了,若有时间的话还望不吝赐教。

回到顶部