基于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通过phantomjs实现下载网页
May 04 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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/03/11 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
jQuery中children()方法用法实例
2015/01/07 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
详解python tkinter教程-事件绑定
2019/03/28 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
shell程序中如何注释
2012/01/28 面试题
机电专业个人求职信范文
2013/12/30 职场文书
外国人聘用意向书
2014/04/01 职场文书
员工团队活动方案
2014/08/28 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
2019年大学推荐信
2019/06/24 职场文书
800字作文之大雪
2019/12/04 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS