python爬虫 Pyppeteer使用方法解析
引言
Selenium在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如Chrome、Firefox等等,然后还要到官方网站去下载对应的驱动,最重要的还需要安装对应的PythonSelenium库,确实是不是很方便,另外如果要做大规模部署的话,环境配置的一些问题也是个头疼的事情。那么本节就介绍另一个类似的替代品,叫做Pyppeteer。
Pyppeteer简介
注意,本节讲解的模块叫做Pyppeteer,不是Puppeteer。Puppeteer是Google基于Node.js开发的一个工具,有了它我们可以通过JavaScript来控制Chrome浏览器的一些操作,当然也可以用作网络爬虫上,其API极其完善,功能非常强大。而Pyppeteer又是什么呢?它实际上是Puppeteer的Python版本的实现,但他不是Google开发的,是一位来自于日本的工程师依据Puppeteer的一些功能开发出来的非官方版本。
在Pyppetter中,实际上它背后也是有一个类似Chrome浏览器的Chromium浏览器在执行一些动作进行网页渲染,首先说下Chrome浏览器和Chromium浏览器的渊源。
Chromium是谷歌为了研发Chrome而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome所有的新功能都会先在Chromium上实现,待验证稳定后才会移植,因此Chromium的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的Logo,但配色不同,Chrome由蓝红绿黄四种颜色组成,而Chromium由不同深度的蓝色构成。
Pyppeteer就是依赖于Chromium这个浏览器来运行的。那么有了Pyppeteer之后,我们就可以免去那些繁琐的环境配置等问题。如果第一次运行的时候,Chromium浏览器没有安装,那么程序会帮我们自动安装和配置,就免去了繁琐的环境配置等工作。另外Pyppeteer是基于Python的新特性async实现的,所以它的一些执行也支持异步操作,效率相对于Selenium来说也提高了。
环境安装
由于Pyppeteer采用了Python的async机制,所以其运行要求的Python版本为3.5及以上
pipinstallpyppeteer
快速上手
-爬取http://quotes.toscrape.com/js/全部页面数据
importasyncio frompyppeteerimportlaunch fromlxmlimportetree asyncdefmain(): browser=awaitlaunch() page=awaitbrowser.newPage() awaitpage.goto('http://quotes.toscrape.com/js/') page_text=awaitpage.content() tree=etree.HTML(page_text) div_list=tree.xpath('//div[@class="quote"]') print(len(div_list)) awaitbrowser.close() asyncio.get_event_loop().run_until_complete(main())
结合协程
frompyppeteerimportlaunch importasyncio fromlxmlimportetree #实例化浏览器对象(谷歌测试版) asyncdefmain(): bro=awaitlaunch() #新建一个空白页 page=bro.newPage() page.goto('http://quotes.toscrape.com/js/') #获取page当前显示页面的源码数据 page_text=awaitpage.content() returnpage_text defparse(task): page_text=task.result() tree=etree.HTML(page_text) div_list=tree.xpath('//div[@class="quote"]') fordivindiv_list: content=div.xpath('./span[1]/text()') print(content) c=main() task=asyncio.ensure_future(c) task.add_done_callback(parse) loop=asyncio.get_event_loop() loop.run_until_complete(c)
解释:
launch方法会新建一个Browser对象,然后赋值给browser,然后调用newPage方法相当于浏览器中新建了一个选项卡,同时新建了一个Page对象。然后Page对象调用了goto方法就相当于在浏览器中输入了这个URL,浏览器跳转到了对应的页面进行加载,加载完成之后再调用content方法,返回当前浏览器页面的源代码。
然后进一步地,我们用pyquery进行同样地解析,就可以得到JavaScript渲染的结果了。在这个过程中,我们没有配置Chrome浏览器,没有配置浏览器驱动,免去了一些繁琐的步骤,同样达到了Selenium的效果,还实现了异步抓取。
详细用法
- 开启浏览器
- 调用launch方法即可,相关参数介绍:
- ignoreHTTPSErrors(bool):是否要忽略HTTPS的错误,默认是False。
- headless(bool):是否启用Headless模式,即无界面模式,如果devtools这个参数是True的话,那么该参数就会被设置为False,否则为True,即默认是开启无界面模式的。
- executablePath(str):可执行文件的路径,如果指定之后就不需要使用默认的Chromium了,可以指定为已有的Chrome或Chromium。
- args(List[str]):在执行过程中可以传入的额外参数。
- devtools(bool):是否为每一个页面自动开启调试工具,默认是False。如果这个参数设置为True,那么headless参数就会无效,会被强制设置为False。
- 关闭提示条:”Chrome正受到自动测试软件的控制”,这个提示条有点烦,那咋关闭呢?这时候就需要用到args参数了,禁用操作如下:
- browser=awaitlaunch(headless=False,args=['--disable-infobars'])
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。