全栈工程师开发手册 (作者:栾鹏)
python教程全解

如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS渲染的到的一些结果,那简直没天理了。所以,我们需要有一些好用的工具来帮助我们像浏览器一样渲染JS处理的页面。

其中有一个比较常用的工具,那就是PhantomJS。

PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。因此可以比浏览器更加快速的解析处理js加载。

一、安装

1、首先下载PhantomJS。(点击进入下载链接)

2、下载后解压,将文件夹bin下的phantomjs.exe放在python安装目录的Script文件夹C:\Python27\Scripts下。起始这里是为了把phantomjs.exe的路径添加到环境变量,而python安装目录的Script文件夹路径,已经添加到了环境变量中,所以这里也就省略了。

3、在cmd中输入

phantomjs -v

如果正常显示版本号,那么证明安装成功了。如果提示错误,那么检查python的环境变量是否设置。

二、基础内容

2.1、第一个程序

第一个程序当然是Hello World,新建一个 js 文件。命名为 helloworld.js

console.log('Hello, world!');
phantom.exit();

打开cmd,先cd到js文件夹所在的目录,再调用如下语句实现phantom运行js文件。
如我的js文件存储在D:\FFF文件夹下,依次执行下面的命令

d:
cd \FFF
phantomjs helloworld.js

程序输出了 Hello,world!程序第二句话终止了 phantom 的执行。

注意:**phantom.exit();**这句话非常重要,否则程序将永远不会终止。

2.2、页面加载

可以利用 phantom 来实现页面的加载,下面的例子实现了页面的加载并将页面保存为一张图片。

将以下命令存储为pageload.js保存在你的文件夹中

var page = require('webpage').create();
page.open('http://blog.csdn.net/luanpeng825485697', function (status) {console.log("Status: " + status);if (status === "success") {page.render('example.png');}phantom.exit();
});

首先创建了一个webpage对象,然后加载本站点主页,判断响应状态,如果成功,那么保存截图为 example.png

打开cmd,先cd到js文件夹所在的目录,再调用如下语句实现phantom运行js文件。

phantomjs pageload.js

2.3、测试页面加载速度

下面这个例子计算了一个页面的加载速度,同时还用到了命令行传参的特性。新建文件保存为 loadspeed.js。

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();
});

程序判断了参数的多少,如果参数不够,那么终止运行。然后记录了打开页面的时间,请求页面之后,再纪录当前时间,二者之差就是页面加载速度。

phantomjs loadspeed.js http://blog.csdn.net/luanpeng825485697

运行结果

Loading http://blog.csdn.net/luanpeng825485697
Loading time 8576 msec

这个时间包括JS渲染的时间,当然和网速也有关。

2.4、代码评估

利用 evaluate 方法我们可以获取网页的源代码。这个执行是“沙盒式”的,它不会去执行网页外的 JavaScript 代码。evalute 方法可以返回一个对象,然而返回值仅限于对象,不能包含函数(或闭包)

var url = 'http://www.baidu.com';
var page = require('webpage').create();
page.open(url, function(status) {var title = page.evaluate(function() {return document.title;});console.log('Page title is ' + title);phantom.exit();
});

以上代码获取了百度的网站标题。

三、屏幕捕获

因为 PhantomJS 使用了 WebKit内核,是一个真正的布局和渲染引擎,它可以像屏幕截图一样捕获一个web界面。因为它可以渲染网页中的人和元素,所以它不仅用到HTML,CSS的内容转化,还用在SVG,Canvas。可见其功能是相当强大的。

除了 png 格式的转换,PhantomJS还支持 jpg,gif,pdf等格式。

前面有使用介绍,这里就不介绍了。

其中最重要的方法便是 viewportSize 和 clipRect 属性。

viewportSize 是视区的大小,你可以理解为你打开了一个浏览器,然后把浏览器窗口拖到了多大。

clipRect 是裁切矩形的大小,需要四个参数,前两个是基准点,后两个参数是宽高。

var page = require('webpage').create();
page.viewportSize = { width: 1024, height: 768 };
page.clipRect = { top: 0, left: 0, width: 1024, height: 500 };page.open('http://blog.csdn.net/luanpeng825485697', function() {page.render('csdn.png');phantom.exit();
});

就相当于把浏览器窗口拖到了 1024×768 大小,然后从左上角裁切出了 1024×500 的页面。

四、网络监听

因为 PhantomJS 有网络通信的检查功能,它也很适合用来做网络行为的分析。

当接受到请求时,可以通过改写onResourceRequested和onResourceReceived回调函数来实现(接收到资源请求)和(资源接收完毕)的监听。例如

var url = 'http://www.525heart.com';
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格式输出。

五、页面自动化处理

因为 PhantomJS 可以加载和操作一个web页面,所以用来自动化处理也是非常适合的。

5.1、DOM操作

脚本都是像在浏览器中运行的,所以标准的 JavaScript 的 DOM 操作和 CSS 选择器也是生效的。

