网页视频抓取工具(Web自动化测试框架:Pyppeteer浏览器)
优采云 发布时间: 2021-12-28 07:03网页视频抓取工具(Web自动化测试框架:Pyppeteer浏览器)
Selenium 想必大家都不陌生。selenium作为知名的Web自动化测试框架,支持多种主流浏览器,提供丰富的API接口,经常被我们用作爬虫工具。但是selenium的缺点也很明显,比如速度太慢,版本配置要求严格,最麻烦的就是频繁更新相应的驱动。
今天给大家介绍另一个Web自动化测试工具Pyppeteer。虽然支持的浏览器比较单一,但是在安装配置的便利性和运行效率上,都远胜于selenium。
01.Pyppeteer 介绍
在介绍 Pyppeteer 之前,先说一下 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的工具。主要用于操纵Chrome浏览器的API,利用Javascript代码操纵Chrome浏览器完成数据爬取、Web程序自动测试等任务。
Pyppeteer 实际上是 Puppeteer 的 Python 版本。下面简单介绍一下Pyppeteer的两大特性,chrome浏览器和asyncio框架:
1).chromium
Chromium 是一个独立的浏览器。Google 计划开发自己的浏览器 Google Chrome。它相当于 Chrome 的实验版。Chromium 不如 Chrome 稳定,但功能更多且更新速度快。每隔几个小时就会发布一个新的开发版本。
Pyppeteer 的网络自动化基于铬。由于chromium的一些特性,Pyppeteer的安装和配置非常简单。我们稍后会详细介绍这一点。
2).asyncio
asyncio 是 Python 的异步协程库。3. 版本 4 引入的标准库内置了对异步 IO 的支持。它被称为 Python 中最雄心勃勃的库。官网上有很详细的介绍:
02.安装使用
1)。最少安装
使用pip install pyppeteer命令完成pyppeteer库的安装。对于chromium浏览器,只需要一个pyppeteer-install命令就会自动下载对应最新版本的chrome浏览器到pyppeteer的默认位置。
如果不运行pyppeteer-install命令,第一次使用pyppeteer时会自动下载安装chrome浏览器,效果是一样的。总的来说,pyppeteer 相比 selenium 更节省了驱动配置链接。
当然,由于某些原因,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系统默认目录。其他系统下的默认目录可以参考下图:
2)。利用
安装后试一下效果。我们来看看下面的代码。在main函数中,首先创建一个浏览器对象,然后打开一个新标签页,访问百度主页,将当前页面截图保存为“example.png”,最后关闭浏览器。前面提到,pyppeteer是建立在asyncio之上的,所以使用的时候需要async/await结构。
如果你运行上面的代码,你会发现没有浏览器弹出。这是因为 Pyppeteer 默认使用无头浏览器。如果要浏览器显示,需要在launch函数中设置参数“headless=False”,程序结束。然后,抓取的网页图片会出现在同一个目录下:
03. 实用的异步资金爬取
我们一直在说 Pyppeteer 是一个非常高效的 Web 自动化测试工具。本质原因是Pyppeteer是基于asyncio的。它几乎所有的属性和方法都是协程对象,所以在构建异步程序时非常方便。,它天生就支持异步操作。
我们来比较顺序执行和异步操作的效率:
1)。资金爬取
我们以在天天基金网爬取开放式基金净值数据作为本次实验任务。下图是一只基金的历史净值数据。这个页面是js加载的,没有办法直接通过请求获取内容信息。因此,您可以考虑使用一种方式来模拟浏览器操作进行数据捕获。(其实有获取基金净值数据的API接口,这个任务只是演示,没有实际价值)
为了使效果更加明显,我们在基金列表页面(下图)抓取了过去20个交易日前50名基金的净值数据。
2)。顺序执行
程序构建的基本思路是创建浏览器浏览器和页面页面,依次访问各个基金的净值数据页面并抓取数据。核心代码如下:
代码中的get_data()函数用于分析净值数据页和数据转换,get_all_codes()函数用于获取所有开放式基金的基金代码(共6000多只)。程序虽然也使用了async/await的结构,但是在callurl_and_getdata()函数中,多只基金的净值数据获取是顺序执行的。之所以写这个,是因为pyppeteer中的方法都是协程对象,必须是A形式的构造程序。
为了消除打开浏览器的耗时干扰,我们只统计了访问页面和数据爬取的时间,结果为:12.08秒。
3)。异步执行
接下来修改程序,函数功能不变,主要是将fundlist的循环操作修改为异步任务对象。核心代码如下:
耗时统计间隔依然在浏览器打开后计算,其运行时间为:2.18秒,比顺序执行快6倍。可以想象,如果爬虫的工作量比较大,顺序执行需要10个小时,那么异步执行可能只需要不到2个小时,优化效果可以用非常明显来形容。