基于nodejs 的多页面爬虫实例代码


Posted in NodeJs onMay 31, 2017

前言

前端时间再回顾了一下node.js,于是顺势做了一个爬虫来加深自己对node的理解。

主要用的到是request,cheerio,async三个模块

request

用于请求地址和快速下载图片流。 https://github.com/request/request

cheerio

为服务器特别定制的,快速、灵活、实施的jQuery核心实现.

便于解析html代码。 https://www.npmjs.com/package/cheerio

async

异步调用,防止堵塞。 http://caolan.github.io/async/

核心思路

  1. 用request 发送一个请求。获取html代码,取得其中的img标签和a标签。
  2. 通过获取的a表情进行递归调用。不断获取img地址和a地址,继续递归
  3. 获取img地址通过request(photo).pipe(fs.createWriteStream(dir + “/” + filename));进行快速下载。
function requestall(url) {

 request({

  uri: url,

  headers: setting.header

 }, function (error, response, body) {

  if (error) {

   console.log(error);

  } else {

   console.log(response.statusCode);

   if (!error && response.statusCode == 200) {

    var $ = cheerio.load(body);

    var photos = [];

    $('img').each(function () {

     // 判断地址是否存在

     if ($(this).attr('src')) {

      var src = $(this).attr('src');

      var end = src.substr(-4, 4).toLowerCase();

      if (end == '.jpg' || end == '.png' || end == '.jpeg') {

       if (IsURL(src)) {

        photos.push(src);

       }

      }

     }

    });

    downloadImg(photos, dir, setting.download_v);

    // 递归爬虫

    $('a').each(function () {

     var murl = $(this).attr('href');

     if (IsURL(murl)) {

      setTimeout(function () {

       fetchre(murl);

      }, timeout);

      timeout += setting.ajax_timeout;

     } else {

      setTimeout(function () {

       fetchre("http://www.ivsky.com/" + murl);

      }, timeout);

      timeout += setting.ajax_timeout;

     }

    })

   }

  }

 });

}

防坑

1.在request通过图片地址下载时,绑定error事件防止爬虫异常的中断。

2.通过async的mapLimit限制并发。

3.加入请求报头,防止ip被屏蔽。

4.获取一些图片和超链接地址,可能是相对路径(待考虑解决是否有通过方法)。

function downloadImg(photos, dir, asyncNum) {

 console.log("即将异步并发下载图片,当前并发数为:" + asyncNum);

 async.mapLimit(photos, asyncNum, function (photo, callback) {

  var filename = (new Date().getTime()) + photo.substr(-4, 4);

  if (filename) {

   console.log('正在下载' + photo);

   // 默认

   // fs.createWriteStream(dir + "/" + filename)

   // 防止pipe错误

   request(photo)

    .on('error', function (err) {

     console.log(err);

    })

    .pipe(fs.createWriteStream(dir + "/" + filename));

   console.log('下载完成');

   callback(null, filename);

  }

 }, function (err, result) {

  if (err) {

   console.log(err);

  } else {

   console.log(" all right ! ");

   console.log(result);

  }

 })

}

测试:

基于nodejs 的多页面爬虫实例代码

可以感觉到速度还是比较快的。

基于nodejs 的多页面爬虫实例代码 

完整地址。https://github.com/hua1995116/node-crawler/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
详解nodeJS之路径PATH模块
May 31 #NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 #NodeJs
nodejs操作mysql实现增删改查的实例
May 28 #NodeJs
详解nodejs微信jssdk后端接口
May 25 #NodeJs
mac下的nodejs环境安装的步骤
May 24 #NodeJs
Nodejs搭建wss服务器教程
May 24 #NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 #NodeJs
You might like
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php生成圆角图片的方法
2015/04/07 PHP
JavaScript 继承详解(一)
2009/07/13 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
Python中使用中文的方法
2011/02/19 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
python的命名规则知识点总结
2019/10/04 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
终端业务员岗位职责
2013/11/27 职场文书
上班打牌检讨书
2014/02/07 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
工作证明英文模板
2014/10/21 职场文书
文明单位汇报材料
2014/12/24 职场文书
教师求职信怎么写
2015/03/20 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书