在500次请求scrapy后添加延迟

时间:2016-07-31 20:57:30

标签: python web-scraping scrapy

我有一个启动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'个请求一个级别。 我没有抓取链接,只是保存主页面。

1 个答案:

答案 0 :(得分:2)

你可以考虑使用一个AutoThrottle extension,它不会让你严格控制延迟,而是有自己的算法,可以根据响应时间和并发数量来减慢蜘蛛的速度。请求。

如果您需要在抓取过程的某些阶段更多地控制延迟,则可能需要custom middleware或自定义扩展程序(类似于AutoThrottle - source)。

您还可以动态更改.download_delay attribute of your spider。顺便说一句,这正是AutoThrottle扩展在幕后的作用 - updates the .download_delay value on the fly

一些相关主题: