scrapy 添加500个请求后的延迟零碎

fruv7luv  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(204)

我有一个列表开始2000网址和我正在使用:

DOWNLOAD_DELAY = 0.25

为了控制请求的速度,但我也想在n个请求后增加一个更大的延迟。例如,我想每个请求延迟0.25秒,每500个请求延迟100秒。
编辑:
样本代码:

import os
from os.path import join
import scrapy
import time

date = time.strftime("%d/%m/%Y").replace('/','_')

list_of_pages = {'http://www.lapatilla.com/site/':'la_patilla',                 
                 'http://runrun.es/':'runrunes',
                 'http://www.noticierodigital.com/':'noticiero_digital',
                 'http://www.eluniversal.com/':'el_universal',
                 'http://www.el-nacional.com/':'el_nacional',
                 'http://globovision.com/':'globovision',
                 'http://www.talcualdigital.com/':'talcualdigital',
                 'http://www.maduradas.com/':'maduradas',
                 'http://laiguana.tv/':'laiguana',
                 'http://www.aporrea.org/':'aporrea'}

root_dir = os.getcwd()
output_dir = join(root_dir,'data/',date)

class TestSpider(scrapy.Spider):
    name = "news_spider"
    download_delay = 1

    start_urls = list_of_pages.keys()

    def parse(self, response):
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)

        filename =   list_of_pages[response.url]
        print time.time()
        with open(join(output_dir,filename), 'wb') as f:
            f.write(response.body)

在这个例子中,列表比较短,但是想法是一样的。我想有两个延迟级别,一个是针对每个请求,一个是针对每个“N”个请求。我没有抓取链接,只是保存主页。

yb3bgrhw

yb3bgrhw1#

您可以考虑使用AutoThrottle extension,它不能严格控制延迟,而是有自己的算法,可以根据响应时间和并发请求的数量来降低spider的速度并动态调整它。
如果您需要在抓取过程的某些阶段对延迟进行更多的控制,则可能需要一个 * 自定义中间件 * 或自定义扩展(类似于AutoThrottle -source)。
您也可以动态地更改spider的.download_delay属性。顺便说一句,这正是AutoThrottle扩展在后台所做的--它动态地更新.download_delay值。
一些相关主题:

bttbmeg0

bttbmeg02#

下面是我编写的一个昏昏欲睡的装饰器,它在N次函数调用后暂停。

def sleepy(f):
    def wrapped(*args,**kwargs):
        wrapped.calls += 1
        print(f"{f.__name__} called {wrapped.calls} times")
        if wrapped.calls % 500 == 0:
            print("Sleeping...")
            sleep(20)
        return f(*args,**kwargs)

    wrapped.calls = 0

    return wrapped

相关问题