基于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 sublime text 3安装与配置
Jun 19 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
JavaScript对象学习经验整理
2013/10/12 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
详解Python发送邮件实例
2016/01/10 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
运动会广播稿150字
2014/02/19 职场文书
家长通知书家长评语
2014/04/17 职场文书
党委班子剖析材料
2014/08/21 职场文书
社区党员公开承诺书
2014/08/30 职场文书
2015年企业新年寄语
2014/12/08 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
离职感谢信怎么写
2015/01/22 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
百年孤独读书笔记
2015/06/29 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL