Scrapy的Download_Delay和并发请求未按预期工作

时间:2017-02-01 06:49:05

标签: python web-scraping scrapy scrapy-spider

查看scrapy的download_delay和Concurrent_requests文档,我的理解是:如果我有' CONCURRENT_REQUESTS':25和download_delay为1秒,这意味着一旦scrapy请求25页,scrapy将等待所有25下载,然后等待1秒,并再次请求25页。如果我使用0秒的download_delay,则scrapy与上面相同,没有1秒延迟。但是当我在我的刮刀中使用这些设置时,这并不像预期的那样工作,因为当我延迟0秒时,我使用0秒延迟时的平均网络使用率是2.1Mbps,而我的网络使用时间是1秒延迟平均只有0.3 Mbps(最大0.4Mbps)。这是我的代码:

class DetailsxxxSpider(scrapy.Spider):
name = "details"
allowed_domains = ["www.xxx.com"]
download_delay = 1
custom_settings = {'CONCURRENT_REQUESTS': 25}
def start_requests(self):
    engine = create_engine('sqlite:///temp.db')
    Base.metadata.bind = engine
    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    urls = session.query(Temp.url).filter_by(status = "Insert").all()
    # print urls
    for url in urls:
        yield Request(url[0])

使用0秒延迟时,爬行率为1800页/分钟,使用1秒延迟时为43页/分钟,但理想情况下页数/分钟速率应为900页/分钟。当使用1秒延迟时,似乎每个请求都设置了download_delay。

我为每个请求使用代理。我错过了什么? 有没有办法可以在25个请求之后将延迟设置为1秒。 我理想地希望速度达到900页/分钟。任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:2)

download_delay是在几秒钟内来自同一网站的连续请求之间等待的时间

因此,如果您使用download_delay = 1,您将永远拥有  < 60页/分钟。 (在你的情况下是43)

要获得900页/分钟,您应该使用:

download_delay< (60/900)< 0.067

我的猜测是试试0.05