Scrapy跟随链接,但从最后一页开始 - 错误的订购

时间:2014-02-09 20:11:13

标签: web-scraping scrapy

我正在使用CrawlSpider并且已经定义了规则但是在start_url之后,spider转到了最后一页而不是第二页。为什么会发生这种情况以及如何编写规则以正确的顺序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),
    )

有针对性的网站几乎没有奇怪的分页,但定义了规则查找所有现有网页。

3 个答案:

答案 0 :(得分:1)

来自Scrapy FAQ

  

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

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

答案 1 :(得分:0)

scrapy sgml链接提取程序进程通过python set()链接以获得唯一性,请参阅scrapy utils unique function意味着在当前实现中无法控制排序,同样值得注意的是,即使已实现排序(通过继承sgml提取器)没有保证请求的顺序与响应的顺序相同,很可能一些请求将花费比另一个请求更长的时间因为调用是异步的,所以它的响应会被接收。

如果排序是绝对必要的,确保排序的唯一方法是串行调用,一种方法是在请求元数据中调用url并在收到响应时调用下一个请求,但实际上使扭曲并行使用无用

答案 2 :(得分:0)

已晚,但供将来参考

CONCURRENT_REQUESTS = 1

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