gpt4 book ai didi

python - 制作 scrapy.Request 确定性?

转载 作者:行者123 更新时间:2023-12-01 09:27:43 34 4
gpt4 key购买 nike

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

今天我了解到,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) 从每个广告中获取更多信息。< br/>之后,我进入下一页 yield scrapy.Request(next_page_url)
但我注意到 page2 中的一些广告将在 page1 中的所有广告之前完成。
我理解其中的原因,也看到了这种方法的好处。

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

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

最佳答案

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

关于python - 制作 scrapy.Request 确定性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50229856/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com