node.js学习笔记之koa框架和简单爬虫练习


Posted in Javascript onDecember 13, 2018

Koa -- 基于 Node.js 平台的下一代 web 开发框架

koa是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。开发思路和express差不多,最大的特点就是可以避免异步嵌套。koa2利用ES7的async/await特性,极大的解决了我们在做nodejs开发的时候异步给我们带来的烦恼。

英文官网:http://koajs.com

中文官网:http://koajs.cn

1.koa

安装koa包: npm i -S koa@latest
引入: const koa = require("koa");
实例化对象: const app = new koa;

通过实例操作,专门用于客户端请求的函数叫做中间件,使用use()注册

use()函数中必须使用异步 async; use可是调用无数次;

其中有两个参数:

a)ctx: 上下文环境,node的请求和响应对象,其中不建议使用node原生的req和res属性,使用koa封装的requset和response属性

b)next: next(),将本次控制权交给下一个中间件。

最后一个中间件使用next()无意义,执行完控制权返回上一层,直至第一个。

1. next参数的使用demo

const Koa = require("koa");
const koa = new Koa();
//中间件1
koa.use(async (ctx, next) => {
console.log("1 , 接收请求控制权");
await next(); //将控制权传给下一个中间件
console.log("1 , 返回请求控制权");
});    //将中间件注册到koa的实例上

//中间件2
koa.use(async (ctx, next) => {
 console.log("2 , 接收请求控制权");
await next();
console.log("2 , 返回请求控制权");
}); 

//中间件3
koa.use(async (ctx, next) => {
console.log("3 , 接收请求控制权");
 console.log("3 ,返回请求控制权");
});
koa.listen(3000, ()=>{
 console.log("开始监听3000端口");
});

注:当中间件中没有next(),不会执行下面的中间件

访问localhost:3000的效果图;

node.js学习笔记之koa框架和简单爬虫练习

注:会有两次操作是因为图标icon也会请求一次

2.ctx参数的使用demo

const Koa = require("koa");
const koa = new Koa(); 
koa.use(async (ctx, next)=>{
 ctx.body = "body可以返回数据,";
 ctx.body += "可以多次调用,";
 ctx.body += "不需要end()";
});
koa.listen(3000, ()=>{
 console.log("监听开始");
});

效果:

node.js学习笔记之koa框架和简单爬虫练习

ctx.url ,ctx.path ,ctx.query ,ctx.querystring ,ctx.state ,ctx.type

const Koa = require("koa");
const koa = new Koa(); 
koa.use(async (ctx, next)=>{
 ctx.body = ctx.url;
 ctx.body = ctx.path;
 ctx.body = ctx.query;
 ctx.body = ctx.querystring;
});
koa.listen(3000, ()=>{
 console.log("监听开始");
});

访问http://localhost:3000/path?name=sjl&age=18为例,效果图:

1. url: 整个路径

node.js学习笔记之koa框架和简单爬虫练习

2. path: 非查询部分

node.js学习笔记之koa框架和简单爬虫练习

3. query: 将查询部分转为JSON对象

node.js学习笔记之koa框架和简单爬虫练习

4. querystring: 将查询部分转为字符串

node.js学习笔记之koa框架和简单爬虫练习

5. ctx.state ,ctx.type 表示状态吗和类型

2.简单爬虫练习

安装request,cheerio模块

npm i -S request: 请求模块
npm i -S cheerio: 抓取页面模块(JQ核心)

抓取网页数据案例(随机网页)

//导入模块
const request = require("superagent"); //导入请求模块
const cheerio = require("cheerio");
const {join} = require("path");
const fs = require("fs");

let arr = [], //存放数据
 reg = /\n|\s+/g, //replace中使用
 url = "https://www.shiguangkey.com/course/search?key=%E5%89%8D%E7%AB%AF/";
request
 .get(url)
 .end((err, res) => {
  const $ = cheerio.load(res.text); //把字符串内的标签当成dom来使用
  $(".course-item").each((i, v) => {
   // v当前进来的dom,根据网页的布局结构来找到准确的dom节点
   const obj = {
    imgSrc : $(v).find("img").prop("src"),
    price : $(v).find(".fr span").text().replace(reg, ""),
    total : $(v).find(".item-txt").text().replace(reg, ""),
    href : join(url + $(v).find(".cimg").prop("href"))
   };
   console.log(join(url + $(v).find(".cimg").prop("href"))); //拼接
   arr.push(obj); //把对象放进数组里
  });
  
  fs.writeFile("./sjl.json", JSON.stringify(arr)); //将爬到的数据写入文档中
 });

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

Javascript 相关文章推荐
js检测客户端不是firefox则提示下载
Apr 07 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
May 26 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
Mar 14 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
Jul 10 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
JavaScript中获取HTML元素值的三种方法
Jun 20 Javascript
bootstrap中添加额外的图标实例代码
Feb 15 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 Javascript
uni-app 自定义底部导航栏的实现
Dec 11 Javascript
js正则匹配markdown里的图片标签的实现
Mar 24 Javascript
浅谈vuex actions和mutation的异曲同工
Dec 13 #Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 #Javascript
javascript对HTML字符转义与反转义
Dec 13 #Javascript
Web安全之XSS攻击与防御小结
Dec 13 #Javascript
JavaScript实现邮箱后缀提示功能的示例代码
Dec 13 #Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 #Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
Dec 13 #Javascript
You might like
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
JS控制表格隔行变色
2006/06/26 Javascript
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
Javascript 遍历对象中的子对象
2009/07/03 Javascript
javascript 闭包
2011/09/15 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
多个应用共存的Django配置方法
2018/05/30 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
如何运行带参数的python脚本
2019/11/15 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
工地门卫岗位职责
2013/12/30 职场文书
大型会议接待方案
2014/03/01 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书