基于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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
PHP递归算法的简单实例
2019/02/28 PHP
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
python实现文本界面网络聊天室
2018/12/12 Python
Python docx库用法示例分析
2019/02/16 Python
python列表推导式操作解析
2019/11/26 Python
Python运行DLL文件的方法
2020/01/17 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
高校十八大报告感想
2014/01/27 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
2014年预算员工作总结
2014/12/05 职场文书
2014年科普工作总结
2014/12/06 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers