为什么casperjs比phantomjs好

2023-11-22 08:38
文章标签 phantomjs casperjs

本文主要是介绍为什么casperjs比phantomjs好,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文翻译自这篇文章。


页面浏览

用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 Epicenterconsole.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 emptyconsole.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,因为你将会得到更好至少同样好的效果而不需要太多的付出。

这篇关于为什么casperjs比phantomjs好的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/408883

相关文章

linux:The driver is not executable: /phantomjs/bin/phantomjs

在linux使用selenium抓取的时候出现错误 java.lang.IllegalStateException: The driver is not executable: /phantomjs/bin/phantomjsat com.google.common.base.Preconditions.checkState(Preconditions.java:518)at org.openq

phantomjs-2.1.1-windows

需要用一下PhantomJS https://phantomjs.org/download.html 直奔官网而去 不过这也太慢了吧 我是shoufa好公民 没有可以出去的软件 下载了很久很久。。。 由于太恶心度盘,我上传了个蓝盘,就不传csdn下载了 有需要的下吧,这速度嗖嗖的 下载:https://www.lanzous.com/ia60sfe 密码:be0e   找到了

Selenium+PhantomJS使用时报错原因及解决方案

问题 今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox insteadwarnings.warn('Selenium support

java使用phantomJs抓取动态页面

随时随地技术实战干货,充分利用闲暇时间,请关注源代码社区公众号和技术交流群。 from:http://blog.csdn.net/kaka0930/article/details/68941932 1. phantomjs的镜像网站:http://npm.taobao.org/dist/phantomjs/ 2. phantomjs内置webkit内核,也就是chrome的内核。可以无界

基于phantomJS实现web性能监控

随时随地技术实战干货,充分利用闲暇时间,请关注源代码社区公众号和技术交流群。 from:http://www.webryan.net/2013/02/web-page-test-based-on-phontomjs/ 1、web性能监控背景描述 上期分享的《Web性能监控自动化探索之路–初识WebPageTest》从依赖webpagetest的角度给出了做性能日常检查的方案,但由于依赖

Python爬虫 PhantomJS运行提示WebDriverException: 'bin' executable may have wrong permissions.

PhantomJS声明已经在2016年不再官方更新,不过2017年又释放出了beta版本在镜像站点: https://npm.taobao.org/dist/phantomjs/ 可以从上述站点下载,比从phantomjs.org上下载快。 Selenium也需要安装。下面代码段是一个例子,可以直接敲进去用的。 webdriver.PhantomJS 这一句要注意 在windows里面,

cron sh: casperjs: command not found 在cron php脚本中,通过shell_exec 报错

在cron php脚本中,通过shell_exec 报错:  sh: casperjs: command not found 在手动执行脚本是没有问题的,在脚本下面有问题报错 将 casperjs 改成绝对路径   /usr/local/bin/casperjs, 就可以了 putenv("PHANTOMJS_EXECUTABLE=/usr/local/bin/phantomjs"

phantomjs 抓取网页

phantomjs:我的理解就是它是一个无显示的浏览器,也就是说除了不能显示页面内容以外,浏览器能干的活儿它基本上都能干。so,最近由于实验需要,要从某电商爬一点图片,但是它又是AJAX生成的,单纯的爬取HTML的方法是行不通的,o(╯□╰)o,于是在经过一些求助后,;了解到了PHANTOMJS,鉴于网上没找到太多实例,只好自己总结下以备不时之需。另外直接查看官网上的说明文档会有很大收获滴~顺便

java 调用 phantomjs

日前有采集需求,当我把所有的对应页面的链接都拿到手,准备开始根据链接去采集(写爬虫爬取)对应的终端页的时候,发觉用程序获取到的数据根本没有对应的内容,可是我的浏览器看到的内容明明是有的,于是浏览器查看源代码也发觉没有,此时想起该网页应该是ajax加载的。不知道ajax的小朋友可以去学下web开发啦。 采集ajax生成的内容手段不外乎两种。一种是通过http观察加载页面时候的请求,然后我们模仿该请

解析Perl爬虫代码:使用WWW__Mechanize__PhantomJS库爬取stackoverflow.com的详细步骤

在这篇文章中,我们将探讨如何使用Perl语言和WWW::Mechanize::PhantomJS库来爬取网站数据。我们的目标是爬取stackoverflow.com的内容,同时使用爬虫代理来和多线程技术以提高爬取效率,并将数据存储到本地。 Perl爬虫代码解析 首先,我们需要安装WWW::Mechanize::PhantomJS库,这可以通过CPAN进行安装。这个库允许我们模拟一个浏览器会