跳转到主要内容

为Scrapy提供代理轮换

项目描述

scrapy-rotating-proxies

PyPI Version Build Status Code Coverage

此包提供了一个Scrapy中间件,用于使用代理轮换,检查它们是否存活并调整爬取速度。

许可证为MIT。

安装

pip install scrapy-rotating-proxies

用法

ROTATING_PROXY_LIST选项与代理列表一起添加到settings.py

ROTATING_PROXY_LIST = [
    'proxy1.com:8000',
    'proxy2.com:8031',
    # ...
]

作为替代,您可以使用ROTATING_PROXY_LIST_PATH选项指定一个包含代理的文件的路径,每行一个

ROTATING_PROXY_LIST_PATH = '/my/path/proxies.txt'

如果两个选项都存在,则ROTATING_PROXY_LIST_PATH优先于ROTATING_PROXY_LIST

然后添加旋转代理中间件到您的DOWNLOADER_MIDDLEWARES

DOWNLOADER_MIDDLEWARES = {
    # ...
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
    # ...
}

之后,所有请求都将使用ROTATING_PROXY_LIST / ROTATING_PROXY_LIST_PATH中的代理之一进行代理。

在元信息中设置“proxy”的请求不会被scrapy-rotating-proxies处理。要禁用请求的代理,请设置 request.meta['proxy'] = None;要显式设置代理,请使用 request.meta['proxy'] = "<my-proxy-address>"

并发

默认情况下,当启用RotatingProxyMiddleware时,所有默认Scrapy并发选项(DOWNLOAD_DELAYAUTHTHROTTLE_...CONCURRENT_REQUESTS_PER_DOMAIN 等)对于代理请求都变为每个代理单独的设置。例如,如果您设置了 CONCURRENT_REQUESTS_PER_DOMAIN=2,则蜘蛛将最多对每个代理建立2个并发连接,而不考虑请求的URL域名。

自定义

scrapy-rotating-proxies 跟踪工作和非工作的代理,并会不时重新检查非工作的代理。

非工作代理的检测是针对特定网站的。默认情况下,scrapy-rotating-proxies 使用一个简单的启发式方法:如果响应状态码不是200,响应体为空或者如果发生了异常,则认为代理已死亡。

您可以通过传递自定义BanDectionPolicy的路径到 ROTATING_PROXY_BAN_POLICY 选项来覆盖禁止检测方法,例如

# settings.py
ROTATING_PROXY_BAN_POLICY = 'myproject.policy.MyBanPolicy'

策略必须是一个具有 response_is_banexception_is_ban 方法的类。这些方法可以返回 True(禁止检测到),False(不是禁止)或 None(未知)。可以通过子类化和修改默认的BanDetectionPolicy来实现方便

# myproject/policy.py
from rotating_proxies.policy import BanDetectionPolicy

class MyPolicy(BanDetectionPolicy):
    def response_is_ban(self, request, response):
        # use default rules, but also consider HTTP 200 responses
        # a ban if there is 'captcha' word in response body.
        ban = super(MyPolicy, self).response_is_ban(request, response)
        ban = ban or b'captcha' in response.body
        return ban

    def exception_is_ban(self, request, exception):
        # override method completely: don't take exceptions in account
        return None

除了创建策略之外,还可以将 response_is_banexception_is_ban 方法实现为蜘蛛方法,例如

class MySpider(scrapy.Spider):
    # ...

    def response_is_ban(self, request, response):
        return b'banned' in response.body

    def exception_is_ban(self, request, exception):
        return None

这些规则的正确性非常重要,因为失败的请求和坏代理应该有不同的操作:如果责任在代理,则使用不同的代理重试请求是有意义的。

非工作代理可能经过一段时间后恢复工作。scrapy-rotating-proxies 使用随机指数退避对这些检查,第一次检查很快发生,如果仍然失败,则下一次检查延迟更长时间,依此类推。使用 ROTATING_PROXY_BACKOFF_BASE 来调整初始延迟(默认为随机,从0到5分钟)。随机指数退避受 ROTATING_PROXY_BACKOFF_CAP 限制。

