我正在使用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
它将逐个处理请求,因此它也将保留订单。