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获取元素在浏览器中的绝对位置
Jul 24 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
jQuery截取指定长度字符串代码
Aug 21 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
使用jQuery制作浮动工具栏的实例分享
May 13 Javascript
用js实现放大镜的效果的简单实例
May 23 Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 Javascript
jQuery实现一个简单的验证码功能
Jun 26 jQuery
js链表操作(实例讲解)
Aug 29 Javascript
node(koa2) web应用模块介绍详解
Mar 29 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 Javascript
axios如何取消重复无用的请求详解
Dec 15 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 adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
php多重接口的实现方法
2015/06/20 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
详解JavaScript函数
2015/12/01 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
js实现登录与注册界面
2017/11/01 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Django 静态文件配置过程详解
2019/07/23 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
学院书画协会部门岗位职责
2013/12/01 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
高中开学感言
2015/08/01 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python