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动画效果代码3
Apr 03 Javascript
JavaScript的public、private和privileged模式
Dec 28 Javascript
Javascript Object.extend
May 18 Javascript
javascript最常用与实用的创建类的代码
Aug 12 Javascript
JQuery中使用ajax传输超大数据的解决方法
Jul 14 Javascript
jQuery拖拽插件gridster使用指南
Apr 21 Javascript
jQuery实现向下滑出的二级菜单效果实例
Aug 22 Javascript
JQuery DIV 动态隐藏和显示的方法
Jun 23 Javascript
JavaScript基本类型值-Number类型
Feb 24 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
Aug 08 Javascript
JS的函数调用栈stack size的计算方法
Jun 24 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 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
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
python版百度语音识别功能
2019/07/09 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
档案检查欢迎词
2014/01/13 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
2014年项目工作总结
2014/11/24 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
Python实现天气查询软件
2021/06/07 Python
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫
python字符串的一些常见实用操作
2022/04/06 Python