【学习前端第四十九课】 nodejs第三方模块

本文介绍了Node.js开发中如何使用npm管理第三方模块,包括package.json的创建与使用,npm安装、查看和卸载包,以及axios和cheerio在数据抓取中的应用。重点讲解了如何通过npm配置国内镜像和利用axios抓取数据并解析HTML内容,以及使用cheerio提取所需信息。
摘要由CSDN通过智能技术生成

nodejs第三方模块

之前我们学习过内置模块,其实node有大量的第三方模块提供给我们使用,例如,数据请求的axios,抓包分析的cheerio,例如操作数据的mysql,还有实现MVC开发的express或KOA等

这些第三方模块有一个专门的管理工具叫npm,在安装node.js的时候已经自带安装了这个工具

network package manager

npm工具

nodejs是以文件夹为单位来管理项目的,所以我们在学习过程中不要再编译器里面打开太多的项目

npm的初始化

nodejs是为文件夹为单位来管理项目的,如果当前的文件夹是一个node项目则应该先进行初始化操作,初始化操作命令

npm init   

在node开发中使用npm init之后会生成一个package.json的文件,这个文件主要是用来记录当前项目的详细信息,它还会将我们在项目中所要使用到的包,都会详细记录在这个文件当中,方便以后的版本迭代和项目移植的时候会更加方便,防止在后期的项目维护当中误删除了一个包导致项目不能正常运行,初始化还有一个好处,就是在进行项目传递的时候步需要将项目的依赖包一起发给对方,对象只需要在接收你的项目之后执行npm init 旧可以将项目依赖全部下载到项目内

在项目初始化的时候会让你填写一些东西

1、package name : 项目名称

2、version : 版本号,按照你自己的项目规划来填写,不写默认就是1.0.0

3、description:项目简介

4、entry point:项目的入口文件

5、test command:项目的启动时要执行的命令,默认是node xxx.js

6、git repositiory :如果你要将项目上传到git中的话,那么就需要你的git仓库地址

7、keywords:项目关键字

8、author:项目作者

9、license:发行所需要的证书

当以上执行完毕之后,我们就可以在当前的文件夹内看到一个叫做 package.json的文件,这个文件记录你初始化的信息

远端仓库npmjs

有一个网站上面保留了我们所有的第三方模块,这个网站是www.npmjs.com

我们可以根据自己的需求来查找相关的包信息

npm info 查看包的信息

我们可以通过网站来查看包信息,也可以通过自带的控制台命令来查看包

npm info 包名称
npm install 安装包
npm install 包名称

当你把包下载完之后,所有的包都会在一个node_modules文件夹里面,这个文件夹里面会存放所有的第三方模块信息

–save 记录安装信息

当我们使用npm install安装第三方包的时候,我们会直接下载下来的模块放在node_modules文件夹里面,但是会有个问题,如果后期项目大了,使用很多的第三方包,这个时候,我们自己都不知道自己装了多少包

所以每次远程安装开发包的下载安装信息我们要记录下来

npm install 包名称 --save

这个代表本次的安装信息记录在当前的项目的配置文件package.json里面,这个生产依赖

npm install 包名称 --save-dev
根据package.json记录信息重构包

当别人拿到这个nodejs项目的时候是不能直接运行的,因为里面使用了第三方包,在package.json当中记录了每一次的安装信息,那么,在后期在构建这个项目的时候只需要执行以下命令

npm install
安装指定版本

我们在安装远程包的时候,默认安装的都是最新的版本,如果要执行安装版本

npm install bootstrap@3 --save

上面的命令就相当于是把bootstrap以3开头的版本安装

npm uninstall卸载包
npm uninstall 包名称

卸载完之后,配置文件package.json当中的记录信息也会同步删除

npm的国内镜像设置
npm config set registry https://registry.npm.taobao.org
npm config set disturl https://npm.taobao.org/dist
npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/

当执行完上面的命令之后,我们就把地址换成了国内的镜像地址【上面的指令依次执行就可以了,它会一直生效】

当执行完毕之后,我们可以通过 npm config list --json 来查看是否成功

使用axios + cheerio完成数据抓取

完成当前功能需要使用到这两个包

1、axios这是一个夸平台的包,可以在node平台使用,也可以在浏览器环境下使用,这是当下比较主流一个包,专门做http/https数据请求的

