如何为Scrapy设置代理

随着反机器人措施变得越来越流行和棘手,您的爬虫必然会遇到Access denied错误消息。但是,通过代理隐藏您的原始 IP 将帮助您克服这些挑战。

在这个循序渐进的教程中,您将了解有关设置 Scrapy 代理所需的一切知识。

先决条件

Scrapy 需要 Python 3.6 或更高版本,因此请确保已安装它。然后,通过pip install scrapy在终端或命令提示符中键入来安装 Scrapy。

安装完成后,就可以创建一个新的 Scrapy 项目了。为此,导航到您要存储它的目录并运行以下命令替换(ProjectName)为您想要的名称。

scrapy startproject (ProjectName)

导航到项目目录并创建您的蜘蛛,一个用于从目标网站检索数据的 Scrapy 组件。它有两个参数:名称和目标 URL。

cd (ProjectName)
scrapy genspider (SpiderName) (TargetURL)

假设您要抓取 URL https://www.example.comscraper然后,您需要使用以下命令创建一个名称为 spider 的蜘蛛。

scrapy genspider scraper https://www.example.com

这将生成一个基本代码模板,当您打开蜘蛛时,它应该如下所示:

medium_screenshot_1_fdf7712bcf

如何使用 Scrapy 设置代理

您可以通过添加元参数或创建自定义中间件来设置 Scrapy 代理。让我们探讨这两种方法。

方法一:添加元参数

此方法涉及将您的代理凭证作为方法中的元参数传递scrapy.Request()

获得代理地址和端口号后,使用以下语法将它们传递到 Scrapy 请求中。

yield scrapy.Request(
    url, 
    callback=self.parse, 
    meta={'proxy': 'http://proxy_address:port'}
    )

这是您通过更新蜘蛛得到的:

import scrapy


class ScraperSpider(scrapy.Spider):
    name = "scraper"
    allowed_domains = ["www.example.com"]
    start_urls = ["http://www.example.com/"]
    for url in start_urls:
        yield scrapy.Request(
                url=url,
                callback=self.parse,
                meta={"proxy": "http://proxy_address:port"},
            )

    def parse(self, response):
        pass

现在,替换http://proxy_address:port为您的代理凭据。您可以使用免费的在线代理提供商,例如ProxyNovaFreeProxyList

方法 2:创建自定义中间件

Scrapy 中间件是一个拦截请求的中间层。一旦你指定了一个中间件,每个请求都会自动通过它进行路由。

对于涉及多个蜘蛛的项目来说,这是一个很好的工具,因为它允许您在不编辑或更改实际代码的情况下操纵代理凭据。

proxyMiddleware通过扩展类并将其添加到文件来创建自定义中间件settings.py。这是一个例子:

class CustomProxyMiddleware(object):
    def __init__(self):
        self.proxy = 'http://proxy_address:port'
    
    def process_request(self, request, spider):
        if 'proxy' not in request.meta:
            request.meta['proxy'] = self.proxy
    
    def get_proxy(self):
        return self.proxy

然后,将中间件添加到文件DOWNLOADER_MIDDLEWARE中的设置中settings.py

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomProxyMiddleware': 350,
}

您还可以使用自定义设置在蜘蛛级别添加中间件,您的代码将如下所示:

import scrapy
 
 
class ScraperSpider(scrapy.Spider):
    name = "scraper"
    custom_settings = {
        'DOWNLOADER_MIDDLEWARES': {
            'myproject.middlewares.CustomProxyMiddleware': 350,
        },
    }
 
    def parse(self, response):
        pass

请注意,myproject.middlewares在上面的代码示例中,代表中间件类的完整模块路径。换句话说,该类是在一个名为 的 Scrapy 项目中CustomProxyMiddleware调用的文件中定义的。middlewares.pymyproject

上面代码中的整数是指定中间件执行链的顺序号。订单号350表示您的自定义中间件将在订单号较低的中​​间件之后运行。

元参数和中间件方法都可以带来相同的结果。在本教程中,我们将重点关注第二个,因为它提供了更多控制并使管理代理端点变得更加容易。

类似文章