基于nodejs 的多页面爬虫实例代码

发布时间 - 2026-01-11 01:33:26    点击率:

前言

前端时间再回顾了一下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);

  }

 })

} 

测试:


可以感觉到速度还是比较快的。

 

完整地址。https://github.com/hua1995116/node-crawler/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# nodejs多页面爬虫  # nodejs  # 爬虫  # 基于nodejs的网络爬虫  # NodeJS制作爬虫全过程  # nodejs爬虫抓取数据乱码问题总结  # NodeJS制作爬虫全过程(续)  # nodeJs爬虫获取数据简单实现代码  # Nodejs爬虫进阶教程之异步并发控制  # nodeJS实现简单网页爬虫功能的实例(分享)  # nodejs爬虫抓取数据之编码问题  # nodejs爬虫遇到的乱码问题汇总  # nodejs爬虫初试superagent和cheerio  # nodejs制作小爬虫功能示例  # 递归  # 下载图片  # 感觉到  # 较快  # 绑定  # 大家多多  # 是否存在  # 再回  # 数为  # 超链接  # 下载完成  # 被屏蔽  # requestall  # filename  # body  # pre  # createWriteStream  # fs  # photo  # pipe 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel中间件如何使用_Laravel自定义中间件实现权限控制  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  b2c电商网站制作流程,b2c水平综合的电商平台?  网站制作免费,什么网站能看正片电影?  简单实现Android文件上传  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Java类加载基本过程详细介绍  原生JS实现图片轮播切换效果  如何续费美橙建站之星域名及服务?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何用y主机助手快速搭建网站?  python中快速进行多个字符替换的方法小结  如何安全更换建站之星模板并保留数据?  如何在万网利用已有域名快速建站?  如何在服务器上配置二级域名建站?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何注册花生壳免费域名并搭建个人网站?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何在景安服务器上快速搭建个人网站?  如何确保西部建站助手FTP传输的安全性?  js代码实现下拉菜单【推荐】  如何用PHP工具快速搭建高效网站?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何用PHP快速搭建CMS系统?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  IOS倒计时设置UIButton标题title的抖动问题  如何用虚拟主机快速搭建网站?详细步骤解析  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  深入理解Android中的xmlns:tools属性  JavaScript如何实现继承_有哪些常用方法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Laravel安装步骤详细教程_Laravel环境搭建指南  佛山网站制作系统,佛山企业变更地址网上办理步骤?  南京网站制作费用,南京远驱官方网站?  如何用IIS7快速搭建并优化网站站点?  Laravel如何实现多对多模型关联?(Eloquent教程)  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  如何快速配置高效服务器建站软件?  iOS UIView常见属性方法小结  高性能网站服务器部署指南:稳定运行与安全配置优化方案