首页 > 代码库 > Python爬虫学习(10):Selenium的好基友PhantomJS

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代码

  技术分享

 

Python爬虫学习(10):Selenium的好基友PhantomJS