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 相关文章推荐
javascript 自动填写表单的实现方法
Apr 09 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
Sep 19 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
Mar 05 Javascript
Javascript页面添加到收藏夹的简单方法
Aug 07 Javascript
Jquery实现搜索框提示功能示例代码
Aug 13 Javascript
js获取域名的方法
Jan 27 Javascript
js实现显示当前状态的导航效果代码
Aug 28 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
js CSS3实现卡牌旋转切换效果
Jul 04 Javascript
vue router 配置路由的方法
Jul 26 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
php生成随机数或者字符串的代码
2008/09/05 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
Python断言assert的用法代码解析
2018/02/03 Python
Python转换时间的图文方法
2019/07/01 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
python多线程使用方法实例详解
2019/12/30 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
品管员岗位职责
2013/11/10 职场文书
财务部岗位职责
2013/11/19 职场文书
八年级音乐教学反思
2014/01/09 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
本科生求职信
2014/06/17 职场文书
python munch库的使用解析
2021/05/25 Python
浅谈Python响应式类库RxPy
2021/06/14 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电