这对我来说不是问题,我可以没有它,但我只是好奇它是否可能以及如何。
今天我了解到,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
将以与开始时相同的顺序完成。
答案 0 :(得分:0)
添加以下设置:
DOWNLOAD_DELAY
Default: 0
DOWNLOAD_DELAY = 0.25#250毫秒的延迟
但scrapy还具有自动设置称为AutoThrottle的下载延迟的功能。它会根据Scrapy服务器和您正在抓取的网站的负载自动设置延迟。这比设置任意延迟更有效。