基于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 自动完成脚本整理(33个)
Oct 20 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
Jan 16 Javascript
jQuery实现折叠、展开的菜单组效果代码
Sep 16 Javascript
jQuery判断浏览器并动态调整select宽度的方法
Mar 02 Javascript
Javascript 对cookie操作详解及实例
Dec 29 Javascript
RequireJs的使用详解
Feb 19 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
代码详解javascript模块加载器
Mar 04 Javascript
JS监听滚动和id自动定位滚动
Dec 18 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
Vue+element+cookie记住密码功能的简单实现方法
Sep 20 Javascript
前端vue如何使用高德地图
Nov 05 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
Zend引擎的发展 [15]
2006/10/09 PHP
一个好用的分页函数
2006/11/16 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
JS常用算法实现代码
2016/11/14 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
Python实现获取命令行输出结果的方法
2017/06/10 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
学生的自我鉴定范文
2013/10/24 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
高中生逃课检讨书
2014/10/10 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
婚姻出轨保证书
2015/05/08 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
Python移位密码、仿射变换解密实例代码
2021/06/27 Python