node的api使用——URL——get方法——网页爬虫——node事件——path路径——判断文件类型——fs四种异步封装——客户端文件验证发送
Posted 勇敢*牛牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node的api使用——URL——get方法——网页爬虫——node事件——path路径——判断文件类型——fs四种异步封装——客户端文件验证发送相关的知识,希望对你有一定的参考价值。
这里写目录标题
URL
新建URL对象
const url=require("url");
var myUrl=new URL("http://10.9.63.202:3005?name=牛牛");
console.log(myUrl);
URL
href: 'http://10.9.63.202:3005/?name=%E7%89%9B%E7%89%9B',
origin: 'http://10.9.63.202:3005',
protocol: 'http:',
username: '',
password: '',
host: '10.9.63.202:3005',
hostname: '10.9.63.202',
port: '3005',
pathname: '/',
search: '?name=%E7%89%9B%E7%89%9B',
searchParams: URLSearchParams 'name' => '牛牛' ,
hash: ''
URL对象.searchParams
获取search内容
var url =require("url");
var str=new URL("https://www.163.com:4400/news/index.html?a=1&b=2#c");
console.log(str.searchParams);
console.log(str.searchParams.get("a"));
==============================================
输出:
URLSearchParams 'a' => '1', 'b' => '2'
1
合并路径
var url,resolve =require("url");
var c=resolve("http://localhost:4000","news");
console.log(c)
=================
输出
http://localhost:4000/news
解析url编码格式方法
decodeURIComponent()
encodeURIComponent()
parse:解析路径信息
const url = require('url')
const urlString = 'https://www.baidu.com:443/ad/index.html?id=8&name=牛牛#tag=1101'
const parsedStr = url.parse(urlString)
console.log(parsedStr)
Url
protocol: 'https:',
slashes: true,
auth: null,
host: 'www.baidu.com:443',
port: '443',
hostname: 'www.baidu.com',
hash: '#tag=1101',
search: '?id=8&name=牛牛',
query: 'id=8&name=牛牛',
pathname: '/ad/index.html',
path: '/ad/index.html?id=8&name=牛牛',
href: 'https://www.baidu.com:443/ad/index.html?id=8&name=牛牛#tag=1101'
爬虫实现基础
初始化工程
node中的 GET 请求获取 和前端的AJAX类似,但是不需要考虑通信中的跨域这样就可以成为一个爬虫的基础环境成立。
GET 主要用于请求远程服务的文件
http中的get方法和request方法
var get,request = require("https");
//解构:注意这两个方法在https下可以单独使用其方法
console.log(get,request);
============================
[Function: get] [Function: request]
get方法:参数一:请求路径,回调函数
var get,request = require("https")
get("https://www.smzdm.com/homepage/headline",async function(result)
/*result InCommingMessage 请求对象*/
/*从参数的使用也可推断出他是请求体对象*/
var data = await getData(result);
console.log(data);
)
function getData(req)
return new Promise((resolve,reject)=>
var _data = "";
req.on("data",_chunk=> _data+= _chunk);
req.on("end",()=>
try
_data = JSON.parse(_data);
catch(e)
resolve(_data)
);
)
总结:
get: 网页通常不含有请求的get方式,直接写入地址,请求就可以了
request : request 通常包含请求的数据发送还有请求的写入。既可以解决get问题也可以解决post问题。
- 如果要解决post问题时,需要发送数据,这时候需要给请求中设置headers属性,增加Content-Length
- 属性值就是 Buffer.byteLength(data)
- request会返回一个对象,只有使用end发送数据后才可以获取
网页 爬虫代码
var http = require("http");
var get=require("https");
http.createServer(async (req,res)=>
res.writeHead(200,
"Access-Control-Allow-Origin":"*",
"Content-Type":"text/html;charset=utf-8"
);
console.log(req.url.substr(1));//https://www.smzdm.com/homepage/headline
console.log(await getProxydata(req.url.substr(1)));
).listen(3000);
function getData(req)
return new Promise((resolve,reject)=>
var _data='';
req.on("data",(_chunk)=> _data += _chunk);
req.on("end",()=>
try
_data = JSON.parse(_data);
catch(e)
resolve(_data)
)
)
/*通过一次代理请求*/
function getProxydata(url)
return new Promise((resolve,rejcet)=>
/* get获取其他网页数据 */
get(url,async (req)=>
resolve(await getData(req))
)
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var xhr = new XMLHttpRequest();
xhr.addEventListener("load",loadHandler);
xhr.open("GET","http://localhost:3000/"+"https://www.smzdm.com/homepage/headline");
xhr.send();
function loadHandler(e)
</script>
</body>
</html>
事件
在node中不能操作bom和dom
但是node自己封装了一套事件的触发:
给对象添加事件;
通过-
来添加事件;
var Event = require("events");
var evt = new Event();
evt.on("abc",()=>
console.log("aoaoaoo");
)
evt.emit("abc")
但与ecms不同的是,触发事件可以传入参数;执行的函数就可以利用参数,到那时参数是逐个的传入,不能解构!!!,
事件也可以继承
事件传参
var Event = require("events");
var evt = new Event();
evt.on("abc",(o)=>
console.log("aoaoaoo",o);
)
evt.emit("abc",a:1,B:2)
/* aoaoaoo a: 1, B: 2 */
删除事件,和事件函数:就不能写匿名函数了
var Event = require("events");
var evt = new Event();
evt.on("abc",handler);
function handler(o)
console.log("aoaoaoo",o);
evt.off("abc",handler);
evt.emit("abc",a:1,B:2)
evt.emit("abc",a:1,B:2)//不再执行
事件只执行一次.once
var Event = require("events");
var evt = new Event();
evt.once("abc",handler);
function handler(o)
console.log("aoaoaoo",o);
evt.emit("abc",a:1,B:2)
evt.emit("abc",a:1,B:2)
path
路径主要是为了解决本地路径的拼接所需要的一个方法集
引入path
var path = require('path');
path.join
方法使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。
var path = require('path');
var str=path.join('/foo', 'bar', 'baz/asdf');
console.log(str);/* \\foo\\bar\\baz\\asdf */
path.dirname
返回路径中目录名
var path = require('path');
var str=path.join('/foo', 'bar', 'baz/asdf.txt');
console.log(path.dirname(str));/* \\foo\\bar\\baz */
path.extname
返回路径中的扩展名
var path = require('path');
var str=path.join('/foo', 'bar', 'baz/asdf.txt');
console.log(path.extname(str));/* .txt */
path.parse
将字符串对象转换为对象
var path = require('path');
var str=path.join('/foo', 'bar', 'baz/asdf.txt');
console.log(path.parse(str));
==============
输出:
root: '\\\\',
dir: '\\\\foo\\\\bar\\\\baz',
base: 'asdf.txt',
ext: '.txt',
name: 'asdf'
path.format
将path对象转换为字符串
var path = require('path');
var str=path.join('/foo', 'bar', 'baz/asdf.txt');
var obj=path.parse(str);
console.log(path.format(obj))/* \\foo\\bar\\baz\\asdf.txt */
__dirname和__filename
本地全局的当前文件夹地址和全局的当前文件路径和文件名
__dirname
:当前这个js所在路径
__filename
:当前这个js文件的目录
var path = require('path');
console.log(__dirname);/* E:\\--\\-----第二阶段\\练习\\0822\\nodeBase */
var str = path.join(__dirname,"/c.text");
console.log(str);/* E:\\--\\-----第二阶段\\练习\\0822\\nodeBase\\c.text */
console.log(__filename);
path.resolve()
获取当前文件的文件夹路径
var path = require("path")
console.log(path.resolve());/* E:\\-----\\第二阶段\\练习\\0822\\nodeBase */
注意的是在使用nodeTS
中ES6模块化时,__dirname
不能使用,需要使用path.resolve()
path.basename
获取当前路径下的文件名称
var str = path.basename("http://www.163.com/a.txt");
console.log(str);/* a.txt */
var str=path.basename("c:/a/b/c.txt");
console.log(str);/* a.txt */
判断文件类型的MIME 类型
npm i mime
或者在pack.json中添加:
"dependencies":
"mime":"^3.0.0"
,
引入:var mime = require("mime"); console.log(mime);
MIME 类型例如: “txt/html"
var mime = require("mime");//获取MiMie类型插件
console.log(mime.getType("C:/a/b/c/d.txt"));/* text/plain */
fs
原生的javascript没有操作这个文件的权利。但是nodejs有,对文件的操作。
但是这种fs提供的对文件的操作全是异步的操作。需要通过回调函数来去获取,输出之类的,但是为了更快的操作异步,node提供了一套更快的内容;
var fs = require("fs")
var fsp = require("fs/promises");//异步的fs
fs.mkdir
异步方法
创建文件夹
var fs = require("fs")
fs.mkdir('logs', (err) => //参数只有一个
console.log('done.')
)
./logs和上面的一样表示在当前目录下建立文件夹
../logs和表示在当前目录上一级建立文件夹
fs.mkdir('./logs', (err,resolut) =>
console.log(err,resolut)
)
fs.mkdir
异步方法
删除文件夹
fs.rmdir('logs', () =>
console.log('done.')
)
封装一个mkdir,rmdir的prmoise的函数
var fs = require("fs")
function mkdir(url)
return new Promise((reslove, reject) =>
// fs.mkdir(url,err=>
// console.log("done");
// )
fs.rmdir('logs', () =>
console.log('done.')
)
)
async function init(url)
await mkdir(url);
init("logs");
fs.existsSync
同步方法
判断路径是否存在
返回一Boolean值
if (fs.existsSync('path'))
console.log('该路径已存在');
fs.readFile
异步读取文件.注意地址中会有转义字符,所以\\使用的时候要多敲一个
- 异步读取方法1
var fs=require("fs");
fs.readFile("绝对路径/相对路径","utf8",function(err,data)
console.log(err);
console.log(data.toString());
)
- 异步读取方法2
npm install mz
var fs = require('mz/fs');
fs.readFile('./e.txt', 'utf-8').then(result =>
console.log(result);
)
- 异步读取方法3,封装;
var fs=require("fs");
function readFile(url,mime)
return new Promise((resolve,reject)=>
fs.以上是关于node的api使用——URL——get方法——网页爬虫——node事件——path路径——判断文件类型——fs四种异步封装——客户端文件验证发送的主要内容,如果未能解决你的问题,请参考以下文章