异步网页采集利器CasperJs
2017-03-05 12:42
267 查看
在采集网页中,我们会经常遇到采集一些异步加载页面的网页,我们通常用的httpwebrequest类就采集不到了,这个时候我们通常会采用webbrowser来辅助采集,但是.net下自带的webbrowser用起来非常不爽,在获取页面是否加载完毕的时候比较麻烦一些, DocumentCompleted事件遇到Iframe重复触发,而且获取到的源码通常也不是异步加载完之后的源码,往往我们需要加上定时器去不断的检查,才能获取到我们想要的源码。当然我们可以用一些第三方的webkit内核浏览器,但是这些判断页面是不是真正的加载完成也是比较费劲,而且体积都不小。
今天就介绍一下 CasperJS , CasperJS 是一个开源的导航脚本处理和测试工具,基于 PhantomJS 和 slimerjs (前端自动化测试工具)编写。CasperJS简化了完整的导航场景的过程定义,提供了用于完成常见任务的实用的高级函数、方法和语法。CasperJS 本身的功能很强大,内置了两种引擎 PhantomJS 和 slimerjs 默认使用 PhantomJS ,具体详细的功能,大家可以参数这些官方网站去了解,或者加入 QQ群 389709524 一块讨论,今天的重点讨论如何快速的采集到异步加载的网页。
假如我们要采集dudu的这篇文章的评论 http://www.cnblogs.com/dudu/p/csharp-unicode-utf8.html,这篇文章查看源码是找不到这两条评论的,我们通过httpwebrequest也是获取不到的,这个时候我们通过casperjs就非常容易了。
caperjs代码定义如下:
结果如下:
![](https://img-blog.csdn.net/20170305123930063?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpeWVjaGVuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170305123943672?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VpeWVjaGVuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这样几行轻松的代码就获取到了异步加载的html代码了,是不是很简单,速度也是很快!
当然在实际生产环境中这个还远远不够,我们要考虑各种网站的情景和各种网络状况,比如要考虑网络超时,一个网页一分钟加载不了我们就认为超时了,不然会一直等待,还有我们要过滤一下对于我们采集无关的请求,比较谷歌统计,百度统计,广告等,这个往往会拖慢网页的加载速度,另外页面的css样式,图片我们通常也不需要,都可以忽略,综上所述,我们的代码扩展成这样子。
今天就介绍一下 CasperJS , CasperJS 是一个开源的导航脚本处理和测试工具,基于 PhantomJS 和 slimerjs (前端自动化测试工具)编写。CasperJS简化了完整的导航场景的过程定义,提供了用于完成常见任务的实用的高级函数、方法和语法。CasperJS 本身的功能很强大,内置了两种引擎 PhantomJS 和 slimerjs 默认使用 PhantomJS ,具体详细的功能,大家可以参数这些官方网站去了解,或者加入 QQ群 389709524 一块讨论,今天的重点讨论如何快速的采集到异步加载的网页。
假如我们要采集dudu的这篇文章的评论 http://www.cnblogs.com/dudu/p/csharp-unicode-utf8.html,这篇文章查看源码是找不到这两条评论的,我们通过httpwebrequest也是获取不到的,这个时候我们通过casperjs就非常容易了。
caperjs代码定义如下:
var fs = require('fs'); var casper = require('casper').create({ pageSettings: { loadImages: false, loadPlugins: false }, logLevel: "debug",//日志等级 verbose: true, // 记录日志到控制台 }); var url = casper.cli.raw.get('url'); //请求页面 casper.start(url, function () { fs.write("temp.html", this.getHTML(), 'w'); }); casper.run();
结果如下:
这样几行轻松的代码就获取到了异步加载的html代码了,是不是很简单,速度也是很快!
当然在实际生产环境中这个还远远不够,我们要考虑各种网站的情景和各种网络状况,比如要考虑网络超时,一个网页一分钟加载不了我们就认为超时了,不然会一直等待,还有我们要过滤一下对于我们采集无关的请求,比较谷歌统计,百度统计,广告等,这个往往会拖慢网页的加载速度,另外页面的css样式,图片我们通常也不需要,都可以忽略,综上所述,我们的代码扩展成这样子。
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();
相关文章推荐
- 异步网页采集利器CasperJs
- Fiddler 网页采集抓包利器
- 史林枫:开源HtmlAgilityPack公共小类库封装 - 网页采集(爬虫)辅助解析利器【附源码+可视化工具推荐】
- 多个账户模拟登录---c#异步模拟登录网站并采集网页
- HtmlAgilityPack——解析html和采集网页的神兵利器
- HtmlAgilityPack——解析html和采集网页的神兵利器
- HtmlAgilityPack——解析html和采集网页的神兵利器
- 网页采集利器 phpQuery
- 解析html和采集网页的神兵利器
- 多个账户模拟登录---c#异步模拟登录网站并采集网页
- 【Fiddler】网页采集必备抓包利器
- python 异步采集,网页爬虫编写 | 一步一步学python
- 工作记录:html网页采集利器:simple_html_dom,phpQuery
- Fiddler 网页采集抓包利器__手机app抓包
- 用groovy采集网页数据
- ThinkPHP Http工具类(用于远程采集 远程下载) phpSimpleHtmlDom采集类库_Jquery筛选方式 使用phpQuery轻松采集网页内容http://www.thinkphp.cn/extend/541.html
- php网页采集功能
- 利用nodejs+phantomjs+casperjs采集淘宝商品的价格
- Python网页信息采集:使用PhantomJS采集淘宝天猫商品内容
- 网页数据采集