不使用Selenium时Python终端爬虫如何完成验证码校验访问站点
RARBG爬虫验证码校验实现方案
问题说明
开发终端网页爬虫访问目标种子站点时,直接发起搜索页请求会被重定向到威胁检测页面,需要完成页面内置的基础验证码校验后才能正常访问资源内容,初始实现代码如下:
import requests from bs4 import BeautifulSoup response = requests.get("https://rarbg.to/torrents.php?search=some+show") soup = BeautifulSoup(response.text, features='html.parser') # 操作soup对象,在终端向用户展示所有可获取的种子资源
核心实现逻辑
整个流程的关键是维持同一会话上下文,验证码校验状态是通过Cookie绑定到对应会话的,零散的独立请求无法通过校验,具体步骤如下:
- 初始化
requests.Session()实例,所有请求都通过该实例发起,自动留存校验通过后下发的Cookie - 首次发起搜索页请求,会话会自动跳转到威胁校验页,从返回的HTML中解析出两个核心内容:验证码图片的相对路径、校验表单的所有隐藏参数字段(一般是防跨站的校验token,漏传会直接校验失败)
- 通过会话请求验证码图片的二进制内容,用Pillow做图像预处理(转灰度、二值化去除简单噪点,该站点验证码干扰极少,预处理后识别率极高),再搭配pytesseract识别出验证码文本(Pillow本身只做图像处理,不具备OCR识别能力,需要搭配Tesseract引擎使用)
- 构造POST请求,把之前解析到的隐藏表单参数、识别出的验证码文本作为表单数据,提交到校验页的表单处理地址
- 校验通过后,会话会自动留存访问权限Cookie,此时再用同一个会话发起搜索页请求,就能拿到正常的种子列表HTML,后续即可用BeautifulSoup解析内容在终端展示
参考实现代码
import requests from bs4 import BeautifulSoup from PIL import Image import pytesseract import io import time # 初始化会话,替换成正常浏览器的UA避免被直接拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } s = requests.Session() s.headers.update(headers) # 首次访问触发校验跳转 target_url = "https://rarbg.to/torrents.php?search=some+show" defense_resp = s.get(target_url) defense_soup = BeautifulSoup(defense_resp.text, features="html.parser") # 解析表单数据和验证码地址 form = defense_soup.find("form", {"name": "captcha"}) captcha_img_rel = form.find("img")["src"] captcha_img_url = f"https://rarbg.to{captcha_img_rel}" submit_url = f"https://rarbg.to{form['action']}" # 收集所有隐藏表单字段 form_data = {} for hidden_input in form.find_all("input", {"type": "hidden"}): form_data[hidden_input["name"]] = hidden_input["value"] # 获取并识别验证码 captcha_resp = s.get(captcha_img_url) img = Image.open(io.BytesIO(captcha_resp.content)) # 简单二值化预处理提升识别率 img = img.convert("L") threshold = 127 img = img.point(lambda p: p > threshold and 255 or 0) captcha_text = pytesseract.image_to_string(img).strip() form_data["captcha"] = captcha_text # 提交验证码校验 s.post(submit_url, data=form_data) # 短暂延时避免请求过快被拦截 time.sleep(2) # 再次请求目标页即可拿到正常内容 final_resp = s.get(target_url) soup = BeautifulSoup(final_resp.text, features="html.parser") # 后续解析种子列表逻辑写在这里
注意事项
- 本地需要提前安装Tesseract OCR引擎,同时安装对应Python依赖
pytesseract、Pillow - 如果识别准确率不足,可以调整二值化阈值,或者手动加去噪逻辑,该站点验证码字符无扭曲、干扰线极少,基本不需要复杂处理就能达到很高的识别率
- 请求频率不要过高,短时间大量请求会被站点直接封禁IP
内容的提问来源于stack exchange,提问作者Utshaan
相关产品推荐
相关产品推荐

