您的位置:首页 > 编程语言 > ASP

异步网页采集利器CasperJs

2014-12-22 15:41 183 查看

在采集网页中,我们会经常遇到采集一些异步加载页面的网页,我们通常用的httpwebrequest类就采集不到了,这个时候我们通常会采用webbrowser来辅助采集,但是.net下自带的webbrowser用起来非常不爽,在获取页面是否加载完毕的时候比较麻烦一些,DocumentCompleted事件遇到Iframe重复触发,而且获取到的源码通常也不是异步加载完之后的源码,往往我们需要加上定时器去不断的检查,才能获取到我们想要的源码。当然我们可以用一些第三方的webkit内核浏览器,但是这些判断页面是不是真正的加载完成也是比较费劲,而且体积都不小。


今天就介绍一下CasperJSCasperJS是一个开源的导航脚本处理和测试工具,基于PhantomJSslimerjs(前端自动化测试工具)编写。CasperJS简化了完整的导航场景的过程定义,提供了用于完成常见任务的实用的高级函数、方法和语法。CasperJS本身的功能很强大,内置了两种引擎PhantomJSslimerjs 默认使用PhantomJS,具体详细的功能,大家可以参数这些官方网站去了解,或者加入QQ群389709524一块讨论,今天的重点讨论如何快速的采集到异步加载的网页。

假如我们要采集dudu的这篇文章的评论 http://www.cnblogs.com/dudu/p/csharp-unicode-utf8.html,这篇文章查看源码是找不到这两条评论的,我们通过httpwebrequest也是获取不到的,这个时候我们通过casperjs就非常容易了。
var fs = require('fs');

var casper = require('casper').create({
pageSettings: {
loadImages: true,
loadPlugins: false,
userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'
},
logLevel: "debug",//日志等级
verbose: true,    // 记录日志到控制台
timeout: 60000,//60秒超时,退出
});

var url = casper.cli.raw.get('url');

//排除不相关的请求,加快页面加载进度
casper.on('resource.requested', function(requestData, request) {
if (requestData.url.indexOf('google-analytics.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('googlesyndication.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('hm.baidu.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('baidustatic.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('share.baidu.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('cbjs.baidu.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('jiathis.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('.cnzz.com') > 0) {
request.abort();
}
if (requestData.url.indexOf('.51.la') > 0) {
request.abort();
}
if (requestData.url.indexOf('.tanx.com') > 0) {
request.abort();
}
//this.echo("==============>page.resource.requested"+requestData.url);
});

//超时执行的函数,记录到日志文件
casper.on('timeout', function () {
//this.echo("===>timeout"+url);
var fileName = this.evaluate(getFileName);
var nowTime = this.evaluate(CurentTime);
fs.write("log/timeout_" + fileName + ".txt", nowTime + "====>" + url + "\r\n", 'a');
});

//请求页面
casper.start(url, function () {
var status = this.status().currentHTTPStatus;
//this.capture('tt.png');
fs.write("temp.html", this.getHTML(), 'w');
});

function getFileName() {
var now = new Date();

var year = now.getFullYear();       //年
var month = now.getMonth() + 1;     //月
var day = now.getDate();            //日

return (year + "" + month + "" + day);
}

function CurentTime() {
var now = new Date();

var year = now.getFullYear();       //年
var month = now.getMonth() + 1;     //月
var day = now.getDate();            //日

var hh = now.getHours();            //时
var mm = now.getMinutes();          //分

var clock = year + "-";

if (month < 10)
clock += "0";

clock += month + "-";

if (day < 10)
clock += "0";

clock += day + " ";

if (hh < 10)
clock += "0";

clock += hh + ":";
if (mm < 10) clock += '0';
clock += mm;
return (clock);
}

casper.run();


View Code
CasperJs的安装,可以参考官方网站的文档,或者加入QQ群389709524 提供本文的所有工具和源码下载,本人也是最近刚接触,希望和大家一块讨论。今天写此文章还有个目的是,使用CasperJs的时候遇到一个页面个别文字出现乱码,一时找不到解决方案,欢迎知道的大侠帮忙指点下!情景如下:

比如采集这个网页 http://meiri.jguo.cn/mryr/2014/1209/59249.html 这个网站编码是gb2312 采集的时候遇到 曹叡 的 “叡 ”会出现乱码,其他的文字没事,我自己测试了下,发现如果网站是utf-8编码的,采集的时候这个字没问题,但是咱们是采集程序,不可能要求别人改编码,所以目前还没有想到解决方案,还希望知道的同学,指点一二,在此谢了!

文章出处:http://www.cnblogs.com/weiguang3100/

在线工具:http://51tools.info

.NET 开发交流



本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: