运维学python之爬虫工具篇(四)PhantomJS的用法
1 介绍
PhantomJS是一个×××面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。官方文档
2 安装
PhantomJS分别提供了win、linux等多个平台的安装包,大家可以直接下载相应平台版本安装即可。
安装包
我是安装在win10下,下载完配置截图如下:
记住phantomjs.exe目录,下面要用
点击我的电脑右键---属性---高级系统设置---环境变量---系统变量---path--添加上面的路径
打开cmd,输入phantomjs -v查看:
图中返回版本信息表示成功。
3 快速开始
3.1 Hello, World!
创建一个hello.js文件,文件内容如下:
console.log('Hello, world!');
phantom.exit();
在cmd或pycharm中直接执行,结果如下:
在第一行中,日志将把传递的字符串打印到终端。第二行,退出执行。
注意:phantomjs.exit()一定不要忘记加,不然js不会被终止。
3.2 页面加载
可以通过创建web页面对象来加载、分析和呈现web页面。
下面的脚本演示了页面对象最简单的用法。保存为文件baidu.js,它加载百度页面,然后将其保存为一个图像,图像被保存在脚本运行的目录中。
var page = require('webpage').create();
page.open('https://www.baidu.com', function(status) {console.log("Status: " + status);if(status === "success") {page.render('baidu.png');}phantom.exit();
});
执行结果:
由于它的渲染特性,可以使用phantomjs来捕获web页面,本质上是对内容进行屏幕截图。
3.3 测试加载页面速度
以下loadspeed.js脚本加载指定的URL(不要忘记加http协议),并测量加载它所需的时间。
var page = require('webpage').create(),system = require('system'),t, address;if (system.args.length === 1) {console.log('Usage: loadspeed.js <some URL>');phantom.exit();
}t = Date.now();
address = system.args[1];
page.open(address, function(status) {if (status !== 'success') {console.log('FAIL to load the address');} else {t = Date.now() - t;console.log('Loading ' + system.args[1]);console.log('Loading time ' + t + ' msec');}phantom.exit();
});
脚本运行结果如下:
3.4 代码评估
使用evaluate()函数在web页面的内容评估JavaScript代码,评估是一个“沙盒”,代码无法访问其自身页面内容之外的任何JavaScript对象和变量,从evaluate()返回一个不能包含函数或闭包的简单对象。
下面是一个展示网页标题的例子:
var page = require('webpage').create();
page.open('https://www.taobao.com', function(status) {var title = page.evaluate(function() {return document.title;});console.log('Page title is ' + title);phantom.exit();
});
执行结果:
图片里可以看到我加了--output-encoding=gb2312,如果不加会乱码,后续会研究这个问题,现在想到的解决办法就是这样。
任何来自web页面的控制台消息,包括来自evaluate()中的代码,都不会在默认情况下显示。要纠正这中方式,可以使用onConsoleMessage回掉。前面的例子可以重写为:
var page = require('webpage').create();
page.onConsoleMessage = function(msg) {console.log('Page title is ' + msg);
};
page.open('https://www.taobao.com', function(status) {page.evaluate(function() {console.log(document.title);});phantom.exit();
});
3.5 屏幕捕捉
因为 PhantomJS 使用了 WebKit内核,是一个真正的布局和渲染引擎,它可以像屏幕截图一样捕获一个web界面。因为PhantomJS 可以在web页面上呈现任何内容,所以它不仅用到HTML,CSS的内容转化,还用在SVG,Canvas的转化。
下面的例子展示了用PhantomJS加载github捕捉页面,生成github.png图片
var page = require('webpage').create();
page.open('http://github.com/', function() {page.render('github.png');phantom.exit();
});
PhantomJS除了支持png格式,还支持JPEG, GIF, and PDF格式。测试例子
你可以用页面的属性改变截图和网页的大小,见下面示例:
var page = require('webpage').create();
//viewportSize being the actual size of the headless browser
page.viewportSize = { width: 1024, height: 768 };
//the clipRect is the portion of the page you are taking a screenshot of
page.clipRect = { top: 0, left: 0, width: 1024, height: 768 };
//the rest of the code is the same as the previous example
page.open('https://www.baidu.com', function() {page.render('github.png');phantom.exit();
});
通过viewportSize 和 clipRect 属性。
viewportSize 是视区的大小,你可以理解为你打开了一个浏览器,然后把浏览器窗口拖到了多大。
clipRect 是裁切矩形的大小,需要四个参数,前两个是基准点,后两个参数是宽高。
3.6 网络监控
由于PhantomJS允许对网络流量进行检查,因此可以对网络行为和性能进行各种分析,所有的资源请求和响应都可以使用onResourceRequested和onResourceReceived来进行嗅探。一个简单的日志记录每个请求和响应的例子,脚本名称netlog.js:
var page = require('webpage').create();
page.onResourceRequested = function(request) {console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function(response) {console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);
运行结果会打印出所有以JSON格式输出资源的请求和接收状态。
3.7 页面自动化
因为PhantomJS可以加载和操作网页,所以执行各种页面自动操作是非常完美的。
DOM操作
由于脚本的执行方式就像是在web浏览器上运行,所以执行标准的DOM脚本和CSS选择器完全没有问题。
以下useragent.js示例演示了读取User-Agent的id为qua的textContent属性
var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
page.open('http://www.httpuseragent.org', function(status) {if (status !== 'success') {console.log('Unable to access network');} else {var ua = page.evaluate(function() {return document.getElementById('qua').textContent;});console.log(ua);}phantom.exit();
});
执行结果:
使用jQuery 和其它库
在1.6版中,您还可以使用页面将jQuery包含到页面中。
var page = require('webpage').create();
page.open('http://www.sample.com', function() {page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {page.evaluate(function() {$("button").click();});phantom.exit()});
});
上面的代码片段将打开一个web页面,将jQuery库包含到页面中,然后单击所有使用jQuery的按钮。它将从web页面退出。确保在页面中放置退出语句。包括js,或者它可能在javascript代码被包含之前就退出。
更多例子
好吧,看完这一节是不是感觉一脸懵逼,不知道再干什么,跟python爬虫有毛关系,上张图供大家理解:
图片来源:知乎用户yea yee
转载于:https://blog.51cto.com/linuxliu/2054925
运维学python之爬虫工具篇(四)PhantomJS的用法相关推荐
- yield python3 知乎_运维学python之爬虫高级篇(七)scrapy爬取知乎关注用户存入mongodb...
首先,祝大家开工大吉! 本篇将要介绍的是从一个用户开始,通过抓关注列表和粉丝列表,实现用户的详细信息抓取并将抓取到的结果存储到 MongoDB. 1 环境需求 基础环境沿用之前的环境,只是增加了Mon ...
- python urllib.request 爬虫 数据处理-运维学python之爬虫基础篇(二)urllib模块使用...
1 何为爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...
- 运维学python哪部分_初入运维的小伙伴,别再问需不需要学Python了
这篇文章来自百度知道(你可以搜索"运维需不需要学Python"),或许有些观点不一定正确,但运维学Python这事毫无疑问是主流了,不信可以到各大招聘网站,看看但凡招聘运维有编程技 ...
- 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!
原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...
- 运维学python哪部分_运维新手们,别再问需不需要学PYTHON了
经常有人在群里问,运维人员需不需要学开发?需不需要学PYTHON?PYTHON和SHELL有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲,求求新手们,以后别他妈瞎问了. 现阶段,掌握 ...
- 运维学python用不上_运维朋友们,别再问需不需要学 Python 了!
运维人员需不需要学开发?需不需要学 Python?PythonN 和 Shell 有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲. 现阶段,掌握一门开发语言已经成为高级运维工程师的必 ...
- 运维学python用不上_数读 | 为什么运维朋友们都需要学Python?
运维人员需不需要学开发?需不需要学Python?PythonN和Shell有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲. 现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能, ...
- 运维学python用不上_运维工程师为什么要学python?
现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能,不会开发,你就不能充分理解你们系统的业务流程,你就不能帮助调试.优化开发人开发的程序, 开发人员有的时候很少关注性能的问题,这些问题就得运维人 ...
- 运维学python perl go_公开课|一个小运维的《Golang 入门心路历程》
成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 视频版 公开课主要内容:缘起 初识 熟悉 实践 爱上 缘起 本人之前是 hadoop hbase 运维,为了节约成本 hadoop cli ...
最新文章
- 2021年大数据ELK(十七):Elasticsearch SQL 订单统计分析案例
- Java学习总结:32(Runtime类)
- UML中类图与对象图的区别
- 敏捷个人第五次练习:个人使命宣言
- paper reference
- ensp查看历史配置命令_华为eNSP常用命令
- leetcode(977)有序数组的平方
- 开发者在对项目失去信心后,该做什么?
- 理解Android安全机制
- 阿里云助贫困大学生用技能点亮人生
- Python游戏编程入门(一)——初识Pygame
- 七年级画图计算机教案,信息技术画图软件学习教案
- 关于Qt::WA_TransparentForMouseEvents的一些记录
- vPlayer 模块Demo
- python窗口截图快捷键_python 自定义截图快捷键
- fastjson不序列化空属性,解决办法
- node-onebot对接傻妞新版
- 攻防世界writeup——Web(持续更新)
- 怎样看待中小学stem教育特点
- 送给前端的你,推荐几篇前端汇总文章