首页 > 上网技巧 > 电脑小技巧 > Casperjs实现完美网络爬虫

Casperjs实现完美网络爬虫

时间:2020-05-23 08:56 作者:QQ地带 我要评论

「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」实例 require('casper').create(),可以理解为一个浏览器进程
打开一个页面 casper.thenOpen(...);
截取页面图像 casper.captureSelector
将上述代码保存为 baidu.js,然后运行 casperjs baidu.js,便可以看到运行结果:
接下来实现一个整站下载的网络爬虫的应用。应用原理:通过「casperjs」创建一个浏览器进程,并将加载的网络资源(css,js,其他文章的链接等)保存到本地。
使用到的技术要点:
 
download接口
函数签名: download(String url, String target[, String method, Object data]);要成功调用该函数,必须关闭 web security 设置,关闭方法调用脚本时直接指定选项 —web-security=no, 或者在脚本中设置casper.page.settings.webSecurityEnabled = false;
加载网络资源事件监控
监听 resource.received,当监听到文档资源,就将对应的文档资源按照指定的格式保存到本地;
辅助套件
用来调试接收到的内容格式。在脚本开头 require(‘utils’),需要调试的地址调用 utils.dump。
开始之前介绍一个转换 url 的函数:
 
function parseURL(url) {
   var a = document.createElement('a');
   a.href = url;
   return {
   source: url,
   protocol: a.protocol.replace(':', ''),
   host: a.hostname,
   port: a.port,
   query: a.search,
   params: (function () {
   var ret = {},
    seg = a.search.replace(/^\?/, '').split('&'),
    len = seg.length, i = 0, s;
  for (; i < len; i++) {
    if (!seg[i]) {
      continue;
    }
    s = seg[i].split('=');
    ret[s[0]] = s[1];
  }
  return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
hash: a.hash.replace('#', ''),
path: a.pathname.replace(/^([^\/])/, '/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
segments: a.pathname.replace(/^\//, '').split('/')
};
}
传入一个网址,可以解析网址的各个部分,hostname,port,search等
 
脚本开始创建「casperjs」实例:
 
var utils = require('utils');
//下载security 设置为false
var casper = require('casper').create({
pageSettings: {
 webSecurityEnabled: false
},
onError: function (self, msg) {
  this.capture('error.png');
  console.log('error: ' + msg);
 // self.exit();
},
waitTimeout: 300000,
stepTimeout: 300000,
verbose: true,
logLevel: "debug"
});
casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) chrome_6494_1.html' target='_blank'>Chrome/22.0.1229.94 Safari/537.4');
 
接下来获取命令行参数:
 
var baseUrl = casper.cli.get('url') //要下载网站的网址
var baseUrl = casper.cli.get('path') //保存的目录
程序开始提示性文字:
 
casper.start(baseUrl, function () {
    this.echo(this.getTitle());
    this.echo(this.getCurrentUrl());
    this.wait(30000)
    });
 
核心代码:
 
casper.on('resource.received', function (requestData) {
utils.dump(requestData)
urlObj = parseURL(requestData.url)
if (urlObj.host == baseUrlObj.host) {
     console.log('url download:' + requestData.url)
if(urlObj.path == '/'){
  urlObj.path = '/index.html'
}
this.download(requestData.url, basePath + urlObj.path);
}else{
console.log('url:' + requestData.url + ' skip')
}
});
 
通过上面的代码我们已经可以将整站的内容和页面都下载下来,可以稍作改动便可以实现自定义的功能。还有很多有意思的功能等待读者去探索。

标签: casperjs
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告