刮擦跟随链接,但从最后一页开始 - 错误的顺序



我正在使用CrawlSpider并定义了规则,但是start_url蜘蛛之后转到最后一页而不是第二页。为什么会发生这种情况以及如何编写规则以正确的顺序跟随页面 2,3,4...等。

class MySpider(CrawlSpider):
    name = "spidername"
    allowed_domains = ["example.com"]
    start_urls = [
    "http://www.example.com/some-start-url.html",
    ]
    rules = (
    # Extract links from the page
    Rule(SgmlLinkExtractor(allow=('/Page-d+.html', )), callback='parse_links',follow=True),
    )

目标站点几乎没有奇怪的分页,但定义的规则可以找到所有现有页面。

来自 Scrapy FAQ:

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

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

scrapy sgml 链接提取器 进程 通过 python 链接 set() 为了唯一性,请参阅scrapy utils unique 函数 意思是 在当前实现中无法控制排序,还值得注意的是,即使实现了排序(通过继承 SGML 提取器),也不能保证请求的顺序与响应的顺序相同,很可能某些请求将比另一个请求花费更长的时间,从而导致其响应被接收到,因为调用是异步的。

如果排序是绝对必要的,确保排序的唯一方法是串行调用,一种方法是在请求元中拥有调用 URL 并在收到响应时调用下一个请求,但这确实使扭曲并行性的使用毫无用处

它晚了,但供将来参考

CONCURRENT_REQUESTS = 1

它将逐个处理请求,因此它也将保留订单。

最新更新