带动态登录参数与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
相关产品推荐
相关产品推荐

