linux selenium_爬虫界又出神器|一款比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最有野心的库,官网上有非常详细的介绍:
公众号里面也写过一篇关于asyncio的介绍(菜鸟上手Python最有野心的库Asyncio) .由于Pyppeteer是基于asyncio实现的,所以它本身就支持异步操作,执行效率得到大幅提升。
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个小时,优化效果可谓非常明显了。
有兴趣的同学可以动手试试这个库。
往期热门:
小密圈人气很高的两个实战项目
高手心得|菜鸟学Python从入门到进阶
linux selenium_爬虫界又出神器|一款比selenium更高效的利器相关推荐
- 爬虫界新神器 | 一款比Selenium更高效的利器
作者|奔跑的鳄鱼(一个Python爱好者,努力从菜鸟变成高手) 来源|菜鸟学Python(ID:cainiao_xueyuan) 提起Selenium想必大家都不陌生,作为一款知名的Web自动化测试框 ...
- 爬虫界又出神器|一款比selenium更高效的利器
提起selenium想必大家都不陌生,作为一款知名的Web自动化测试框架,selenium支持多款主流浏览器,提供了功能丰富的API接口,经常被我们用作爬虫工具来使用.但是selenium的缺点也很明 ...
- selenium page_source跟手动打开的不一样_爬虫界又出神器|一款比selenium更高效的利器...
提起selenium想必大家都不陌生,作为一款知名的Web自动化测试框架,selenium支持多款主流浏览器,提供了功能丰富的API接口,经常被我们用作爬虫工具来使用.但是selenium的缺点也很明 ...
- pyppeteer:比selenium更高效的爬虫利器
pyppeteer github地址:https://github.com/miyakogi/pyppeteer pyppeteer 英文文档地址: https://miyakogi.github.i ...
- pyppeteer:比 selenium 更高效的爬虫利器
API 接口文档:API Reference:https://miyakogi.github.io/pyppeteer/reference.html pyppeteer github 地址:https ...
- Android图片爬虫,看妹纸神器项目源码,ListView单张图片查看
Android图片爬虫,看妹纸神器项目源码 刚自学完安卓,国庆7七天花了6天纯手写入门级app,从集成图片爬虫到整个项目结束真是一步一个坑. 整个项目没有用框架,都是手写纯属练手,项目中主要用到的技术 ...
- 爬虫界的扫地僧?一文带你了解Puppeteer的前世今生
" 大数据时代,衍生出了许多跟数据相关的公司和行业.在这个数据为王的时代,每个人都必须掌握一手获取数据的能力!" 01 - 什么是Puppeteer? Puppeteer 是一个 ...
- Linux程序内存跟踪,分享一款Linux进程和内存活动监视神器
原标题:分享一款Linux进程和内存活动监视神器 像"top "之类的命令行工具使得监视CPU使用率和内存使用率有些困难.这就是我们今天向您介绍vtop的原因, vtop是一个用N ...
- Linux在中国如何走出困境?
多年来,在国内所谓"圈子"里面的人,总是把Linux用户看成是"小众群体",不能给予足够的重视,软件盗版的泛滥进一步加重了这一倾向.我们该怎么办呢? 我认为,在 ...
最新文章
- CVPR2020:4D点云语义分割网络(SpSequenceNet)
- 综合布线系统入门及应用(二)
- Cordova各个插件使用介绍系列(七)—$cordovaStatusbar手机状态栏显示
- Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略
- iPhone开发入门守则:Objective-C编码规范--系列教程
- 首届剑桥国际青年学术论坛开幕 第四范式携手DeepMind、华为共话AI技术革新
- 论文浅尝 - ICML2020 | 跨域对齐的图最优运输算法
- Microsoft Office 2016 简体中文 Vol 版镜像下载(Pro Plus、Visio、Project 下载)
- 图书期刊信息管理系统c语言,基于C语言的图书馆管理系统.doc
- stm32毕业设计 单片机智能温控风扇
- 免费好用的DiffMerge工具大总结
- 深度学习硬件基础:TPU和其他芯片
- 设备冗余技术——链路聚合
- AMD显卡更新UEFI GOP
- 单机游戏数据库探讨(MySQL嵌入式服务器的使用)(未完)
- SVG格式转json文件
- 2020李宏毅机器学习笔记-Convolution Netural Network
- VehicleNet: Learning Robust Visual Representation for Vehicle Re-identification(车辆网络:学习用于车辆再识别的鲁棒视觉)
- 多益网络校招 —— web前端一面
- 【拒绝内卷】狼吃羊的AI奖励机制不合理: 内卷,如何解决?
热门文章
- 清华校友打造Python调试神器
- 去年秋招,我学长拿了7个Offer,他是怎么做到的?
- 精心总结 Python『八宗罪』,邀你来吐槽
- Python的 5 种高级用法,效率提升没毛病!
- 中台到底是什么?中台包含哪些内容?(包邮送书)
- 爬虫之 lxml模块和xpath语法
- 将前500页,和中间500页的CVE编号放在一起
- beautifulsoup里面的find()和findall()小代码测试
- 网络工程师_记录的一些真题_2018上半年上午
- 如果某路由器到达目的网络有三种方式:通过RIP;通过静态路由;通过默认路由,那么路由器会根据哪种方式进行转发数据包?( )