<强>引言
强>
硒在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如Chrome, Firefox等等,然后还要到官方网站去下载对应的驱动,最重要的还需要安装对应的Python库硒,确实是不是很方便,另外如果要做大规模部署的话,环境配置的一些问题也是个头疼的事情。那么本节就介绍另一个类似的替代品,叫做Pyppeteer。
<强> Pyppeteer简介
强>
注意,本节讲解的模块叫做Pyppeteer,不是Puppeteer.Puppeteer是谷歌基于节点。js开发的一个工具,有了它我们可以通过JavaScript来控制铬浏览器的一些操作,当然也可以用作网络爬虫上,其API极其完善,功能非常强大。而Pyppeteer又是什么呢?它实际上是操纵的Python版本的实现,但他不是谷歌开发的,是一位来自于日本的工程师依据操纵的一些功能开发出来的非官方版本。
在Pyppetter中,实际上它背后也是有一个类似Chrome浏览器的铬浏览器在执行一些动作进行网页渲染,首先说下铬浏览器和铬浏览器的渊源。
铬是谷歌为了研发铬而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome所有的新功能都会先在铬上实现,待验证稳定后才会移植,因此铬的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,铬的用户群体要小众得多。两款浏览器”同根同源”,它们有着同样的标志,但配色不同,Chrome由蓝红绿黄四种颜色组成,而铬由不同深度的蓝色构成。
Pyppeteer就是依赖于铬这个浏览器来运行的。那么有了Pyppeteer之后,我们就可以免去那些繁琐的环境配置等问题。如果第一次运行的时候,铬浏览器没有安装,那么程序会帮我们自动安装和配置,就免去了繁琐的环境配置等工作。另外Pyppeteer是基于Python的新特性异步实现的,所以它的一些执行也支持异步操作,效率相对于硒来说也提高了。
<强>环境安装
强>
由于Pyppeteer采用了Python的异步机制,所以其运行要求的Python版本为3.5及以上
pip安装pyppeteer
<强>快速上手
强>
——爬取http://quotes.toscrape.com/js/全部页面数据
进口asyncio 从pyppeteer进口发射 从lxml进口etree 异步def main (): 浏览器=等待发射() 页面=等待browser.newPage () 等待page.goto (“http://quotes.toscrape.com/js/? page_text=等待page.content () 树=etree.HTML (page_text) div_list=tree.xpath ('//div [@class="引用"]”) print (len (div_list)) 等待browser.close () asyncio.get_event_loop () .run_until_complete (main ())
结合协程
从pyppeteer进口发射 进口asyncio 从lxml进口etree #实例化浏览器对象(谷歌测试版) 异步def main (): 兄弟=等待发射() #新建一个空白页 页面=bro.newPage () page.goto (“http://quotes.toscrape.com/js/? #获取页面当前显示页面的源码数据 page_text=等待page.content () 返回page_text def解析(任务): page_text=task.result () 树=etree.HTML (page_text) div_list=tree.xpath ('//div [@class="引用"]”) 在div div_list: 内容=div.xpath(’。/跨度[1]/text () ') 打印(内容) c=main () 任务=asyncio.ensure_future (c) task.add_done_callback(解析) 循环=asyncio.get_event_loop () loop.run_until_complete (c)
<>强解释:强>
发射方法会新建一个浏览器对象,然后赋值给浏览器,然后调用newPage方法相当于浏览器中新建了一个选项卡,同时新建了一个网页对象,然后页对象调用了goto方法就相当于在浏览器中输入了这个URL,浏览器跳转到了对应的页面进行加载,加载完成之后再调用内容方法,返回当前浏览器页面的源代码。
然后进一步地,我们用pyquery进行同样地解析,就可以得到JavaScript渲染的结果了。在这个过程中,我们没有配置Chrome浏览器,没有配置浏览器驱动,免去了一些繁琐的步骤,同样达到了硒的效果,还实现了异步抓取。
<强>详细用法强>
-
<李>开启浏览器李>
<李>调用发射方法即可,相关参数介绍:
-
<李> ignoreHTTPSErrors (bool):是否要忽略HTTPS的错误,默认是假的。