2、cherrio包,这个包就相当于一个jQuery一样的东西,可以把一个html文档加载进入,然后使用之前学习过的jQuery的语法来获取所需要的信息

//第一步:导包(载入模块)
const axios = require("axios");

//第二步:准备要请求的地址
let ul = `https://v.qq.com/channel/tv?listpage=1&channel=tv&feature=9`;

const getData = async () => {
	//第三步:模拟请求,打开地址
	let resp = await axios.get(ul);
	//第四步:服务器响应的数据在resp的data当中
	console.log(resp.data);
}

getData();

经过上面的代码,我们可以道德服务器返回的数据,这个数据是一个浏览器请求一个网站以后返回的结果,我们可以看做事一个html字符串

1、axios事用于模拟模拟请求

2、axios事基于Promise技术,所以我们可以受用await来实现异步

3、请求结果在resp,返回的数据部分在其中的data属性中

//第一步:导包(载入模块)
const axios = require("axios");
const path = require("path");
const fs = require("fs");
const cheerio = require("cheerio");



const getData = async () => {
	try{
		let result = [];
		//第二步:准备要请求的地址
		let ul = `https://v.qq.com/channel/tv?listpage=1&channel=tv&feature=9`;
		//第三步:模拟请求
		let resp = await axios.get(ul);
		//第四步:使用cheerio加载结果
		let $ = cheerio.load(resp.data);
		//第五步:分析数据
		$(".card-list-wrap>.card").each((index,item) => {
			let obj = {};
			obj.href = $(item).attr("href");
			obj.title = $(item).find(".title").text();
			obj.desc = $(item).find(".sub-title").text();
			obj.tag = $(item).find(".right-bottom-text").text();
			obj.imgSrc = $(item).find(".subscript").attr("src");
			result.push(obj);
		})
		fs.writeFileSync(path.join(__dirname,"/result.txt"),JSON.stringify(result),{encoding:"utf8"});
		console.log("数据写入成功")
	}catch(error){
		console.log("数据请求失败",error)
	}
}

getData();

在上面的代码里面,我们在之前的代码上面分析了得到请求结果的字符串,然后使用cheerio来转换成了DOM结构分析,最后将我们所需的信息保存到cheerio这个包的对象中,将对象存放在数组中,最后换成成JSON字符串保存到文件内部

抓取图片
//第一步:导包(载入模块)
const axios = require("axios");
const path = require("path");
const fs = require("fs");
const cheerio = require("cheerio");



const getData = async () => {
	try{
		let result = [];
		//第二步:准备要请求的地址
		let ul = `https://v.qq.com/channel/tv?listpage=1&channel=tv&feature=9`;
		//第三步:模拟请求
		let resp = await axios.get(ul);
		//第四步:使用cheerio加载结果
		let $ = cheerio.load(resp.data);
		//第五步:分析数据
		$(".mod_figure>.list_item").each((index,item) => {
			let obj = {};
			obj.href = $(item).children("a").attr("href");
			obj.title = $(item).children("a").attr("title");
			obj.desc = $(item).find(".figure_desc").text();
			obj.tag = $(item).find(".figure_caption").text();
			obj.imgSrc = $(item).find(".figure_pic").attr("src");
			result.push(obj);
		})
		fs.writeFileSync(path.join(__dirname,"/result.txt"),JSON.stringify(result),{encoding:"utf8"});
		console.log("数据写入成功");
		//数据抓取完毕,我们要去下载图片了,任然使用axios
		for(let item of result){
			//遍历所有的图片地址同时拼接
			let u2 = `https:${item.imgSrc}`;
			//这里要注意:之前请求网页的时候返回的是文字,但是现在我们需要请求返回的是图片
			//图片是无法用文字表示的
			let p = await axios.get(u2,{responseType:"stream"});
			let currentImgPath = path.join(__dirname,`/movieImgs/${item.title}.png`);
			//将图片变成一个写入流,可以通过这个流向文件里面写入数据
			let currentImgStream = fs.createWriteStream(currentImgPath);
			//两个流对接
			p.data.pipe(currentImgStream);
			console.log("图片下载成功");
		}
	}catch(error){
		console.log("数据请求失败",error)
	}
}

getData();

在这个代码里面,主要两个技术

1、在axios的请求过程中,我们把响应的数据类型变成了stream

2、我们使用文件流 fs.createWriteStream 方法来写入文件数据

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值