基于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 相关文章推荐
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
js 浏览本地文件夹系统示例代码
Oct 24 Javascript
jQuery实现网页抖动的菜单抖动效果
Aug 07 Javascript
微信小程序前端源码逻辑和工作流
Sep 25 Javascript
webpack2.0配置postcss-loader的方法
Aug 17 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
Aug 22 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
纯js代码生成可搜索选择下拉列表的实例
Jan 11 Javascript
学习jQuery中的noConflict()用法
Sep 28 jQuery
vue 中使用 watch 出现了如下的报错的原因分析
May 21 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
JavaScript实现简易聊天对话框(加滚动条)
Feb 10 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 类型转换函数intval
2009/06/20 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
[JS]点出统计器
2020/10/11 Javascript
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
JsChart组件使用详解
2018/03/04 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
python获取中文字符串长度的方法
2018/11/14 Python
Python3模拟登录操作实例分析
2019/03/12 Python
python实现对输入的密文加密
2019/03/20 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
解决方案设计综合面试题
2015/08/31 面试题
新农村建设标语
2014/06/24 职场文书
认真学习保证书
2015/02/26 职场文书
行政司机岗位职责
2015/04/10 职场文书
毕业生政审意见范文
2015/06/04 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
Oracle中DBLink的详细介绍
2022/04/29 Oracle
keepalived + nginx 实现高可用方案
2022/12/24 Servers