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实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
Jan 15 Javascript
Jquery实现视频播放页面的关灯开灯效果
May 27 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 Javascript
对angular4子路由&辅助路由详解
Oct 09 Javascript
clipboard在vue中的使用的方法示例
Oct 19 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
Nov 05 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
浅谈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
IStream与TStream之间的相互转换
2008/08/01 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
JQuery从头学起第三讲
2010/07/06 Javascript
JQuery小知识
2010/10/15 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
python中wheel的用法整理
2020/06/15 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
幼儿园小班教师寄语
2014/04/03 职场文书
2014年防汛工作总结
2014/12/08 职场文书
感谢信范文大全
2015/01/23 职场文书
不同意离婚上诉状
2015/05/23 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
新手必备Python开发环境搭建教程
2021/05/28 Python
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android