首页 > 解决方案 > 如何**防止** Scrapy Request 下载请求?

问题描述

我正在为动态网站制作基于 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 只下载一次网址?

标签: pythonseleniumscrapypython-requestsngrep

解决方案


推荐阅读