制作scrapy.Request deteministics?

时间:2018-05-08 09:02:29

标签: python python-2.7 web-scraping scrapy scrapy-spider

这对我来说不是问题,我可以没有它,但我只是好奇它是否可能以及如何。

今天我了解到,scrapy.Request将不会以与开始时相同的顺序完成。

伪代码示例:

class SomeSpider(scrapy.Spider):
    def parse(self, response):

        # get all ads(25) from ads list
        for ad in adList():
            add_url = findAddUrl()
            yield scrapy.Request(add_url, callback=self.parseAd)

        # go to next page
        if some_condition_OK:
             next_page_url = findNextpageUrl()
             yield scrapy.Request(next_page_url)
        else:
            print 'Stoped at.'

    def parseAd(self, response):
        field_1 = get_field_1()
        field_n = get_field_n()

        # save field_1 to field_n to sqlite DB

这是我编码的蜘蛛的简化示例,它工作正常。

但我今天所学到的是yield scrapy.Request不会以与开始时相同的顺序完成。

在我的示例中,每个页面上有25个广告,我开始yield scrapy.Request(add_url, callback=self.parseAd)以获取每个广告的更多信息。
之后,我将yield scrapy.Request(next_page_url)转到下一页 但我注意到第2页的某些广告将在第1页的所有广告之前完成 我理解为什么,我看到这种方法的好处。

但我的问题是有可能使scrapy.Request确定性吗?

我的意思是确定性是每个scrapy.Request将以与开始时相同的顺序完成。

1 个答案:

答案 0 :(得分:0)

添加以下设置:

DOWNLOAD_DELAY

Default: 0

DOWNLOAD_DELAY = 0.25#250毫秒的延迟

但scrapy还具有自动设置称为AutoThrottle的下载延迟的功能。它会根据Scrapy服务器和您正在抓取的网站的负载自动设置延迟。这比设置任意延迟更有效。