设置

  • ROTATING_PROXY_LIST - 要选择的代理列表;

  • ROTATING_PROXY_LIST_PATH - 代理列表文件的路径;

  • ROTATING_PROXY_LOGSTATS_INTERVAL - 统计日志间隔,默认为30秒;

  • ROTATING_PROXY_CLOSE_SPIDER - 当为True时,如果没有活跃的代理,则停止蜘蛛。如果为False(默认),则在没有活跃代理的情况下,所有已死亡的代理都会重新检查。

  • ROTATING_PROXY_PAGE_RETRY_TIMES - 使用不同代理重新下载页面的次数。在此次数之后,失败被认为是页面失败,而不是代理失败。可以这样想:每次不正确检测到的禁止规则会消耗您 ROTATING_PROXY_PAGE_RETRY_TIMES 个活跃的代理。默认:5。

    可以使用 max_proxies_to_try 请求.meta密钥按请求更改此选项 - 例如,如果您确信某些页面应该可以工作,则可以使用更高的值。

  • ROTATING_PROXY_BACKOFF_BASE - 基础退避时间,以秒为单位。默认为300(即5分钟)。

  • ROTATING_PROXY_BACKOFF_CAP - 退避时间上限,以秒为单位。默认为3600(即60分钟)。

  • ROTATING_PROXY_BAN_POLICY - 禁止检测策略的路径。默认为 'rotating_proxies.policy.BanDetectionPolicy'

常见问题解答

问:在哪里获取代理列表?如何编写和维持禁止规则?

A: 您负责找到代理并维护网站的正确封禁规则;scrapy-rotating-proxies 没有任何内置功能。存在商业代理服务,如 https://crawlera.com/,它可以与 Scrapy 集成(参见 https://github.com/scrapy-plugins/scrapy-crawlera),并处理所有这些细节。

贡献

要运行测试,请安装 tox 并从源代码签出运行 tox


define hyperiongray

变更

0.6.2 (2019-05-25)

  • mean_backoff_time 统计数据始终以浮点数返回,以便更容易将统计数据保存到数据库中。

0.6.1 (2019-04-03)

  • 修复了“proxies/good”统计值的错误。

0.6 (2018-12-28)

将代理信息添加到 scrapy 统计中

  • proxies/unchecked

  • proxies/reanimated

  • proxies/dead

  • proxies/good

  • proxies/mean_backoff

0.5 (2017-10-09)

  • ROTATING_PROXY_LIST_PATH 选项允许传递代理列表的文件名。

0.4 (2017-06-06)

  • ROTATING_PROXY_BACKOFF_CAP 选项允许更改最大回退时间,默认为 1 小时。

0.3.2 (2017-06-05)

  • 修复了代理认证问题。

0.3.1 (2017-03-20)

  • 修复了回退计算过程中的 OverflowError。

0.3 (2017-03-14)

  • 不再将空体的重定向视为封禁(感谢 Diga Widyaprana)。

  • ROTATING_PROXY_BAN_POLICY 选项允许为所有蜘蛛自定义封禁检测。

0.2.3 (2017-03-03)

  • max_proxies_to_try 请求.meta 键允许覆盖 ROTATING_PROXY_PAGE_RETRY_TIMES 选项的 per-request。

0.2.2 (2017-03-01)

  • 更新默认封禁检测规则:scrapy.exceptions.IgnoreRequest 不是一个封禁。

0.2.1 (2017-02-08)

  • 更改了 ROTATING_PROXY_PAGE_RETRY_TIMES 的默认值 - 现在是 5。

0.2 (2017-02-07)

  • 改进了默认封禁检测规则;

  • 记录封禁统计。

0.1 (2017-02-01)

初始发布

项目详情


下载文件

为您的平台下载文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源代码分发

scrapy-rotating-proxies-0.6.2.tar.gz (13.1 kB 查看哈希值)

上传时间 源代码

构建分发

scrapy_rotating_proxies-0.6.2-py2.py3-none-any.whl (15.4 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持