我正在使用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),
)
有针对性的网站几乎没有奇怪的分页,但定义了规则查找所有现有网页。
答案 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
它将逐个处理请求,因此它也会保留订单。