Python爬虫学习(10):Selenium的好基友PhantomJS
上一节中我们学习了selenium,用python来操作浏览器,在做网页自动化测试的时候最好不过了 。如果我们来做爬虫用一个带界面的浏览器似乎不太好吧,那可咋办呢?别着急,下来我们要介绍的就是一款不带界面的浏览器--PhantomJS。其是一个无界面的,可脚本编程的WebKit浏览器引擎,支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。
这里可能会有人问:为什么要用浏览器来抓取页面数据,不用之前我们之前直接通过Urllib获取网页然后分析呢? 这是因为我们通过urllib获取到仅仅是单个的html页面代码,但是实际上每个页面中会使用js来对页面进行渲染 ,简单来说就有可能会通过ajax来获取数据,然后在页面中添加新的元素,如果我们用urllib单单是获取到了html代码,却不能执行页面中js代码。所以我们需要这样的功能得到完全渲染后的页面,这样才不会丢掉数据。所以我们需要用到这个PantomJS咯。
1. PhantomJS的安装
PhantomJS安装方法有两种,一种是下载源码之后自己来编译,另一种是直接下载编译好的二进制文件。然而自己编译需要的时间太长,而且需要挺多的磁盘空间。官方推荐直接下载二进制文件然后安装。点击下边,选择平台下载。
http://phantomjs.org/download.html
我的环境是CentOS7--X64,所以下载了phantomjs-2.1.1-linux-x86_64.tar.bz2。
接下来我将其安装在/usr/local中,首先 解压到/usr/local/目录中,然后重命名,接着将其中的bin目录加入到环境变量中。
sudo tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/ sudo mv /usr/local/phantomjs-2.1.1-linux-x86_64 /usr/local/phantomjs sudo ln -s /usr/local/phantomjs/bin/phantomjs /usr/local/bin/phantomjs
测试以下,在任意目录中输入: phantomjs -v,看看能不能调用
2. Hello World
hello.js
文件:
console.log('Hello, world!');
phantom.exit();
通过 phantomjs hello.js 执行。
程序输出了 Hello,world!程序第二句话终止了 phantom 的执行。
注意:phantom.exit();
这句话非常重要,否则程序将永远不会终止。
3. 页面加载
可以利用 phantom 来实现页面的加载,下面的例子实现了页面的加载并将页面保存为一张图片。
首先创建了一个webpage对象,然后加载本站点主页,判断响应状态,如果成功,那么保存截图为 example.png
运行之后会直接生成一张example.png的网页截图
这里还可以设置窗口的大小以及截图时时的图片大小。viewportSize设置浏览器的窗口大小。clipRect设置截图的尺寸。
执行完后的图片为:
3. 测试网页加载速度
计算了一个页面的加载速度,同时还用到了命令行传参的特性。程序判断了参数的多少,如果参数不够,那么终止运行。然后记录了打开页面的时间,请求页面之后,再纪录当前时间,二者之差就是页面加载速度
测试百度的加载速度,这个时间包括JS渲染的时间,当然和网速也有关。
4. 代码评估
利用 evaluate 方法我们可以获取网页的源代码。这个执行是“沙盒式”的,它不会去执行网页外的 JavaScript 代码。evalute 方法可以返回一个对象,然而返回值仅限于对象。
下边是一个显示网页的title的例子:
var page = require('webpage').create(); page.open("http://www.baidu.com", function(status) { var title = page.evaluate(function() { return document.title; }); console.log('Page title is ' + title); phantom.exit(); });
任何来自于网页并且包括来自 evaluate() 内部代码的控制台信息,默认不会显示。
如果要显示,则需要重写这个行为,使用 onConsoleMessage 回调函数,示例可以改写成
其执行的结果为:
5. 网络监听
因为 PhantomJS 有网络通信的检查功能,它也很适合用来做网络行为的分析。
在请求的时候,可以通过改写onResourceRequested和onResourceReceived回调函数来实现接收到资源请求和资源接受完毕的监听。如下是答应请求的信息和返回的信息,以json的方式呈现。
执行后的效果图:
6. 操作DOM
脚本都是像在浏览器中运行的,所以标准的 JavaScript 的 DOM 操作和 CSS 选择器也是生效的。
例如下面的例子就修改了 User-Agent,然后去访问httpuseragent.org,这个网页就是分析显示当前访问用的useragent,然后我们获取这个页面中来呈现useragent的元素,将其中的值打印出来。
执行结果:
7. 使用附加库
在1.6版本之后允许添加外部的JS库,比如下面的例子添加了jQuery,然后执行了jQuery代码