【问题标题】:Scrapy doesn't seem to be doing DFOScrapy 似乎没有做 DFO
【发布时间】:2012-03-21 19:57:30
【问题描述】:

我有一个网站,我的爬虫需要遵循一个序列。因此,例如,它需要在开始执行 a2 之前执行 a1、b1、c1 等。a、b 和 c 中的每一个都由不同的解析函数处理,并且相应的 url 在请求对象中创建并生成。下面大致说明了我正在使用的代码:

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 级。如何实现?

【问题讨论】:

  • 如果忽略优先级设置会怎样?
  • 同样,我尝试增加优先级是想看看我是否能影响结果。
  • Srcrapy 不会使用 BaseSpider 自动爬取。由于您使用的是“BaseSpider”,因此显示您生成请求 a1、b1、c1、a2、b2、c2 的代码非常重要(有些可能由“Start-Urls”设置......不仅仅是 'b , c"。

标签: python web-scraping scrapy


【解决方案1】:

我相信您已经注意到深度优先和广度优先搜索算法之间的区别(有关两者的信息,请参见 Wikipedia。)

Scrapy 有能力改变使用的算法:

"默认情况下,Scrapy 使用 LIFO 队列来存储挂起的请求,这基本上意味着它按 DFO 顺序爬行。这种顺序在大多数情况下更方便。如果你确实想按真正的 BFO 顺序爬行,你可以这样做通过设置以下设置:"

更多信息请参见http://doc.scrapy.org/en/0.14/faq.html

【讨论】:

    【解决方案2】:

    深度优先搜索正是您所描述的:

    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

    【讨论】:

    • 这个答案不正确。在 OP 的示例中,DFS 是 (a1, b1, c1, a2, ...),而 BFS 是 (a1, a2, a3, b1, b2, b3, ...)。 Scrapy 不使用真正的 DFS,见公开GitHub issue
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 2016-04-09
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2019-11-26
      • 2019-12-08
      相关资源
      最近更新 更多