• 欢迎来到本博客,希望可以y一起学习与分享

scrapy进阶(二)–selenium集成到scrapy

Python benz 3年前 (2018-10-17) 83次浏览 0个评论 扫描二维码
文章目录[隐藏]

通过downloader middleware集成selenium

selenium集成到scrapy,就是通过downloader middleware对request进行修改,使request的请求工作由原来的scrapy处理,改变为selenium处理,也就是selenium接管scrapy的request。这里可以举一反三,以后集成什么东西,可以考虑通过middleware来实现。

去settings.py,注册一下:

jobbole.py,jobbole爬虫文件可以简单编写一下:

运行一下main.py:

不要每个请求都新开一个Chrome

上面的代码,每请求一个网址,就会重新打开一个Chrome的浏览器,这样很耗费性能。为什么每请求一个url,就要新开一个Chrome浏览器呢?这是因为,每运行一次webdriver.Chrome(executable_path='D:/chromedriver.exe'),就会开一个Chrome浏览器。那么可不可以多个url请求,共用一个Chrome浏览器里呢?很简单,只需在初始化的时候,对webdriver.Chrome(executable_path='D:/chromedriver.exe')只实例化(调用)一次就行了,每个url请求共用一个实例对象:

信号量:middleware调用spider的方法

上面的例子,会带来一个新的问题,就是爬取结束了,Chrome浏览器不会自动关闭。可以通过scrapy生命周期函数spider_close()来执行浏览器关闭的代码。每当爬虫结束,spider_close()都会被调用,问题是,middleware里是无法调用spider_close(),这个需要用到信号量。这时候,注意到def process_request(self, request, spider):里接收的参数有一个spider,我们可以把webdriver.Chrome(executable_path='D:/chromedriver.exe')的只有一次实例,放到spider里,那么有多少个spider就打开多少个Chrome浏览器,所以,我们把 def __init__(self):移到对应的spider里去,这里的spider是jobbole:

middlewares.py的代码如下:

现在可以运行main.py试一下。

selenium通过scrapy实现异步

selenium通过scrapy实现异步,是需要改写scrapy的downloader下载器的,需要熟悉scrapy downloader的接口API与编码规范。这里有一个github上的案例,仅供参考:https://github.com/flisky/scrapy-phantomjs-downloader,也可以查看scrapy的官方文档。


文章 scrapy进阶(二)–selenium集成到scrapy 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!