基于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中的非阻塞方法介绍
Jun 05 NodeJs
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
NodeJs搭建本地服务器之使用手机访问的实例讲解
May 12 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 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
什么是短波收听SWL
2021/03/01 无线电
PHP中for循环语句的几种变型
2007/03/16 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
Node.js简单入门前传
2017/08/21 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
用Python编写web API的教程
2015/04/30 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
Python实现购物程序思路及代码
2017/07/24 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python常用编译器原理及特点解析
2020/03/23 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
校园安全标语
2014/06/07 职场文书
学校清明节活动总结
2014/07/04 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang