如何使用 Scrapy 绕过验证码
在本指南中,我将向你展示在使用 Scrapy 时如何处理验证码。我将向你介绍我用来绕过验证码的方法,这样你就可以保持你的刮擦器顺利运行,而不会不断受到干扰。
什么是验证码?
CAPTCHA 是 "区分计算机和人类的完全自动化公共图灵测试 "的缩写。简单地说,它是一种用于分辨访客是人类还是机器人的测试。
验证码类型包括
- 图像选择测试(选择所有有汽车的方格)。
- 文字谜题(输入您看到的字母)。
- Google 的 reCAPTCHA(“我不是机器人”复选框)。
- 隐形验证码(在后台运行,悄无声息地阻止机器人)。
Scrapy 抓取程序为何会被阻止
Scrapy 既高效又快速。但这也是一个问题。机器人经常会快速发出许多请求。服务器会检测到这些模式并激活验证码。
以下是 Scrapy 刮刮卡面临验证码的一些原因:
- 来自同一 IP 地址的重复访问。
- 没有正确的浏览器标头。
- 请求提出得太快。
- 缺少 JavaScript 执行。
现在,让我们来探讨如何在使用 Scrapy 时打败验证码。
方法 1:使用网络抓取 API
绕过验证码的最简单方法是使用刮擦 API。这些 API 可以为你处理代理、验证码和 JavaScript 渲染等一切问题。
什么是网络抓取 API?
这是一项为您获取数据的服务。您只需发送目标 URL,API 就会在您通过验证码并避开拦截后为您提供页面数据。
如何使用
- 发送带有目标 URL 的请求。
- 应用程序接口处理所有僵尸保护。
- 您将收到简洁的 HTML 内容。
最佳工具
下面是一些顶级刮削 API:
- Bright Data
- ScraperAPI
- Smartproxy
- Oxylabs
- Apify
Bright Data 示例
让我们来看看如何用 Scrapy 使用 Bright Data。
步骤 1:注册 Bright Data
访问他们的网站并创建账户。获取 API 凭据。
步骤 2:发送申请
import scrapy
import requests
class APISpider(scrapy.Spider):
name = api_spider
def start_requests(self):
url = "https://target-website.com"
proxy_url = f "https://brd.superproxy.io:22225"
response = requests.get(
"https://example-api.brightdata.com",
params={"url": url、 "render": "true"},
auth=('username', `密码`) # 替换为您的应用程序接口凭据
)
yield scrapy.http.HtmlResponse(
url=url、
body=response.text、
编码'utf-8'
)
这种方法既快捷又能避免大多数验证码。
方法 2:使用验证码解决服务
绕过验证码的另一种方法是使用 解决服务.这些服务使用人工或人工智能为您解决验证码问题。
热门解决方案服务
- Bright Data 的验证码解码器
- 2Captcha
- 反验证码
- 验证码之死
- CapMonster
这些平台会给你一个 API 密钥。你向他们发送验证码,他们会返回答案。
使用 2Captcha 的示例
让我们用 Scrapy 解决 2Captcha 的 reCAPTCHA 问题。
第 1 步:安装图书馆
pip install 2captcha-python
第 2 步:获取 API 密钥
在 2Captcha 上注册,然后从仪表板上复制您的 API 密钥。
步骤 3:带有验证码解码器的 Scrapy 蜘蛛
import scrapy
from twocaptcha import TwoCaptcha
class 验证码蜘蛛(scrapy.Spider):
name = 验证码蜘蛛
start_urls = ["https://site-with-captcha.com"]
def solve_captcha(self、site_key、url):
solver = TwoCaptcha(YOUR_API_KEY)
try:
result = solver.recaptcha(sitekey=site_key, url=url)
return result.get(代码)
except Exception as e:
self.logger.error(f "验证码输入错误: {e}")
return None
def parse(自我, 响应):
site_key = "site_key_from_html"
captcha_code = self.solve_captcha(site_key, response.url)
if captcha_code:
self.logger.info("验证码已解决!")
# 使用验证码继续扫描
这种方法适用于使用 reCAPTCHA 的表单和登录页面。
方法 3:轮流使用高级代理服务器
避免验证码的聪明方法是使用不同的 IP 地址。这样可以隐藏机器人的身份,减少点击验证码的机会。
什么是旋转代理?
轮流代理 每次请求都会给你一个新的 IP 地址。它们可以防止网站检测到刮擦模式。
代理类型
在 Scrapy 中使用代理
编辑 Scrapy 设置文件 (settings.py) 并添加代理设置。
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1、
'myproject.middlewares.RandomProxy':100,
}
PROXY_LIST = [
"http://user:pass@ip1:port",
"http://user:pass@ip2:port",
# 添加更多代理9
]
然后创建一个中间件,随机选择一个代理。
import random
class 随机代理:
def process_request(自我、请求、蜘蛛):
proxy = random.choice(spider.settings.get(PROXY_LIST))
request.meta['proxy'] = 代理
这样可以轮换使用代理服务器,减少面对验证码的机会。
方法 4:使用无头浏览器
有时,仅靠 Scrapy 无法应对大量依赖 JavaScript 的网站。有些 CAPTCHA 也是通过 JavaScript 加载的,不能直接处理。
要解决这个问题,可以使用无头浏览器,如
- Selenium
- Playwright
- Splash (用于 Scrapy)
将 Splash 与 Scrapy 结合使用
Splash 是专为 Scrapy 构建的 JavaScript 渲染服务。
步骤 1:安装 Splash
你可以用 Docker 运行它:
docker run -p 8050:8050 scrapinghub/splash
步骤 2:添加中间件
在 settings.py 中
DOWNLOADER_MIDDLEWARES.update({)
'scrapy_splash.SplashCookiesMiddleware': 723,
Scrapy_splash.SplashMiddleware: 725,
})
SPIDER_MIDDLEWARES.update({
'scrapy_splash.SplashDeduplicateArgsMiddleware':100,
})
dupefilter_class = 'scrapy_splash.SplashAwareDupeFilter'
httpcache_storage = 'scrapy_splash.SplashAwareFSCacheStorage'(SplashAwareFSCache存储)。
步骤 3:使用 SplashRequest
from scrapy_splash import SplashRequest
class JSPageSpider(scrapy.Spider):
name = js_page
start_urls = ['https://example-js-page.com']
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse, args={'wait': 2})
避免验证码的最佳做法
即使没有高级工具,您也可以通过一些简单的方法来避免验证码:
1.使用用户代理标题
始终使用真实的浏览器标题,让自己看起来像正常用户。
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
2.放慢请求速度
在请求之间增加延迟时间,以免引起怀疑。
下载延迟 = 2
3.使用 Cookie
刮擦时保存并重复使用会话 cookie。这将使您的机器人看起来始终如一。
4.使用 Referer 和 Accept 标头
添加标题以模仿真实的浏览器行为。
您应该选择哪种方法?

最终想法
验证码无处不在,而且越来越智能。但你不必放弃 Scrapy 项目。有了正确的工具和方法,你几乎可以绕过任何验证码。
为方便起见使用应用程序接口,必要时使用求解器,轮流使用代理以保持匿名性,并始终通过标头和延迟来模仿人类行为。
有了工具包中的这些工具,您就可以安全高效地进行刮削。

