我正在为动态网站制作基于 Selenium 的蜘蛛。但我想留在 Scrapy 框架内,因为这个蜘蛛是一个更大的项目的一部分,它利用所有使用相同工作流/命令的蜘蛛。
最简单的做法是,将请求从start_requests()
to传递parse()
并在parse()
.
但是,通过这种方式,我将向网站发出双重请求——一次由 Scrapy 请求,一次由 Selenium 请求。
我想要的是,只将 url 传递给 Selenium in parse()
,下载它,然后进一步解析:
def start_requests(self):
for url in self.start_urls:
yield from self.parse(url)
这是首先想到的,但似乎 Scrapy 有一定的局限性,start_requests()
最终必须产生一种Request
对象。如果我这样做,我会收到错误(可以根据要求指定它们)。
所以我想出了另一个想法:使用原来的start_requests()
,因为一个Request
对象不应该下载页面本身,并禁用这样做的下载中间件。但是,即使禁用所有中间件:
custom_settings = {
'DOWNLOADER_MIDDLEWARES' : {
},
'SPIDER_MIDDLEWARES': {
},
'DOWNLOAD_HANDLERS': {
},
}
当我检查传出请求时ngrep
,我仍然可以看到,Scrapy 还在下载除了 Selenium 之外的远程 url,尽管自定义设置应该已经切断了下载器。
在这种情况下,如何通过 Selenium 只下载一次网址?