基于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 URL模块操作URL相关方法介绍
Mar 03 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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获取错误信息的方法
2015/07/17 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
php中namespace use用法实例分析
2016/01/22 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
python selenium xpath定位操作
2020/09/01 Python
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
酒店管理毕业生自我鉴定
2014/03/02 职场文书
大家访活动实施方案
2014/03/10 职场文书
婚礼秀策划方案
2014/05/19 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2015员工年度考核评语
2015/03/25 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL