为什么casperjs比phantomjs好

翻译 2015年11月20日 17:30:52

本文翻译自这篇文章


页面浏览

用CasperJS浏览页面比用PhantomJS更加方便和直观。
例如,先后打开webpage A,然后webpage B
用CasperJS的话,你可以这样写:

casper.start('URL of website A', function(){
    console.log('Started');
});
casper.thenOpen('URL of website B', function(){
    console.log('Started');
});
casper.then(function(){
    this.evaluate(function(){
        //Your code here
    })
})
casper.run();

所以,用CasperJS可以非常简单地打开A站点,然后B站点。
关键在于这样写之后,网站B不会在网站A完全加载完成前打开。
这是个很好的功能,而且并没有在PhantomJS中实现。
如果你使用PhantomJS,你必须通过监听内容加载相关的事件来处理。
我们可以看下,如果用PhantomJS来完成同样功能需要怎么实现:

var steps=[];
var testindex = 0;
var loadInProgress = false;//This is set to true when a page is still loading
var clientRequests = new DRequest();

console.log("Initialization successful");
steps=[
    function (){//Step 1 - Load Code Epicenter
        console.log("Request a website and wait for website to load");
        clientRequests.sendRequest("http://photo-epicenter.com");
    },
    function(){//STEP 2 - After page load, parse results. DO NOT CALL readResponse() IN STEP ONE, because our RESULT might be empty
        console.log("Website loaded, read response");
        clientRequests.readResponse();
        var fs = require("fs");
        console.log("Write data to file");
        fs.write("website.html",clientRequests.getResponse(),"w");
    }
];
//Start interval to read website content
interval = setInterval(executeRequestsStepByStep,2000);

function executeRequestsStepByStep(){
    if (loadInProgress == false && typeof steps[testindex] == "function") {
        console.log("step " + (testindex + 1));
        steps[testindex]();
        testindex++;
    }
    if (typeof steps[testindex] != "function") {
        console.log("test complete!");
        phantom.exit();
    }
}

/**
* These listeners are very important in order to phantom work properly. Using these listeners, we control loadInProgress marker which controls, weather a page is fully loaded.
* Without this, we will get content of the page, even a page is not fully loaded.
*/
clientRequests.phantomPage.onLoadStarted = function() {
    loadInProgress = true;
    console.log(loadInProgress);
    console.log("Loading started");
};
clientRequests.phantomPage.onLoadFinished = function() {
    loadInProgress = false;
    console.log("Loading finished");
};
clientRequests.phantomPage.onConsoleMessage = function(msg) {
    console.log(msg);
};      

这将需要更多的代码,需要指出的是,这代码是前作者写的。
也许有更好的方案,但是,请相信我,这代码已经近乎优秀。

如果你想做的更多,不只是普通的从A页面到B页面,这代码就会变得更加复杂。并使得代码的维护成为一个噩梦。

两个库都会在发往后续请求时,将已经收到的cookie附加上去。
这一点对于登入之后的页面爬取非常有用。

code maintenance (代码维护)

很明显,CasperJS使用更为直观的语法会让你更加容易的维护你的脚本。同时,CasperJS拥有很多有用的功能,比如函数thenClick,它将元素的xpath作为第一个参数,这一点在你想点击菜单项时非常有用。通过chrome你可以取到元素的xpath值,只需要将它复制给CasperJS脚本。CasperJS脚本会模拟点击事件,你就会被重定向到希望的页面。如果你需要修改脚本让其和其他网站一起工作,你只需要修改xpaths。

在CasperJS中有很非常方便而且在phantomjs中没有实现的函数,参考这些API

File Download(文件下载)

在我们讨论PhantomJS时,这是一个热门话题,只少有20片文章在讨论怎么使用PhantomJS 来下载文件,有两个可行的方法:
* 在你的evaluate函数里调用ajax 请求下载,然后编码你的文件,然后你再将内容返回给PhantomJS脚本。
* 你可以使用在GitHut上没有编译的PhantomJS代码。

这两种办法都不能100%保证文件能正常下载,并且还有一个问题,当你不想保存下载的文件文件系统时(比如你不允许保存下载的数据到你的电脑上),想通过PhantomJS来完成几乎是不可能的。我的建议是,不要使用PhantomJS 来下载文件。

通过CasperJS,文件下载是非常容易的,因为CasperJS 提供下载的函数用来把文件下载到文件系统,或者对你想处理而不想保存的文件湖北续进行base64编码。

下面是base64编码的例子:

casper.start('http://www.google.fr/', function() {
    base64logo = this.base64encode('http://www.google.fr/images/srpr/logo3w.png');
});

casper.run(function() {
    this.echo(base64logo).exit();
});

下面这个例子演示如何通过CasperJS来下载csv文件而不把文件保存到文件系统:
var casper = require(‘casper’).create();

casper.start("http://captaincoffee.com.au/dump/", function() {
    this.echo(this.getTitle())
});
casper.then(function(){
    var url = 'http://captaincoffee.com.au/dump/csv.csv';
    require('utils').dump(this.base64encode(url, 'get'));
});
casper.run();

总结

PhantomJS和CasperJS都能完成不错的工作,但是你如果可以选择两者中的一个,我建议你使用CasperJS,因为你将会得到更好至少同样好的效果而不需要太多的付出。

phantomjs and casperjs - 安装

你能看到这篇文章,说明你想学习 phantomjs 和 casperjs 这两个东西,所以我在这不想多说什么废话。下面是这两个工具的官方网址,接下来我会介绍他们两个的如何安装。 phantomj...
  • iFan138
  • iFan138
  • 2017年04月22日 20:08
  • 306

用CasperJs自动浏览页面

CasperJs是一个基于PhantomJs的工具,其比起PhantomJs可以更加方便的进行navigation

[Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

最近在使用Python爬取网页内容时,总是遇到JS临时加载、动态获取网页信息的困难。例如爬取CSDN下载资源评论、搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题...

Phantomjs,Casperjs重要的概念:执行顺序

Phantomjs,Casperjs重要的概念:执行顺序Phantomjs和Javascript一样,是基于消息驱动的。代码的执行都是异步化的。 要理解phantomjs的代码执行是基于一个step...

casperjs(一),比phantomjs更有戏的爬虫工具

CasperJS 介绍以及Windows上安装介绍1 介绍CasperJS是一个开源的导航脚本处理和测试工具,基于PhantomJS(前端自动化测试工具)编写。CasperJS简化了完整的导航场景的过...

casperjs爬虫总结 -- (3) 抓取百度萝莉吧图片

1 我的casper文件夹结构 |data --|a.json --|b.json |fetch --|tieba.js |format --|tieba.xml common.js ...

casperjs爬虫总结 -- (4) 保存到mongo数据库

casperjs爬虫总结 -- (4) 保存到mongo数据库 1 mongo和mongoose mongoose是对mongo数据库的封装,让nodejs操作mongo更加方便 ...

casperjs中调用本地自定义js文件的方法

最近在学习casperjs的应用,使用到了自己编写的js文件了,所以就研究了一下如何casperjs中调用自定义的js文件: phantom.outputEncoding="GBK"; /...

网易新闻评论爬虫(python+selenium+PhantomJS)

警示:请勿转载内容 网易新闻评论爬虫设计 废话不多说,我们要爬取这样一个网易的新闻评论页面,页面URL如下:url = "http://comment.news.163.com/news3_bbs/A...

phantomjs + casperjs

  • 2017年08月23日 21:02
  • 7.86MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么casperjs比phantomjs好
举报原因:
原因补充:

(最多只允许输入30个字)