Selenium 这个库,这其实是一个自动化测试工具,如今已经被普遍用于网络爬虫中来应对 JavaScript 渲染的页面的抓取。html
但 Selenium 用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,好比 Chrome、Firefox 等等,而后还要到官方网站去下载对应的驱动,最重要的还须要安装对应的 Python Selenium 库,确实是否是很方便,另外若是要作大规模部署的话,环境配置的一些问题也是个头疼的事情。git
那么本节就介绍另外一个相似的替代品,叫作 Pyppeteer。注意,是叫作 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它咱们能够经过 JavaScript 来控制 Chrome 浏览器的一些操做,固然也能够用做网络爬虫上,其 API 极其完善,功能很是强大。 而 Pyppeteer 又是什么呢?它其实是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。github
在 Pyppetter 中,实际上它背后也是有一个相似 Chrome 浏览器的 Chromium 浏览器在执行一些动做进行网页渲染,首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。浏览器
Chromium 是谷歌为了研发 Chrome 而启动的项目,是彻底开源的。两者基于相同的源代码构建,Chrome 全部的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,所以 Chromium 的版本更新频率更高,也会包含不少新的功能,但做为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着一样的 Logo,但配色不一样,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不一样深度的蓝色构成。安全
总的来讲,两款浏览器的内核是同样的,实现方式也是同样的,能够认为是开发版和正式版的区别,功能上基本是没有太大区别的。网络
Pyppeteer 就是依赖于 Chromium 这个浏览器来运行的。那么有了 Pyppeteer 以后,咱们就能够免去那些繁琐的环境配置等问题。若是第一次运行的时候,Chromium 浏览器没有安全,那么程序会帮咱们自动安装和配置,就免去了繁琐的环境配置等工做。另外 Pyppeteer 是基于 Python 的新特性 async 实现的,因此它的一些执行也支持异步操做,效率相对于 Selenium 来讲也提升了。less
Pyppeteer 采用了 Python 的 async 机制,因此其运行要求的 Python 版本为 3.5 及以上。异步
安装方式:async
pip3 install pyppeteer
import asyncio from lxml import etree from pyppeteer import launch#发射 #必须在协程中声明浏览器 不然会出错 async def main(): #由于这是函数 因此须要挂起 #实例化浏览器对象 参数headless=False是有浏览器 True是没有浏览器 browser =await launch(headless=False) #建立一个新的页面(由于函数仍是须要挂载) new_page = await browser.newPage() #在新建的网页发送url 请求网页须要挂起 await new_page.goto("http://quotes.toscrape.com/js/") #获取新页面的源码数据 #解析的页面数据能够给循环事件对象添加回调函数,即先绑定task.add_done_callback(parser)参数为函数名 page_text =await new_page.content() tree = etree.HTML(page_text) div_list = tree.xpath('//div[@class="quote"]') print(div_list) await browser.close() loop = asyncio.get_event_loop() loop.run_until_complete(main())
总之利用 Pyppeteer 咱们能够控制浏览器执行几乎全部动做,想要的操做和功能基本均可以实现,用它来自由地控制爬虫固然就不在话下了。函数
解释:launch 方法会新建一个 Browser 对象,而后赋值给 browser,而后调用 newPage 方法至关于浏览器中新建了一个选项卡,同时新建了一个 Page 对象。而后 Page 对象调用了 goto 方法就至关于在浏览器中输入了这个 URL,浏览器跳转到了对应的页面进行加载,加载完成以后再调用 content 方法,返回当前浏览器页面的源代码。而后进一步地,咱们用 lxml进行一样地解析,就能够获得 JavaScript 渲染的结果了。在这个过程当中,咱们没有配置 Chrome 浏览器,没有配置浏览器驱动,免去了一些繁琐的步骤,一样达到了 Selenium 的效果,还实现了异步抓取.
了解了基本的实例以后,咱们再来梳理一下 Pyppeteer 的一些基本和经常使用操做。Pyppeteer 的几乎全部功能都能在其官方文档的 API Reference 里面找到,官方文档连接为:
https://miyakogi.github.io/pyppeteer/reference.html
若是须要其余浏览器想要实现的功能,官方文档中去找。