制作皮屑。请求决策学?

2024-06-08 00:04:21 发布

您现在位置:Python中文网/ 问答频道 /正文

这不是我的问题,我可以没有它,但我只是好奇这是可能的和如何。你知道吗

今天我明白了,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示例,它运行良好。你知道吗

但我今天学到的是yield scrapy.Request不会按照开始的顺序完成。你知道吗

在我的示例中,每个页面上有25个广告,我开始yield scrapy.Request(add_url, callback=self.parseAd)从每个广告中获取更多信息。
然后,我用yield scrapy.Request(next_page_url)进入下一页。
但我注意到,第2页的一些广告将在第1页的所有广告之前完成。
我明白为什么,我看到了这种方法的好处。你知道吗

但我的问题是,有没有可能使scrapy.Request具有确定性?你知道吗

我所说的确定性是指每一个scrapy.Request都将按照开始的顺序完成。


Tags: toselfaddurl示例fieldget顺序
2条回答

使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)

添加以下设置:

DOWNLOAD_DELAY

Default: 0

下载延迟=0.25#250毫秒延迟

但是scrapy还有一个功能,可以自动设置下载延迟,称为AutoThrottle。它会根据Scrapy服务器和正在爬网的网站的负载自动设置延迟。这比设置任意延迟效果更好。你知道吗

相关问题 更多 >

    热门问题