【问题标题】:Is it possible to set dynamic download delay in scrapy?是否可以在scrapy中设置动态下载延迟?
【发布时间】:2015-01-31 17:30:04
【问题描述】:

我知道可以设置一个恒定的延迟

settings.py
DOWNLOAD_DELAY = 2

但是,如果我将延迟设置为 2 秒,则效率不够。如果我设置 DOWNLOAD_DELAY = 0.

爬虫能够爬取大约 10 个页面。之后,目标页面将返回类似“您请求太频繁”的内容。

我想要做的是将 download_delay 保持为 0。一旦在 html 中找到“请求过于频繁”的 msg。它将延迟更改为2s。一段时间后它又变回零。

是否有任何模块可以做到这一点?或任何其他更好的想法来处理这种情况?

更新: 我发现这是一个分机电话AutoThrottle 但是它可以自定义一些这样的逻辑吗??

if (requesting too frequently) is found
    increase the DOWNLOAD_DELAY

【问题讨论】:

  • 正是 Autothrottle 所做的;您还可以设置其限制。

标签: scrapy web-crawler delay


【解决方案1】:

如果在你得到防蜘蛛页面之后,那么在2秒内你就可以得到数据页面,那么你所要求的可能需要编写一个下载器中间件 检查反蜘蛛页面,将所有计划的请求重置为更新队列,在蜘蛛空闲时启动循环调用以从更新队列获取请求,(循环间隔是您对新下载延迟的破解),以及尝试确定何时不再需要下载延迟(需要一些测试),然后停止循环并将 renew-queue 中的所有请求重新调度到 scrapy 调度程序。在分布式爬取的情况下,您将需要使用 redis 队列。

下载延迟设置为 0,根据我的经验,吞吐量可以轻松超过 1000 项/分钟。如果10次响应后弹出防蜘蛛页面,那就不值得了。

相反,也许您可​​以尝试找出您的目标服务器允许多快,可能是 1.5s、1s、0.7s、0.5s 等。然后也许重新设计您的产品时考虑到您的爬虫可以实现的吞吐量。

【讨论】:

    【解决方案2】:

    您现在可以使用Auto Throttle extension。默认情况下它是关闭的。您可以在项目的 settings.py 文件中添加这些参数以启用它。

    AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    AUTOTHROTTLE_MAX_DELAY = 300
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    AUTOTHROTTLE_DEBUG = True
    

    【讨论】:

      【解决方案3】:

      是的,您可以使用时间模块来设置动态延迟。

      import time
      
      for i in range(10):
         *** Operations 1****
         time.sleep( i )
         *** Operations 2****
      

      现在您可以看到操作 1 和操作 2 之间的延迟。

      注意:

      变量“i”是秒的形式。

      【讨论】:

      • sleep 在scrapy上不起作用,它使用了一个用twisted构建的asyc api。
      猜你喜欢
      • 2019-10-29
      • 2020-08-13
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2019-07-11
      • 2019-09-04
      • 2016-11-05
      • 2012-04-21
      相关资源
      最近更新 更多