这不是我的问题,我可以没有它,但我只是好奇这是可能的和如何。你知道吗
今天我明白了,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
都将按照开始的顺序完成。
使Scrapy具有确定性的唯一方法是在同一时间只生成一个请求,而将其余请求保留在列表或队列中:
添加以下设置:
下载延迟=0.25#250毫秒延迟
但是scrapy还有一个功能,可以自动设置下载延迟,称为AutoThrottle。它会根据Scrapy服务器和正在爬网的网站的负载自动设置延迟。这比设置任意延迟效果更好。你知道吗
相关问题 更多 >
编程相关推荐