例如下面的例子就修改了 User-Agent,然后还返回了页面中某元素的内容。

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
page.open('http://blog.csdn.net/luanpeng825485697', function(status) {if (status !== 'success') {console.log('Unable to access network');} else {var ua = page.evaluate(function() {return document.getElementById('blog_title').textContent;});console.log(ua);}phantom.exit();
});

运行结果首先打印出了默认的 User-Agent,然后通过修改它,请求验证 User-Agent 的一个站点,通过选择器得到了修改后的 User-Agent。

5.2、使用附加库

在1.6版本之后允许添加外部的JS库,比如下面的例子添加了jQuery,然后执行了jQuery代码。

var page = require('webpage').create();
page.open('http://blog.csdn.net/luanpeng825485697', function() {page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {page.evaluate(function() {$("button").click();});phantom.exit()});
});

引用了 jQuery 之后,我们便可以在下面写一些 jQuery 代码了。

六、Webpage对象

在前面我们介绍了 webpage 对象的几个方法和属性,其实它本身还有其它很多的属性。具体的内容可以参考

Webpage

Webpage用例

官方实例

python网络爬虫系列教程——PhantomJS包应用全解相关推荐

  1. python网络爬虫系列教程——Scrapy框架应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 安装 在cmd中输入 Scrapy的安装依赖wheel.twiste.lxml包.所以先通过pip install wheel安装wheel库 ...

  2. python网络爬虫系列教程_Python网络爬虫系列教程连载 ----长期更新中,敬请关注!...

    感谢大家长期对Python爱好者社区的支持,后期Python爱好者社区推出Python网络爬虫系列教程.欢迎大家关注.以下系列教程大纲,欢迎大家补充.视频长期连载更新中 --------------- ...

  3. python网络爬虫系列教程——python中requests库应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python中requests库的基础应用,网页数据挖掘的常用库之一.也就是说最主要的功能是从网页抓取数据. 使用前需要先联网安装reques ...

  4. python网络爬虫系列教程——python中pyquery库应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python网络爬虫lxml库的应用全解. 在线安装方法:cmd中输入"pip install pyquery" 离线安装 ...

  5. python网络爬虫系列教程——python中lxml库应用全解(xpath表达式)

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python网络爬虫lxml库的应用全解. 在线安装方法:cmd中输入"pip install lxml" 离线安装,下载 ...

  6. python网络爬虫系列教程——Python+PhantomJS +Selenium组合应用

    全栈工程师开发手册 (作者:栾鹏) python教程全解 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器. 理 ...

  7. python网络爬虫系列教程——python网络数据爬虫误区,让你的爬虫更像人类

    1 前言 近期,有些朋友问我一些关于如何应对反爬虫的问题.由于好多朋友都在问,因此决定写一篇此类的博客.把我知道的一些方法,分享给大家.博主属于小菜级别,玩爬虫也完全是处于兴趣爱好,如有不足之处,还望 ...

  8. python网络爬虫系列教程——python中urllib、urllib2、cookie模块应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python数据挖掘库urllib.urllib2.cookie知识全解.本文使用python2.7环境,如果需要使用python3的环境只需 ...

  9. python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...

    廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...

最新文章

  1. Web3与智能合约交互实战
  2. UIExtendedEdge
  3. TCP的三个接收队列
  4. requirejs 使用实例
  5. C语言 数据结构 树和二叉树
  6. CPU上跑深度学习模型,FPS也可以达100帧
  7. vb 字符串长度_一起学VB——什么是过程
  8. php出现Cannot modify header information问题的解决方法
  9. CVE-2020-0601漏洞详细分析
  10. 计算机辅助设计实训报告范文,cad室内实训报告范文
  11. linux入门目录汇总
  12. word文档中实现目录索引中标题加粗,前导符和页码不加粗
  13. oracle官怎么卸载网,Oracle终极彻底卸载
  14. 在c语言中 实参与其对应的形参各占独立的存储单元,以下正确的说法是( )。在C语言中: A.实参和与其对应的形参各占用独立的存储单元...
  15. VINS fusion软件架构分析(4)---后端处理processMeasurements()功能函数概览
  16. 二极管在LDO电路中的几种常见用法
  17. CMake命令之add_custom_comand 和 add_custom_target
  18. 【mysql进阶】MTS主从同步原理及实操指南(七)
  19. 钢筋连接力矩值A钢筋套筒连接不同钢筋直径不同力矩值
  20. Mac系统NTFS磁盘读写软件Tuxera NTFS for Mac2022

热门文章

  1. python发音1001python发音-python——字符串问题总结
  2. python从入门到放弃 图-python从入门到放弃(二)
  3. Linux下科大讯飞语音识别全面总结
  4. 深度学习的应用:语音识别、图像理解、自然语言处理
  5. Vue3.0 + Ts 项目框架搭建二:路由 Router
  6. sql 跨数据库 连表
  7. nginx代理https后,spring mvc web应用redirect https变成http
  8. 2019百度之星程序设计大赛 1005 Seq
  9. 【Luogu1996】约瑟夫问题(模拟,解法汇总)
  10. 【Baltic2003】【BZOJ1370】Gang团伙(并查集,拆点)