因此,您的代码在这里几乎没有缺陷。
- 当scrapy Selectors更快,更高效时,您可以使用硒来解析页面内容。
- 您为每个响应启动一个webdriver。
这可以通过使用scrapy’s很好地解决
Downloadermiddlewares。您想创建一个自定义的下载器中间件,该中间件将使用硒而不是scrapy下载器下载请求。
例如我用这个:
# middlewares.pyclass SeleniumDownloader(object): def create_driver(self): """only start the driver if middleware is ever called""" if not getattr(self, 'driver', None): self.driver = webdriver.Chrome() def process_request(self, request, spider): # this is called for every request, but we don't want to render # every request in selenium, so use meta key for those we do want. if not request.meta.get('selenium', False): return request self.create_driver() self.driver.get(request.url) return HtmlResponse(request.url, body=self.driver.page_source, encoding='utf-8')激活您的中间件:
# settings.pyDOWNLOADER_MIDDLEWARES = { 'myproject.middleware.SeleniumDownloader': 13,}然后,在您的Spider中,您可以通过添加meta参数来指定要通过selenium驱动程序下载的URL。
# you can start with seleniumdef start_requests(self): for url in self.start_urls: yield scrapy.Request(url, meta={'selenium': True})def parse(self, response): # this response is rendered by selenium! # also can use no selenium for another response if you wish url = response.xpath("//a/@href") yield scrapy.Request(url)这种方法的优点是您的驱动程序仅启动一次,仅用于下载页面源代码,其余的则留给适当的异步刮刮工具使用。
缺点是您无法单击周围的按钮,因为您没有被驱动程序暴露。大多数时候,您可以通过网络检查器对按钮的功能进行逆向工程,而您根本不需要对驱动程序本身进行任何单击。



