如何将 Cloudscraper 与 Scrapy 集成?

当我需要绕过 Cloudflare 的反机器人措施时,Cloudscraper 是我的首选工具,尤其是在它们阻止我的抓取活动时。另一方面,Scrapy 是一个非常强大的 Python 框架,我用它来自动从网站提取数据。通过将 Cloudscraper 与 Scrapy 结合使用,我可以处理那些拥有强大 Cloudflare 防护的棘手网站,让抓取过程更加可靠和高效。在抓取并遇到这类障碍时,这是一种实用的方法。

什么是 Cloudscraper?

Cloudscraper 是一个 Python 模块,用于绕过反机器人机制,特别是 Cloudflare 使用的那些机制。Cloudflare 因提供 DDoS 防护和 Web 应用防火墙(WAF)等安全服务而广为人知,这些服务可能会阻止机器人抓取网站。Cloudscraper 本质上会模拟浏览器请求,让 Cloudflare 误以为它面对的是真实用户,而不是脚本。

Scrapy 如何发挥作用?

Scrapy 是 Python 中最强大且使用最广泛的网页抓取框架之一。它能够快速高效地处理大规模抓取,其模块化方式也允许根据不同项目需求进行定制。不过,Scrapy 在应对复杂的反机器人措施时会比较吃力,因此将它与 Cloudscraper 搭配使用,对于抓取受 Cloudflare 保护的网站来说就变得非常重要。

设置 Cloudscraper 与 Scrapy

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

步骤 1:安装必要的库

开始之前,请确保你已经安装了 Scrapy 和 Cloudscraper:

pip install scrapy cloudscraper

Cloudscraper 可以替代 Python 的 requests 库,并能绕过常见的安全挑战。另一方面,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

要将 Cloudscraper 与 Scrapy 一起使用,你需要修改请求机制。Scrapy 原生并不使用 requests,因此我们需要对其进行自定义。方法如下:

禁用默认的 Scrapy 请求

Scrapy 会使用其内置机制直接发送请求。要利用 Cloudscraper,你必须覆盖这种行为。

通过 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']

爬虫工具 = cloudscraper.create_scraper() # Initialize cloudscraper

def start_requests(self):

for url in self.start_urls:

html_content = self.抓取工具.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 初始化
    使用 cloudscraper.create_scraper() 初始化抓取工具。

  • 覆盖请求
    不是让 Scrapy 来处理请求,而是使用 Cloudscraper 发起请求,并手动创建一个 HtmlResponse 对象。这样就可以在 Scrapy 框架中无缝使用从 Cloudscraper 获取的内容。

步骤 4:管理速率限制和绕过策略

Cloudflare 通常会监控抓取行为,因此在请求之间实现随机延迟会很有帮助。可以使用 time.sleep() 函数来完成,也可以集成 scrapy-autounit 等库。

此外,请考虑以下策略:

  • 随机 User Agent
    使用 scrapy-user-agents 库,为每个请求切换不同的 user-agent 字符串。

  • **代理管理:
    **Cloudflare 可能会根据 IP 地址阻止请求。使用动态代理可以帮助降低被封禁的风险。

步骤 5:处理动态页面

如果目标站点使用 JavaScript 加载内容,仅靠 Cloudscraper 可能还不够,因为它不会渲染 JavaScript。在这种情况下,对于 JavaScript 较多的页面,使用 Selenium 或 Splash 等额外工具会很有帮助。

动态页面处理示例

如果目标页面涉及大量 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,我可以绕过许多反机器人系统。进行抓取时,尤其是针对高度受保护的网站,务必要记住法律边界。这种组合能让抓取更加可靠,而添加代理或轮换 user agent 等技术,也能降低被封锁的风险。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