基于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 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
初探nodeJS
Jan 24 NodeJs
深入理解nodejs中Express的中间件
May 19 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 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 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
Python如何实现线程间通信
2020/07/30 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
学校门卫工作职责
2013/12/07 职场文书
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
运动会致辞稿50字
2014/02/04 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
写景作文评语集锦
2014/12/25 职场文书
房产公证书样本
2015/01/23 职场文书
年度考核个人总结
2015/03/06 职场文书
结婚典礼主持词
2015/06/29 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
iPhone13再次曝光
2021/04/15 数码科技
mysql中between的边界,范围说明
2021/06/08 MySQL
Python字符串常规操作小结
2022/04/03 Python