node.js爬虫框架node-crawler初体验


Posted in Javascript onOctober 29, 2020

百度爬虫这个词语,一般出现的都是python相关的资料。

py也有很多爬虫框架,比如scrapy,Portia,Crawley等。

之前我个人更喜欢用C#做爬虫。

随着对nodejs的熟悉。发现做这种事情还是用脚本语言适合多了,至少不用写那么多的实体类。而且脚本一般使用比较简单。

在github上搜索node+spider,排名第一的就是node-crawler 

github:https://github.com/bda-research/node-crawler

简单使用

npm 安装:

npm install crawler

new一个crawler对象

var c = new Crawler({
 // 在每个请求处理完毕后将调用此回调函数
 callback : function (error, res, done) {
  if(error){
   console.log(error);
  }else{
   var $ = res.$;
   // $ 默认为 Cheerio 解析器
   // 它是核心jQuery的精简实现,可以按照jQuery选择器语法快速提取DOM元素
   console.log($("title").text());
  }
  done();
 }
});

然后往crawler队列里面不停的加url就行了,

// 将一个URL加入请求队列,并使用默认回调函数
c.queue('http://www.amazon.com');

// 将多个URL加入请求队列
c.queue(['http://www.google.com/','http://www.yahoo.com']);

控制并发速度

爬虫框架一般都是同时去爬多个页面,但是速度过快会触发目标网站的反爬虫机制,也同时影响别人网站的性能。

控制最大的并发数量

var c = new Crawler({
 // 最大并发数默认为10
 maxConnections : 1,

 callback : function (error, res, done) {
  if(error){
   console.log(error);
  }else{
   var $ = res.$;
   console.log($("title").text());
  }
  done();
 }
});

使用慢速模式

使用参数 rateLimit 启用慢速模式,两次请求之间会闲置 rateLimit 毫秒,而 maxConnections 将被强行修改为 1 。

var c = new Crawler({
 // `maxConnections` 将被强制修改为 1
 maxConnections : 10,

 // 两次请求之间将闲置1000ms
 rateLimit: 1000,

 callback : function (error, res, done) {
  if(error){
   console.log(error);
  }else{
   var $ = res.$;
   console.log($("title").text());
  }
  done();
 }
});

下载图片等静态文件

var c = new Crawler({
 encoding:null,
 jQuery:false,// set false to suppress warning message.
 callback:function(err, res, done){
  if(err){
   console.error(err.stack);
  }else{
   fs.createWriteStream(res.options.filename).write(res.body);
  }
  
  done();
 }
});

c.queue({
 uri:"https://nodejs.org/static/images/logos/nodejs-1920x1200.png",
 filename:"nodejs-1920x1200.png"
});

以上就是node.js爬虫框架node-crawler初体验的详细内容,更多关于爬虫框架node-crawler的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
ExtJS 2.0实用简明教程之应用ExtJS
Apr 29 Javascript
javascript getElementsByClassName函数
Apr 01 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
jQuery网页版打砖块小游戏源码分享
Aug 20 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
Dec 15 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
Jun 02 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
基于vue开发的在线付费课程应用过程
Jan 25 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
vue基础之v-bind属性、class和style用法分析
Mar 11 Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 Javascript
vue基础知识--axios合并请求和slot
Jun 04 Javascript
JavaScript实现网页计算器功能
Oct 29 #Javascript
Javascript数组及类数组相关原理详解
Oct 29 #Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
Oct 29 #Javascript
node.js如何操作MySQL数据库
Oct 29 #Javascript
TypeScript魔法堂之枚举的超实用手册
Oct 29 #Javascript
解决antd的Form组件setFieldsValue的警告问题
Oct 29 #Javascript
vue 函数调用加括号与不加括号的区别
Oct 29 #Javascript
You might like
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
第九节 绑定 [9]
2006/10/09 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
PHP里的中文变量说明
2011/07/23 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
js获取Get值的方法
2016/09/29 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
Python生成验证码实例
2014/08/21 Python
Python set集合类型操作总结
2014/11/07 Python
浅析Python中的多重继承
2015/04/28 Python
一份python入门应该看的学习资料
2018/04/11 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
一套Java笔试题
2016/08/20 面试题
软件测试常见笔试题
2012/02/04 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
酒店员工检讨书
2014/02/18 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
法语专业求职信
2014/07/20 职场文书
体育个人工作总结
2015/02/09 职场文书
导游词之唐山景点
2019/12/18 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Python道路车道线检测的实现
2021/06/27 Python