为Scrapy提供代理轮换
项目描述
scrapy-rotating-proxies
此包提供了一个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_DELAY,AUTHTHROTTLE_...,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_ban 和 exception_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_ban 和 exception_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。
变更
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cb068c13ca7d44787bb444e2edfd609669c942a32b5e4b338949a009fd5ca160 |
|
MD5 | 77a2d992a40700c4732f7a8021b7fbc3 |
|
BLAKE2b-256 | c569467b36e6c082febe4bd15518ce53ffead4ce7d9ae8e43017b982724dcc81 |
哈希值 用于 scrapy_rotating_proxies-0.6.2-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f9cb6318011a4bdbb25b0e132b2dbcad01ea40eccceb1b3475c6bb4a0aef0e40 |
|
MD5 | 9880ae3d0c3e604d1d47c07467246137 |
|
BLAKE2b-256 | 0c706336f2e74bdb2f617ff0cf5c5d80c7e94a991e3e0af027441b3b25006d9c |