将 Cloudscraper 与 Scrapy 集成

如何将 Cloudscraper 与 Scrapy 整合?

当我需要绕过 Cloudflare 的反僵尸措施时,尤其是当他们阻止我的刮擦活动时,Cloudscraper 是我的首选工具。另一方面,Scrapy 是一个非常强大的 Python 框架,我用它来自动从网站中提取数据。通过将 Cloudscraper 与 Scrapy 相结合,我甚至可以处理那些有强大 Cloudflare 保护的棘手网站,从而使搜刮过程更可靠、更有效。这是在刮擦和面对这类障碍时的一种实用方法。

什么是Cloudscraper?

Cloudscraper 是一个 Python 模块,可以绕过反僵尸机制,特别是 Cloudflare 使用的机制。Cloudflare 因提供 DDoS 保护和 Web 应用程序防火墙(WAF)等安全服务而广为人知,这些服务可以阻止僵尸程序搜索网站。Cloudscraper 本质上是模拟浏览器请求,欺骗 Cloudflare,让 Cloudflare 以为它在与真实用户而不是脚本打交道。

Scrapy 如何融入其中?

Scrapy 是 Python 功能最强大、应用最广泛的网络搜索框架之一。它能快速、高效地处理大规模刮擦,其模块化方法允许根据不同的项目需求进行定制。不过,Scrapy 难以应对复杂的反僵尸措施,因此将其与 Cloudscraper 搭配使用,对于搜索受 Cloudflare 保护的网站至关重要。

使用 Scrapy 设置 Cloudscraper

要开始在 Scrapy 项目中使用 Cloudscraper,请按照以下步骤操作:

第 1 步:安装必要的程序库

开始之前,请确保您已安装 Scrapy 和 Cloudscraper:

pip install scrapy cloudscraper

Cloudscraper 取代了 Python 的请求库,可以绕过常见的安全挑战。Scrapy 则负责管理请求处理和数据提取。

步骤 2:创建 Scrapy 蜘蛛

要集成 Cloudscraper,首先要创建 Scrapy 蜘蛛,它是 Scrapy 搜索过程的核心。下面是一个最简单的示例:

import scrapy
class CloudScraperSpider(scrapy.Spider):
name = 'cloudscraper_spider'
start_urls = ['https://example.com']
def parse(self, response):
# Parsing logic here
yield {
'title': response.css('title::text').get()、
}

步骤 3:在 Scrapy 中使用 Cloudscraper

要在 Scrapy 中使用 Cloudscraper,您需要修改请求机制。Scrapy 本身并不使用请求机制,因此我们需要对其进行定制。具体方法如下

禁用默认 Scrapy 请求:

Scrapy 使用其内置机制直接发送请求。要利用 Cloudscraper,您必须重写这一行为。

通过云霄飞车提出请求:

在 start_requests 或 make_requests_from_url 函数中使用 Cloudscraper:

import cloudscraper
import scrapy
from scrapy.http import HtmlResponse
class CloudScraperSpider(scrapy.Spider):
name = 'cloudscraper_spider'
start_urls = ['https://example.com']
scraper = cloudscraper.create_scraper() # Initialize cloudscraper
def start_requests(self):
for url in self.start_urls.html_content = self.scraper.get(url.content)
html_content = self.scraper.get(url).content
response = HtmlResponse(url=url,body=html_content,encoding='utf-8')
yield self.parse(response)
def parse(self, response):
# Extract data
yield {
'title': response.css('title::text').get()、
}

在上面的例子中

  • 云霄飞车初始化:
    使用 cloudscraper.create_scraper() 初始化刮板。
  • 优先请求:
    不允许 Scrapy 处理请求,而是使用 Cloudscraper 提出请求,并手动创建 HtmlResponse 对象。这样,从 Cloudscraper 获取的内容就能在 Scrapy 框架内无缝使用。

步骤 4:管理费率限制和旁路

Cloudflare 通常会对刮擦行为进行监控,因此在请求之间实施随机延迟会很有帮助。这可以通过使用 time.sleep() 函数或集成 scray-autounit 等库来实现。

此外,还可以考虑以下策略:

  • 随机用户代理:
    使用 scrapy-user-agents 库为每个请求切换用户代理字符串。
  • 代理管理:
    Cloudflare 可能会根据 IP 地址阻止请求。使用旋转代理有助于减少封禁。

步骤 5:处理动态页面

如果目标网站使用 JavaScript 加载内容,仅靠 Cloudscraper 可能不够,因为它不能呈现 JavaScript。在这种情况下,使用 Selenium 或 Splash 等其他工具会对 JavaScript 繁重的页面有所帮助。

动态页面处理示例

如果目标页面涉及大量 JavaScript 渲染,可以考虑使用 Selenium:

from selenium import webdriver
from scrapy.http import HtmlResponse
class CloudScraperSpider(scrapy.Spider):
name = 'cloudscraper_spider'
start_urls = ['https://example.com']
def __init__(self):
self.driver = webdriver.Chrome() # Replace with your Selenium WebDriver
def start_requests(self):
for url in self.start_urls:
self.driver.get(url)
html_content = self.driver.page_source
response = HtmlResponse(url=url, body=html_content, encoding='utf-8')
yield self.parse(response)
def closed(self, reason):
self.driver.quit()
def parse(self, response):
# Parsing logic here
yield {
'title': response.css('title::text').get()、
}

结论

将 Cloudscraper 与 Scrapy 相集成,可以很好地搜刮受 Cloudflare 等服务保护的网站。通过调整 Scrapy 的请求流程和使用 Cloudscraper,我可以绕过许多反僵尸系统。重要的是,在搜刮时要记住法律限制,尤其是对于受严格保护的网站。这样的组合能让搜刮更可靠,而添加代理或旋转用户代理等技术则能降低被拦截的风险。

类似文章