首页 > 解决方案 > 带有视图状态的 Scrapy 递归抓取顺序

问题描述

我正在尝试使用 Scrapy 以递归方式抓取使用 ViewStates 构建的网站的搜索结果。所以我从一组关键字开始,通常只有两个:

key1, key2

然后每个关键字都有可能生成更多的关键字,以及返回需要解析的多页结果。这是通过蜘蛛parse函数的条件分支完成的,它产生scrapy.FormRequest带有新关键字或“下一页”指令的对象。

我的问题是订购。虽然 scrapy 声称它可以通过选项强制进入深度优先顺序,但'CONCURRENT_REQUESTS': 1这种递归爬行似乎并非如此。到目前为止,我一直看到在解析原始键时生成的任何新请求都发生在整个原始请求集之后。所以如果key1首先执行并产生一个新的请求key1.1,执行顺序是

key1
key2
key1.1

在我的特定用例中,这适用于新关键字,但该站点不会处理“下一页”请求,除非它们立即跟随第 1 页的请求。这使得 scrapy 在功能上对我毫无用处,除非我能弄清楚如何强制执行这些请求的抓取顺序。优先级似乎也没有任何效果。

谁能给我这方面的指导?这是否超出了 Scrapy 的设计范围?

标签: pythonweb-scrapingscrapyviewstate

解决方案


kwargpriority=旨在影响调度程序,以允许您通知 Scrapy 您的要求

默认情况下,所有Requests 具有相同的优先级,因此 Scrapy 只选择一个;但是,由于您需要立即执行下一页操作,因此您希望给它一个priority=1000,这可以通过response.follow(next_page_url, priority=1000)或者,当然,通过手动创建下一页Requestyield/return来完成


推荐阅读