基于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服务器(7):阻塞操作的实现
Dec 18 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
详解nodejs中express搭建权限管理系统
Sep 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
分分钟入门python语言
2018/03/20 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python 调试冷知识(小结)
2019/11/11 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Python @property装饰器原理解析
2020/01/22 Python
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
路政管理专业推荐信
2013/11/11 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
军事理论课感想
2015/08/11 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python