稍微入门,学习Phantomjs

  在某些情况下,我们需要爬取一些网页,python有许多强大的功能库提供我们选择使用。对于一些动态网页,也就是一些js渲染的网页时,我们通常会选择使用selenium去模拟常人的浏览器行为。浏览器很多,selenium对于一些浏览器有不同的浏览器驱动,其中一个比较常用的工具,那就是Phantomjs

  什么是Phantomjs呢?

  Phantomjs就是是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。

内置对象:

        var system=require('system'); //获得系统操作对象,包括命令行参数、phantomjs系统设置等信息

        var page = require('webpage'); //获取操作dom或web网页的对象,通过它可以打开网页、接收网页内容、request、response参数,其为最核心对象。

        var fs = require('fs'); //获取文件系统对象,通过它可以操作操作系统的文件操作,包括read、write、move、copy、delete等。

一:下载安装

  http://phantomjs.org/download.htm

        验证:输入phantomjs -v 查看版本号,得到相应的版本号,安装成功

二:简单程序

        所有的学习都应该动手尝试,通过例子入门phantomjs相关方法

(1)helloworld

新建一个 js 文件。命名为 helloworld.js

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

phantom.exit();

命令行输入:phantomjs helloworld.js

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

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

(2)页面截图

利用phantomjs打开网页,并将网页保存为图片

var page = require('webpage').create();

page.open('http://cuiqingcai.com', function (status) {

    console.log("Status: " + status);

    if (status === "success") {

        page.render('example.png');

    }

    phantom.exit();

});

执行函数:phantomjs pageload.js,发现执行成功,然后目录下多了一张图片,example.png

首先创建了一个webpage对象,然后加载本站点主页,判断响应状态,如果成功,那么保存截图为 example.png。render 方法,phantom 经常会用到的网页截图功能

(3)获得系统操作对象,测试某个网址响应速度

var page = require('webpage').create(),

  system = require('system'),

  t, address;


if (system.args.length === 1) {

  console.log('Usage: loadspeed.js ');

  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://baidu.com

可能会存在乱码现象

t = Date.now();

address = system.args[1];

 phantom.outputEncoding="gbk";  添加这行代码解决乱码问题

(4)获取网页源代码

通过在网页上下文中对JavaScript代码进行计算,使用evaluate()方法。代码是在“沙箱(sandboxed)”中运行的,它没有办法读取在其所属页面上下文之外的任何JavaScript对象和变量。evaluate()会返回一个对象,然而它仅限制于简单的对象并且不能包含方法或闭包。通俗的说就是获取页面的的源码,不能获取console输出的等通过js获得的内容

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

});

执行代码输出:

Page title is 百度一下,你就知道

任何来自于网页并且包括来自 evaluate() 内部代码的控制台信息,默认不会显示。

需要重写这个行为,使用 onConsoleMessage 回调函数,示例可以改写成

var url = 'http://www.baidu.com';

var page = require('webpage').create();

page.onConsoleMessage = function (msg) {

    console.log(msg);

};

page.open(url, function (status) {

    page.evaluate(function () {

        console.log(document.title);

    });

    phantom.exit();

});

这样的话,如果你用浏览器打开百度首页,打开调试工具的console,可以看到控制台输出信息。

重写了 onConsoleMessage 方法之后,可以发现控制台输出的结果和我们需要输出的标题都打印出来了。

(5)屏幕获取

var page = require('webpage').create();

page.open('http://github.com/', function() {

  page.render('github.png');

  phantom.exit();

});

除了png格式,还支持jpg,gif,pdf等格式。

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

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

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

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('http://cuiqingcai.com/', function() {

  page.render('germy.png');

  phantom.exit();

});

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

(6)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://www.httpuseragent.org', function(status) {

  if (status !== 'success') {

    console.log('Unable to access network');

  } else {

    var ua = page.evaluate(function() {

      return document.getElementById('myagent').textContent;

    });

    console.log(ua);

  }

  phantom.exit();

});

输出:

The default user agent is Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.0 Safari/538.1

Your Http User Agent string is: SpecialAgent

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

(7)使用附加库

在1.6版本之后允许添加外部的JS库,比如下面的例子添加了jQuery,然后执行了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()

  });

});

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

转载自:静觅 » Python爬虫利器四之PhantomJS的用法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容