18910140161

Casperjs实现完美网络爬虫

顺晟科技

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 : '请求数据。网址“跳过”)

}

});

通过上面的代码我们已经可以将整站的内容和页面都下载下来,可以稍作改动便可以实现自定义的功能。还有很多有意思的功能等待读者去探索。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航