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 相关文章推荐
比较全面的event对像在IE与FF中的区别 推荐
Sep 21 Javascript
JavaScript Math.floor方法(对数值向下取整)
Jan 09 Javascript
利用jquery实现下拉框的禁用与启用
Dec 07 Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 Javascript
weui框架实现上传、预览和删除图片功能代码
Aug 24 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
Dec 11 Javascript
vue中引入mxGraph的步骤详解
May 17 Javascript
微信小程序 WXML节点信息查询详解
Jul 29 Javascript
ES6中定义类和对象的方法示例
Jul 31 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 Javascript
js实现选项卡效果
Mar 07 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禁止页面缓存的代码
2011/10/23 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
vue购物车插件编写代码
2017/11/27 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
python去除文件中重复的行实例
2018/06/29 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python 循环数据赋值实例
2019/12/02 Python
python读取Kafka实例
2019/12/23 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
单位活动策划方案
2014/08/17 职场文书
三八妇女节标语
2014/10/09 职场文书
2014年科普工作总结
2014/12/06 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
2016高考感言
2015/08/01 职场文书
mysql脏页是什么
2021/07/26 MySQL