顺晟科技
2021-06-16 10:35:55
267
“Casperjs”是一个基于PhantomJs(webkit)和SlimerJs(Gecko)的导航脚本和测试套件。“CasperJS”简化了完整导航场景的过程定义,并为完成常见任务提供了实用的功能、方法和语法。本文主要研究Casperjs在网络爬虫中的应用和实现。
目前,网络爬虫的实现主要是将网站的静态资源请求到本地,并利用定期匹配等技术手段对静态资源进行过滤和替换,以获得想要的内容。这种爬虫实现无法解决js计算结果的利用率,也无法得到ajax网络请求的结果。
Casperjs的工作原理:用不带接口的浏览器加载页面,通过流水线代码驱动页面的浏览行为,获取页面元素和内容,支持事件调用等页面事件行为。可以利用“Casperjs”的特性开发自己的网络爬虫应用,获取当前网络爬虫难以获取的资源。
var casper=require('casper ')。create();
Casper . start();
Casper . ThEnopen(' http://www . Baidu.com/',function () {
Casper . CaptureSelector(' Baidu . png ',' html ');
});
Casper . run();
一个简单的示例演示了该函数:
创建“casperjs”实例需要(' casper ')。create()可以理解为一个浏览器进程
打开一页Casper。然后打开(.);
捕获页面图像casper.captureSelector
将以上代码保存为baidu.js,然后运行casperjs baidu.js,可以看到运行结果:
接下来,实现了从全站下载的网络爬虫的应用。应用原理:通过“casperjs”创建一个浏览器进程,保存加载的网络资源(css、js、其他文章链接等)。)本地。
使用的技术要点:
下载界面
函数签名:download(字符串URL,字符串目标[,字符串方法,对象数据]);要成功调用此函数,必须关闭web安全设置,在关闭方法调用脚本时直接指定选项—web-security=no,或者设置Casper。page . settings . websecurityenabled在脚本中=false
负载网络资源事件监控
收听resource.received,当听到文档资源时,将相应的文档资源以指定的格式保存在本地;
辅助套件
用于调试接收到的内容格式。在脚本的开头要求(' utils ' '),在要调试的地址调用utils.dump。
在开始之前,介绍一个转换网址的函数:
函数parseURL(url) {
var a=document . CreateElement(' a ');
a.href=url
返回{
source: url,
protocol : a . protocol . replace(' : ',''),
host: a.hostname,
port: a.port,
query: a.search,
params 3360(function(){
var ret={},
a.search.replace(/^\?/, '').拆分('),
len=seg.length,i=0,s;
for(;i leni ) {
if(!seg[i]) {
继续;
}
s=seg[i]。split('=');
ret[s[0]]=s[1];
}
ret返回;
})(),
文件:(a.pathname.match(/\/([^\/?#] )$/i) || [,' '])[1],
hash: a.hash.replace('# ',''),
路径: a.pathname.replace(/^([^\/])/,'/$1 '),
relative :(a . href . match(/TPS?\/\/[^\/] (.)/) || [, ''])[1],
a.pathname.replace(/^\//3360路段)。拆分('/')
};
}
传入一个URL,可以解析URL的所有部分,比如主机名、端口、搜索等。
脚本开始创建“casperjs”实例:
var utils=require(' utils ');
//下载安全性设置为false
var casper=require('casper ')。创建({
页面设置: {
webSecurityEnabled: false
},
onError:函数(self,msg) {
this . capture(' error . png ');
console . log(' error : ' msg);
//self . exit();
},
waitTimeout: 300000,
stepTimeout: 300000,
verbose: true,
日志级别: '调试'
});
Casper . user agent(' Mozilla/5.0(Macintosh;Intel MAC OS X 10 _ 7 _ 5)apple WebKit/537.4(KHTML,喜欢Gecko)chrome _ 6494 _ 1 . html ' target=' _ blank ' chrome/22 . 0 . 1229 . 94 Safari/537.4 ');
接下来,获取命令行参数:
var base URL=cashier . CLI . get(' URL ')//要下载的网站的URL
var base URL=cashier . CLI . get(' path ')//保存的目录
程序启动提示文本:
casper.start(baseUrl,function () {
这个。echo(这个。gettitle());
这个。echo(这个。getcurrentrol());
等等(30000)
});
核心代码:
casper.on('resource.received ',function (requestData) {
utils.dump(requestData)
URL obj=ParseURL(RequestData。网址)
if(urlObj。host==BaseurlObj。主机){
控制台。日志(' URL下载: ' RequestData。网址)
if(urlObj.path=='/'){
urlObj.path='/index.html '
}
this.download(requestData.url,基本路径urlobj。路径);
}else{
控制台。日志(' URL : '请求数据。网址“跳过”)
}
});
通过上面的代码我们已经可以将整站的内容和页面都下载下来,可以稍作改动便可以实现自定义的功能。还有很多有意思的功能等待读者去探索。
17
2022-03
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06