2014-12-03 163 views
1

我知道一个恒定的延迟可以是否可以在scrapy中设置动态下载延迟?

settings.py 
DOWNLOAD_DELAY = 2 

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

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

我想要做的是保持download_delay为0.一旦在HTML中发现“请求太频繁”的味精。它将延迟更改为2秒。一段时间后,它切换回零。

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

更新: 我发现这是一个扩展调用AutoThrottle 但它是否能够自定义这样的逻辑?

if (requesting too frequently) is found 
    increase the DOWNLOAD_DELAY 
+0

正是Autothrottle所做的;你也可以设置其限制。 – nramirezuy 2014-12-03 18:01:42

回答

-2

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

import time 

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

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

注:

变量“i”是在几秒钟的形式。

+1

睡眠不适用于scrapy,它使用asyc api构建而成。 – nramirezuy 2014-12-03 18:03:07

0

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

将下载延迟设置为0,根据我的经验,吞吐量可以轻松超过1000件/分钟。如果在10次响应后弹出反蜘蛛页面,则不值得付出努力。

取而代之,也许你可以试着找出你的目标服务器允许的速度有多快,可能是1.5s,1s,0.7s,0.5s等等。然后可能重新设计你的产品考虑到你的爬虫的吞吐量。

0

您现在可以使用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 
相关问题