爬虫界又出神器|一款比selenium更高效的利器

提起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最有野心的库,官网上有非常详细的介绍:

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系统的默认目录。其他系统下的默认目录可以参照下面这幅图:

2).使用

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



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

03.实战异步基金爬取


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

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

1).基金爬取

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

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

2).顺序执行

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

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

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


3).异步执行

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

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


转载于:https://juejin.im/post/5d0caff1f265da1b8d162576

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java数组 —(7)

* 1.数组的理解:数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名, 并通过编号的方式对这些数据进行统一管理。 * 2.数组相关的概念: 数组名 元素 角标、下标、索引 数组的长度:元素…

bootstrap按钮的边框问题 去除

问题: 用bootstrap做的按钮,点击后,都会出现边框,请问如何去除? .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus {outline: none; }还要去除阴影添…

C#一些面试知识题

1.简述 private、 protected、 public、internal 修饰符的访问权限答:private:私有成员, 在类的内部才可以访问(只能从其声明上下文中进行访问)。 protected:保护成员,该类内部和从该类派生的类中可以访问。 Friend:友…

vue加载时闪现模板语法-处理方法

问题&#xff1a;使用VUE时&#xff0c;页面加载瞬间&#xff0c;会闪现模板语法&#xff0c;例如{{ item.name }}等 解决办法&#xff1a; 1、可以通过VUE内置的指令v-cloak解决这个问题&#xff08;推荐&#xff09; 具体实现&#xff1a; <ul v-cloak v-for"ite…

java数组 —(8)

1.数组的创建与元素赋值&#xff1a; 杨辉三角&#xff08;二维数组&#xff09;、回形数&#xff08;二维数组&#xff09;、6个数&#xff0c;1-30之间随机生成且不重复。 2.针对于数值型的数组&#xff1a; 最大值、最小值、总和、平均数等 3.数组的赋值与复制 int[] a…

idea启动tomcat时报错:Error during artifact deployment. See server log for details.

Error during artifact deployment. See server log for details. 这个很多人都找不出来&#xff0c;原因无非2个&#xff1a; 一、jar 包有有些没能识别&#xff0c;tomcat没有配置好&#xff01; 二、这个一般代码错了&#xff1a; 除了看 server 的报错&#xff0c;别忘了看…

java运算符 —(9)

1.理解&#xff1a; ① 定义在java.util包下。 ② Arrays:提供了很多操作数组的方法。 2.使用&#xff1a; //1.boolean equals(int[] a,int[] b):判断两个数组是否相等。int[] arr1 new int[]{1,2,3,4};int[] arr2 new int[]{1,3,2,4};boolean isEquals Arrays.equals(a…

css 三角角标样式

.sanjiao {width: 0px;height: 0px;overflow: hidden;border-width: 100px;border-color: red transparent transparent transparent; border-style: solid dashed dashed dashed; }

leetcode 279 四平方定理

可以用四平方和定理&#xff1a;任意一个正整数都可以表示为4个以内整数的平方和。 如果一个数含有因子4&#xff0c;那么我们可以把4都去掉&#xff0c;并不影响结果。比如&#xff1a;8去掉4&#xff0c;12去掉3&#xff0c;返回的结果都相同。 如果一个数除以8余7&#xff0…

java类与对象 —(10)

1.面向对象学习的三条主线&#xff1a; 1.Java类及类的成员&#xff1a;属性、方法、构造器&#xff1b;代码块、内部类2.面向对象的大特征&#xff1a;封装性、继承性、多态性、(抽象性)3.其它关键字&#xff1a;this、super、static、final、abstract、interface、package、…

RESTful API 编写规范

基于一些不错的RESTful开发组件&#xff0c;可以快速的开发出不错的RESTful API&#xff0c;但如果不了解开发规范的、健壮的RESTful API的基本面&#xff0c;即便优秀的RESTful开发组件摆在面前&#xff0c;也无法很好的理解和使用。下文Gevin结合自己的实践经验&#xff0c;整…

Python2与Python3的区别

Python2与Python3的区别 1) 核心类差异 Python3 对 Unicode 字符的原生支持。 Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode&#xff0c;Python3 只 支持 unicode 的 string。Python2 和 Python3 字节和字符对应关系为&#xff1a; python2p…

JavaScript-内存空间

深入了解js这门语言后&#xff0c;才发现它有着诸多众所周知的难点&#xff08;例如&#xff1a;闭包、原型链、内存空间等&#xff09;。有的是因为js的设计缺陷导致的&#xff0c;而有的则是js的优点。不管如何&#xff0c;总需要去学会它们&#xff0c;在学习过程中我觉得只…

java类的结构1: 属性 —(11)

类的设计中&#xff0c;两个重要结构之一&#xff1a;属性 对比&#xff1a;属性 vs 局部变量 1.相同点&#xff1a; 1.1 定义变量的格式&#xff1a;数据类型 变量名 变量值1.2 先声明&#xff0c;后使用1.3 变量都其对应的作用域 2.不同点&#xff1a; 2.1 在类中声明的…

GXU - 7D - 区间求和 - 前缀和

https://oj.gxu.edu.cn/contest/7/problem/D 描述 有一个所有元素皆为0的数组A&#xff0c;有两种操作&#xff1a; 1 l r x表示将A区间[l,r]内所有数加上x&#xff1b; 2 l r表示将A区间[l,r]内从左往右数第i个数加上i&#xff1b; 给出m个操作&#xff0c;请输出操作结束后A中…

javascript-排序算法

插入排序 算法描述&#xff1a; 1. 从第一个元素开始&#xff0c;该元素可以认为已经被排序 2. 取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描 3. 如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到下一位置 4. 重复步骤 3&am…

DPDK并行计算

参考文献&#xff1a; 《深入浅出DPDK》 https://www.cnblogs.com/LubinLew/p/cpu_affinity.html ...................................................................... 前言&#xff1a; 处理器提高性能主要是通过两个途径&#xff0c;一个是提高IPC&#xff08;CPU每一时…

Highcharts图表-ajax-获取json数据生成图表

重点说明此代码是针对一个报表显示多个项对比显示。 直接贴代码&#xff1a;web端 <script type"text/JavaScript" src"js/jQuery/jquery-1.7.2.js"></script> <script type"text/javascript" src"j…

关于RGBDSLAMV2学习、安装、调试过程

Step&#xff11;&#xff1a;https://github.com/felixendres/rgbdslam_v2/wiki/Instructions-for-Compiling-Rgbdslam-(V2)-on-a-Fresh-Ubuntu-16.04-Install-(Ros-Kinetic)-in-Virtualbox 照着这个instructions安装好 rgbdslamv2&#xff0c;并且在安装的过程中&#xff0c;…

Java—List的用法与实例详解

List特点和常用方法 List是有序、可重复的容器。 有序指的是&#xff1a;List中每个元素都有索引标记。可以根据元素的索引标记&#xff08;在List中的位置&#xff09;访问元素&#xff0c;从而精确控制这些元素。 可重复指的是&#xff1a;List允许加入重复的元素。更确切地讲…