基于node下的http小爬虫的示例代码


Posted in Javascript onJanuary 11, 2018

每时每刻不管你睡了还是没睡,互联网都会有海量的数据来来往往,有客服端到服务端,有服务端到服务端。http的get和request完成的角色即为数据的获取及提交,接下来我们动手写一个简单的小爬虫来爬爬菜鸟教程中关于node的章节的课程界面。

爬取Node.js 教程首页的所有数据

建立node-http.js,其中代码如下,代码中有详细的的注释,自行理解了哈

var http=require('http');//获取http模块
var url='http://www.runoob.com/nodejs/nodejs-tutorial.html';//定义node官网地址变量

http.get(url,function(res){
  var html='';

  // 这里将会触发data事件,不断触发不断跟新html直至完毕
  res.on('data',function(data){
    html +=data
  })

  // 当数据获取完成将会触发end事件,这里将会打印初node官网的html
  res.on('end',function(){
    console.log(html)
  })
}).on('error',function(){
  console.log('获取node官网相关数据出错')
})

终端执行结果中发现这个页面的html全部被爬下来了

G:\node\node-http> node node-http.js
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta property="qc:admins" content="465267610762567726375" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Node.js 教程 | 菜鸟教程</title>
<link rel='dns-prefetch' href='//s.w.org' />
<link rel="canonical" href="http://www.runoob.com/nodejs/nodejs-tutorial.html" />
<meta name="keywords" content="Node.js 教程,node,Node.js,nodejs">
<meta name="description" content="Node.js 教程  简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台
。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。  谁适合阅读本教程? 如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,..">
<link rel="shortcut icon" href="//static.runoob.com/images/favicon.ico" rel="external nofollow" rel="external nofollow" mce_href="//static.runoob.com/images/favicon.ico" rel="external nofollow" rel="external nofollow" type="image/x-icon">
<link rel="stylesheet" href="/wp-content/themes/runoob/style.css?v=1.141" rel="external nofollow" type="text/css" media="all" />
<link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="external nofollow" media="all" />
<!--[if gte IE 9]><!-->
。。。。。。。。。。
这里只展示部分不然你半天看不到头

当然爬个HTML对于我们来说没啥用,现在我们要做些过滤,比如这个node教程中我想知道课程目录有哪些,这样可以选择感兴趣的去看看学学。直接上代码吧还是:

不过在此之前我们需要下载cheerio模块(cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现。适合各种Web爬虫程序。)具体详细介绍你们可以自行去搜索了解,cheerio的用跟jquery的用法非常类似,所以不用担心上手繁琐。

PS G:\node\node-http> npm install cheerio

建立node-http-more.js,其中代码如下:

var http=require('http');//获取http模块
var cheerio=require('cheerio');//引入cheerio模块
var url='http://www.runoob.com/nodejs/nodejs-tutorial.html';//定义node官网地址变量
// filer node chapter
function filerNodeChapter(html){
  // 将爬取得HTML装载起来
  var $=cheerio.load(html);
  // 拿到左侧边栏的每个目录
  var nodeChapter=$('#leftcolumn a');
  //这里我希望我能获取的到的最终数据格式这个样子的,如此我们能知道每个目录的地址及标题
  /**
   * [{id:,title:}]
   */
  var chapterData=[];
  nodeChapter.each(function(item){
    // 获取每项的地址及标题
    var id=$(this).attr('href');
    var title=$(this).text();
    chapterData.push({
      id:id,
      title:title
    })
  })

  return chapterData;

}

//获取每个数据
function getChapterData(nodeChapter){
  nodeChapter.forEach(function(item){
    console.log(' 【 '+item.id+' 】'+item.title+'\n')
  });
}

http.get(url,function(res){
  var html='';

  // 这里将会触发data事件,不断触发不断跟新html直至完毕
  res.on('data',function(data){
    html +=data
  })

  // 当数据获取完成将会触发end事件,这里将会打印初node官网的html
  res.on('end',function(){
    //console.log(html)
    // 过滤出node.js的课程目录
    var nodeChapter= filerNodeChapter(html);

    //循环打印所获取的数据
    getChapterData(nodeChapter)
  })
}).on('error',function(){
  console.log('获取node官网相关数据出错')
})

终端执行结果及打印出课程目录

G:\node\node-http> node node-http-more.js
 【 /nodejs/nodejs-tutorial.html 】
Node.js 教程

 【 /nodejs/nodejs-install-setup.html 】
Node.js 安装配置

 【 /nodejs/nodejs-http-server.html 】
Node.js 创建第一个应用

 【 nodejs-npm.html 】 NPM 使用介绍

 【 nodejs-repl.html 】 Node.js REPL

 【 nodejs-callback.html 】 Node.js 回调函数

 【 nodejs-event-loop.html 】 Node.js 事件循环

 【 nodejs-event.html 】 Node.js EventEmitter

 【 nodejs-buffer.html 】 Node.js Buffer

 【 nodejs-stream.html 】 Node.js Stream

 【 /nodejs/nodejs-module-system.html 】
Node.js 模块系统
。。。。。。。。。。。
这里就不全部给出,你可以自己尝试着运行操作查看所有结果

到此一个简单的爬虫就写完了,赶紧自己动手试试吧,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
封装的原生javascript弹出层代码
Sep 24 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
Mar 15 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
javascript回调函数详解
Feb 06 Javascript
详解vue添加删除元素的方法
Jun 30 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
使用vue完成微信公众号网页小记(推荐)
Apr 28 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
Nov 07 Javascript
vue项目在webpack2实现移动端字体自适配功能
Jun 02 Javascript
swiper4实现移动端导航栏tab滑动切换
Oct 16 Javascript
JS脚本实现网页自动秒杀点击
Jan 11 #Javascript
Javascript网页抢红包外挂实现分享
Jan 11 #Javascript
JS写谷歌浏览器chrome的外挂实例
Jan 11 #Javascript
React 高阶组件入门介绍
Jan 11 #Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 #Javascript
Router解决跨模块下的页面跳转示例
Jan 11 #Javascript
vuex 使用文档小结篇
Jan 11 #Javascript
You might like
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
python del()函数用法
2013/03/24 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
python 实现图片批量压缩的示例
2020/12/18 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
学生喝酒检讨书
2014/02/06 职场文书
投诉书范文
2015/07/02 职场文书
校园安全主题班会
2015/08/12 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