python爬虫神器Pyppeteer入门及使用


Posted in Python onJuly 13, 2019

前言

提起selenium想必大家都不陌生,作为一款知名的Web自动化测试框架,selenium支持多款主流浏览器,提供了功能丰富的API接口,经常被我们用作爬虫工具来使用。但是selenium的缺点也很明显,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动。

今天就给大家介绍另一款web自动化测试工具Pyppeteer,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜selenium。

01.Pyppeteer简介

介绍Pyppeteer之前先说一下Puppeteer,Puppeteer是谷歌出品的一款基于Node.js开发的一款工具,主要是用来操纵Chrome浏览器的 API,通过Javascript代码来操纵Chrome浏览器,完成数据爬取、Web程序自动测试等任务。

Pyppeteer其实是Puppeteer的Python版本,下面简单介绍下Pyppeteer的两大特点,chromium浏览器和asyncio框架:

1).chromium

Chromium是一款独立的浏览器,是Google为发展自家的浏览器Google Chrome而开启的计划,相当于Chrome的实验版,Chromium的稳定性不如Chrome但是功能更加丰富,而且更新速度很快,通常每隔数小时就有新的开发版本发布。

Pyppeteer的web自动化是基于chromium来实现的,由于chromium中某些特性的关系,Pyppeteer的安装配置非常简单,关于这一点稍后我们会详细介绍。

2).asyncio

asyncio是Python的一个异步协程库,自3.4版本引入的标准库,直接内置了对异步IO的支持,号称是Python最有野心的库,官网上有非常详细的介绍:

python爬虫神器Pyppeteer入门及使用

02.安装与使用

1).极简安装

使用pip install pyppeteer命令就能完成pyppeteer库的安装,至于chromium浏览器,只需要一条pyppeteer-install命令就会自动下载对应的最新版本chromium浏览器到pyppeteer的默认位置。

如果不运行pyppeteer-install命令,在第一次使用pyppeteer的时候也会自动下载并安装chromium浏览器,效果是一样的。总的来说,pyppeteer比起selenium省去了driver配置的环节。

当然,出于某种原因,也可能会出现chromium自动安装无法顺利完成的情况,这时可以考虑手动安装:首先,从下列网址中找到自己系统的对应版本,下载chromium压缩包;

  • 'linux': 'https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/575458/chrome-linux.zip'
  • 'mac': 'https://storage.googleapis.com/chromium-browser-snapshots/Mac/575458/chrome-mac.zip'
  • 'win32': 'https://storage.googleapis.com/chromium-browser-snapshots/Win/575458/chrome-win32.zip'
  • 'win64': 'https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip'

然后,将压缩包放到pyppeteer的指定目录下解压缩,windows系统的默认目录。其他系统下的默认目录可以参照下面这幅图:

python爬虫神器Pyppeteer入门及使用

2).使用

安装完后就来试试效果。一起来看下面这段代码,在main函数中,先是建立一个浏览器对象,然后打开新的标签页,访问百度主页,对当前页面截图并保存为“example.png”,最后关闭浏览器。前文也提到过,pyppeteer是基于asyncio构建的,所以在使用的时候需要用到async/await结构。

python爬虫神器Pyppeteer入门及使用

运行上面这段代码会发现并没有浏览器弹出运行,这是因为Pyppeteer默认使用的是无头浏览器,如果想要浏览器显示,需要在launch函数中设置参数“headless =False”,程序运行结束后在同一目录下会出现截取到的网页图片:

python爬虫神器Pyppeteer入门及使用

03.实战异步基金爬取

我们前面一直在说Pyppeteer是一款非常高效的web自动化测试工具,其本质原因是由于Pyppeteer是基于asyncio构建的,它的所有属性和方法几乎都是coroutine对象,因此在构建异步程序的时候非常方便,天生就支持异步运行。

下面就来对比顺序执行和异步运行的效率究竟如何:

1).基金爬取

我们把天天基金网中的开放式基金净值数据爬取作为本次的实验任务,下面这张图是一支基金的历史净值数据,这个页面是js加载的,没办法通过requests直接获取内容信息,因此可以考虑使用模拟浏览器操作的方式进行数据抓取。(事实上基金净值数据的获取是有API接口的,本次任务只是为了演示,不具备实用价值)

python爬虫神器Pyppeteer入门及使用

为了使效果更加明显,我们此次爬取基金列表页(下图)前50支基金的近20个交易日的净值数据。

python爬虫神器Pyppeteer入门及使用

2).顺序执行

程序构建的基本思路是新建一个browser浏览器和一个页面page,依次访问每个基金的净值数据页面并爬取数据。核心代码如下:

python爬虫神器Pyppeteer入门及使用

代码中的get_data()函数用于净值数据页面解析和数据的转化,get_all_codes()函数用于获取全部开放式基金的基金代码(共6000余个)。虽然程序也使用了async/await的结构,但是对多个基金的净值数据获取都是在callurl_and_getdata()函数中顺序执行的,之所以这样写是因为pyppeteer中的方法都是coroutine对象,必须以这种形式构建程序。

为了排除打开浏览器的耗时干扰,我们仅统计访问页面和数据抓取的用时,其结果为:12.08秒。

3).异步执行

下面我们把程序改造一下,功能函数都不变,主要是把对fundlist的循环运行改装成async的task对象。核心代码如下:

python爬虫神器Pyppeteer入门及使用

耗时的统计区间仍然从浏览器打开后开始计算,其运行用时为:2.18秒,相比顺序执行要快了6倍。可以想象,如果需要爬取的工作量比较大,顺序执行需要10个小时的话,异步执行可能只需要不到2个小时,优化效果可谓非常明显了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python Django模板的使用方法
Jan 14 Python
使用python实现接口的方法
Jul 07 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
python实现反转部分单向链表
Sep 27 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Python 分享10个PyCharm技巧
Jul 13 #Python
简单了解Python3里的一些新特性
Jul 13 #Python
python将类似json的数据存储到MySQL中的实例
Jul 12 #Python
Django对数据库进行添加与更新的例子
Jul 12 #Python
Python 绘制酷炫的三维图步骤详解
Jul 12 #Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 #Python
python实现简单聊天室功能 可以私聊
Jul 12 #Python
You might like
第三节 定义一个类 [3]
2006/10/09 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
基于jQuery的获取标签名的代码
2012/07/16 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
简单实现python画圆功能
2018/01/25 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
客户代表自我评价范例
2013/09/24 职场文书
销售部主管岗位职责
2013/12/18 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
党员政治学习材料
2014/05/14 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
校本课程教学计划
2015/01/19 职场文书
计算机专业自荐信
2015/03/05 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技