Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 制造刮痧,请求鉴定?_Python_Python 2.7_Web Scraping_Scrapy_Scrapy Spider - Fatal编程技术网

Python 制造刮痧,请求鉴定?

Python 制造刮痧,请求鉴定?,python,python-2.7,web-scraping,scrapy,scrapy-spider,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()

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

今天我了解到,
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
这是我编写的一个简化的spider示例,它运行良好

但我今天学到的是,
产生scrapy.Request
不会按照开始的顺序完成

在我的示例中,在每个页面上,每个页面有25个广告,我开始
生成scrapy.Request(add_url,callback=self.parseAd)
以从每个广告中获取更多信息。
然后,我使用
进入下一页并生成scrapy.Request(下一页\u url)

但我注意到,第2页的一些广告将在第1页的所有广告之前完成。
我理解为什么,也看到了这种方法的好处

但我的问题是,是否有可能使
请求变得不确定

我所说的确定性是指每个
scrapy.Request
将以与启动相同的顺序完成。

添加以下设置:

DOWNLOAD_DELAY

Default: 0
下载延迟=0.25延迟250毫秒


但是scrapy也有一个自动设置下载延迟的功能,称为AutoThrottle。它会根据Scrapy服务器和正在爬行的网站的负载自动设置延迟。这比设置任意延迟更有效。

使Scrapy具有确定性的唯一方法是同时只产生一个请求,而将其余请求保留在列表或队列中:

class SomeSpider(scrapy.Spider):

    pending_request = []

    def parse(self, response):

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

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

        if self.pending_request:
            yield self.pending_request.pop(0)

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

        if self.pending_request:
            yield self.pending_request.pop(0)

我使用
下载延迟=1
并发请求=1
。它仍然不是确定性的。请尝试自动跳转
下载\u延迟
,并且
自动跳转
与确定性顺序无关。