我有一个网站,我的抓取工具需要遵循一个序列。因此,例如,它需要在a1,b1,c1开始进入a2等之前去.a,b和c中的每一个都由不同的解析函数处理,并且相应的url在Request对象中创建并产生。以下粗略说明了我正在使用的代码:
class aspider(BaseSpider):
def parse(self,response):
yield Request(b, callback=self.parse_b, priority=10)
def parse_b(self,response):
yield Request(c, callback=self.parse_c, priority=20)
def parse_c(self,response)
final_function()
然而,我发现爬行的顺序似乎是a1,a2,a3,b1,b2,b3,c1,c2,c3这很奇怪,因为我认为Scrapy应该首先保证深度。
序列不必严格,但我正在抓取的网站有一个限制,所以Scrapy需要在5级bs被抓取之前尽快开始抓取级别c。如何实现这一目标?
答案 0 :(得分:8)
深度优先搜索正是您所描述的内容:
search as deep into a's as possible before moving to b's
要更改Scrapy以进行广度优先搜索(a1,b1,c1,a2等等),请更改以下设置:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
中找到
答案 1 :(得分:1)
我相信您注意到深度优先和广度优先搜索算法之间的区别(有关两者的信息,请参阅维基百科。)
Scrapy能够改变使用的算法:
“默认情况下,Scrapy使用LIFO队列来存储待处理的请求,这基本上意味着它以DFO顺序进行爬行。在大多数情况下,这个顺序更方便。如果你想以真正的BFO顺序爬行,你可以做通过设置以下设置:“
有关详细信息,请参阅http://doc.scrapy.org/en/0.14/faq.html。
答案 2 :(得分:0)
Scrapy默认使用DFO。爬网序列的原因是scrapy异步爬网页面。即使它使用DFO,由于网络延迟或其他原因,序列似乎是不合理的顺序。