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

Web scraping 刮擦跟随链接,但从最后一页开始-顺序错误,web-scraping,scrapy,Web Scraping,Scrapy,我正在使用爬行器并定义了规则,但在开始之后,爬行器将转到最后一页而不是第二页。为什么会发生这种情况,以及如何编写规则以正确的顺序跟随页面2、3、4。。。等等 class MySpider(CrawlSpider): name = "spidername" allowed_domains = ["example.com"] start_urls = [ "http://www.example.com/some-start-url.html", ]

我正在使用爬行器并定义了规则,但在开始之后,爬行器将转到最后一页而不是第二页。为什么会发生这种情况,以及如何编写规则以正确的顺序跟随页面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 sgml链接提取器通过python
set()
处理链接。要获得唯一性,请参阅“在当前实现中没有对排序的控制”,还值得注意的是,即使实现了排序(通过继承sgml提取器)不能保证请求的顺序与响应的顺序相同,因为调用是异步的,所以很可能某些请求比另一个请求花费更长的时间,导致其响应被接收到

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

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


很晚了,但供将来参考

CONCURRENT_REQUESTS = 1

它会一个接一个地处理请求,这样它也会保持顺序。

可能的重复很难用一个虚拟URL来分辨,但是你的页面可能有scrapy关注的
最后一页
链接,而不是
下一页
链接。有吗?你能分享部分HTML和“奇怪的分页”吗?抓取最后一页后,scrapy会停止吗?还是继续?scrapy会开始抓取第四页,然后进入第四页并抓取它,然后进入第三页并在完成第二页后停止。这是页面(开始url)我尝试爬网,谢谢@Rho,但没有帮助谢谢你的回答。我发现这个问题无法解决,因为这是爬网过程的工作方式。我将尝试创建一些其他编程逻辑,并在项目下载后对其排序。欢迎:)可能值得包括为什么排序很重要,也许scrapy不适合您的情况,我想您已经知道没有它,
lxml
可以完美工作。。。
CONCURRENT_REQUESTS = 1