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 多种变量定义(对象直接量,数组直接量和函数直接量)
May 24 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
Jan 11 Javascript
javascript setinterval 的正确语法如何书写
Jun 17 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
12行javascript代码绘制一个八卦图
Apr 02 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
Aug 07 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
Jun 16 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
javascript实现扫雷简易版
Aug 18 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文本操作类
2006/11/25 PHP
apache rewrite_module模块使用教程
2008/01/10 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
php和html的区别点详细总结
2019/09/24 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
解决python3爬虫无法显示中文的问题
2018/04/12 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
纽约海:Sea New York
2018/11/04 全球购物
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
公开承诺书格式
2014/05/21 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书