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四种异步封装——客户端文件验证发送的主要内容,如果未能解决你的问题,请参考以下文章

node中的url常用方法解析

Node.js GET/POST对应的url/query-string常用的方法介绍

使用 GET 方法在改造 url 中编码

vue项目开发api层架构

API-URL网址解析

使用 Express 写接口丨Node.js-初识 Express