You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带动态登录参数与CAPTCHA的网站数据爬取问题求助

解决登录验证中的动态参数与CAPTCHA问题

一、处理动态加密参数

1. 直接复用前端JS加密逻辑

把页面里的加密函数扣出来保存成JS文件,用Python的execjs调用执行,不用自己翻译算法。比如页面里有生成密码哈希的函数,直接拿过来用就行,适合快速实现。

2. 逆向JS逻辑用Python重写

如果JS加密逻辑不复杂(比如AES、SHA系列哈希),直接把JS代码翻译成Python代码,用pycryptodome这类加密库实现,避免依赖JS运行环境,稳定性更高。

3. 浏览器自动化绕开加密处理

用Playwright或Selenium模拟真实浏览器操作,让浏览器自动执行页面JS生成所有动态参数,不用关心加密细节,适合复杂的JS加密场景。

二、CAPTCHA解决方案

1. 人工介入(低成本小量需求)

如果爬取频率不高,遇到验证码时暂停脚本,手动输入后继续,或者找兼职人员处理,比付费打码服务划算。

2. 本地OCR识别简单验证码

针对数字、字母组成的简单图形验证码,用pytesseract结合OpenCV做图像预处理(二值化、降噪),免费且能满足基础需求。

3. 优化爬取策略减少验证码触发

降低请求频率,模拟真实用户的操作间隔(比如每次请求后sleep 2-3秒),用固定session保持Cookie,避免频繁触发网站的反爬机制。

三、代码示例

示例1:用execjs处理JS加密+本地OCR识别验证码

# 先安装依赖
pip install PyExecJS requests pytesseract pillow opencv-python

保存页面中的加密JS到encrypt.js:

function encryptUsername(user) {
    // 示例:用户名拼接时间戳后base64编码
    return btoa(user + Date.now());
}

function encryptPassword(pass, salt) {
    // 示例:密码加盐后SHA256哈希
    return CryptoJS.SHA256(pass + salt).toString();
}

Python脚本:

import execjs
import requests
import re
from PIL import Image
import pytesseract

# 加载JS加密逻辑
with open('encrypt.js', 'r', encoding='utf-8') as f:
    js_code = f.read()
ctx = execjs.compile(js_code)

session = requests.Session()

# 访问登录页,获取salt和csrf_token
login_page = session.get('https://example.com/login')
salt = re.search(r'"salt":"(.*?)"', login_page.text).group(1)
csrf_token = re.search(r'name="csrf_token" value="(.*?)"', login_page.text).group(1)

# 生成加密后的账号密码
username = 'your_username'
encrypted_user = ctx.call('encryptUsername', username)
password = 'your_password'
encrypted_pass = ctx.call('encryptPassword', password, salt)

# 下载验证码并识别
captcha_res = session.get('https://example.com/captcha')
with open('captcha.png', 'wb') as f:
    f.write(captcha_res.content)

# 图像预处理+OCR识别
img = Image.open('captcha.png').convert('L')
img = img.point(lambda x: 0 if x < 128 else 255, '1')
captcha_code = pytesseract.image_to_string(img).strip()

# 构造登录请求数据
login_data = {
    'username': encrypted_user,
    'password': encrypted_pass,
    'csrf_token': csrf_token,
    'captcha': captcha_code
}

# 发送登录请求
login_res = session.post('https://example.com/login', data=login_data)

# 登录成功后获取目标数据
if login_res.ok:
    data_res = session.get('https://example.com/data')
    print(data_res.text)

示例2:用Playwright自动化处理加密+人工输入验证码

# 安装依赖
pip install playwright
playwright install chromium

Python脚本:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 启动可视化浏览器,方便手动输入验证码
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    
    # 打开登录页
    page.goto('https://example.com/login')
    
    # 输入账号密码(浏览器自动执行JS加密)
    page.fill('input[name="username"]', 'your_username')
    page.fill('input[name="password"]', 'your_password')
    
    # 等待用户手动输入验证码
    print("请在浏览器中输入验证码,完成后按回车继续...")
    input()
    
    # 点击登录按钮
    page.click('button[type="submit"]')
    
    # 等待登录跳转完成
    page.wait_for_url('https://example.com/dashboard')
    
    # 访问目标数据页面
    page.goto('https://example.com/data')
    print(page.content())
    
    browser.close()

四、工具库推荐

  • 加密处理:execjs(快速调用JS)、pycryptodome(Python实现加密算法)
  • 浏览器自动化:Playwright(比Selenium更轻量、稳定)、Selenium(兼容性好)
  • 验证码识别:pytesseract(基础OCR)、opencv-python(图像预处理)
  • HTTP请求:requests(基础同步请求)、httpx(支持异步)

内容的提问来源于stack exchange,提问作者Prashant Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:20:03