Scrapy似乎没有做DFO

时间:2012-03-03 17:23:18

标签: python web-scraping scrapy

我有一个网站,我的抓取工具需要遵循一个序列。因此,例如,它需要在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。如何实现这一目标?

3 个答案:

答案 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'

*在doc.scrapy.org FAQ

中找到

答案 1 :(得分:1)

我相信您注意到深度优先和广度优先搜索算法之间的区别(有关两者的信息,请参阅维基百科。)

Scrapy能够改变使用的算法:

“默认情况下,Scrapy使用LIFO队列来存储待处理的请求,这基本上意味着它以DFO顺序进行爬行。在大多数情况下,这个顺序更方便。如果你想以真正的BFO顺序爬行,你可以做通过设置以下设置:“

有关详细信息,请参阅http://doc.scrapy.org/en/0.14/faq.html

答案 2 :(得分:0)

Scrapy默认使用DFO。爬网序列的原因是scrapy异步爬网页面。即使它使用DFO,由于网络延迟或其他原因,序列似乎是不合理的顺序。