美文网首页
稍微入门,学习Phantomjs

稍微入门,学习Phantomjs

作者: 咸鱼功阀术 | 来源:发表于2018-06-03 14:02 被阅读0次

  在某些情况下,我们需要爬取一些网页,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的用法

相关文章

  • 稍微入门,学习Phantomjs

    在某些情况下,我们需要爬取一些网页,python有许多强大的功能库提供我们选择使用。对于一些动态网页,也就是一些j...

  • 2021-03-12下载PhantomJS

    PhantomJS的新手?阅读并学习《快速入门》[https://phantomjs.org/quick-star...

  • PJS001 PhantomJ简易入门

    PJS001 PhantomJ简易入门 PhantomJS是什么 PhantomJS是一个基于webkit的Jav...

  • phantomJs入门

    想学爬虫,最初学习的是Python,学了urllib,BeautifulSoup,但学了段时间后想爬几个网站试试,...

  • phantomjs相关学习

    phantomjs使用的学习 前导 PhantomJS能做什么 PhantomJS使用QtWebKit作为它核心浏...

  • phantomjs快速入门

    一、phantomjs介绍(1)一个基于webkit内核的无界面浏览器,即没有UI界面,即它就是一个浏览器,只是其...

  • phantomjs入门使用

    PhantomJS是一个命令行工具。确保您熟悉命令提示符或PowerShell(在Windows上)或终端(在ma...

  • PhantomJS入门教程

    PhantomJS 是一个无界面的Webkit内核浏览器,内置JavaScript API,对DOM操作,CSS选...

  • 量化投资之1:Python入门

    Python快速入门,从入门到放弃系列 开始之前 在开始之前,先讲讲学习方法。现在想学习任何一样东西,你只要稍微用...

  • 学习笔记《PhantomJS》

    因为要找的一个前端的 Browser Testing 解决方案,看下来 PhantomJS 是比较合适的,但是前端...

网友评论

      本文标题:稍微入门,学习Phantomjs

      本文链接:https://www.haomeiwen.com/subject/rdljsftx.html