欢迎访问 如意编程网!

如意编程网

当前位置: 首页 > 编程资源 > 综合教程 >内容正文

综合教程

NodeJS概述2-事件插件-简易爬虫

发布时间:2023/10/11 综合教程 17 老码农
如意编程网 收集整理的这篇文章主要介绍了 NodeJS概述2-事件插件-简易爬虫 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

事件 events 模块

原生事件写法

  /*
* 1. 事件分类
* DOM0级 事件 - on + eventType
* DOM2级 事件 - 事件监听
* 2. 事件构成部分有哪些? dom.onclick = function () {}
* 事件源
* 事件类型 click change ...
* 事件处理程序
* 3. 事件绑定形式有哪些?
* dom.onclick = function () {}
* 事件监听 dom.addEventListener('click',function(){},false)
* 元素绑定 <div onclick = "load()"></div>
*/

Node.js 事件驱动

  1. 问题: Node.js中有DOM吗?

    • 没有
    • 结论: 原生js DOM 事件都不能用
  2. 创建了一个叫做 events 内置模块来解决这个问题

const events= require('events');
//events.EventEmitter//构造函数
console.log(events.EventEmitter.prototype)//原型链
/*
EventEmitter {
_events: undefined,
_eventsCount: 0,
_maxListeners: undefined,
setMaxListeners: [Function: setMaxListeners],
getMaxListeners: [Function: getMaxListeners],
emit: [Function: emit],
addListener: [Function: addListener],
on: [Function: addListener],
prependListener: [Function: prependListener],
once: [Function: once],
prependOnceListener: [Function: prependOnceListener],
removeListener: [Function: removeListener],
off: [Function: removeListener],
removeAllListeners: [Function: removeAllListeners],
listeners: [Function: listeners],
rawListeners: [Function: rawListeners],
listenerCount: [Function: listenerCount],
eventNames: [Function: eventNames]
}
*/
const archetype=events.EventEmitter.prototype;
// archetype.on(事件,事件处理函数) 作用发布
// archetype.emit(事件名,实际参数) 作用订阅
archetype.on('handler',(val)=>{
console.log('事件触发',val);
})
archetype.emit('handler',111)

Readline模块逐行读取文本内容

readline 模块提供了一个接口,用于一次一行地读取可读流(例如 process.stdin)中的数据。

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
}); rl.question('你如何看待 Node.js 中文网?', (answer) => {
// TODO:将答案记录在数据库中。
console.log(`感谢您的宝贵意见:${answer}`); rl.close();
});
const readline = require('readline');
const fs = require('fs'); const rl = readline.createInterface({
input: fs.createReadStream('sample.txt')
}); rl.on('line', (line) => {
console.log('Line from file:', line);
});

简易爬虫

/*
* 爬虫
* 1. 进行数据请求,获取网页内容 http
* 2. 进行数据分析、数据清洗
* 3. 发送给我们自己的网页
*/
const http=require('http')
//获取 JSON 的示例:
http.get('http://jsonplaceholder.typicode.com/albums', (res) => {
/* res就是我得到的返回值 */
const { statusCode } = res;//状态码
const contentType = res.headers['content-type'];//得到的文件类型
// 错误代码处理
let error;
if (statusCode !== 200) {
error = new Error('请求失败\n' +
`状态码: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('无效的 content-type.\n' +
`期望的是 application/json 但接收到的是 ${contentType}`);
}
if (error) {
console.error(error.message);
// 消费响应数据来释放内存。
res.resume();//重新发起数据
return;
} res.setEncoding('utf8');//中文编码
let rawData = '';//真实数据
res.on('data', (chunk) => { rawData += chunk; });// 通过data事件将数据分片,然后逐片添加到rawData身上,好处就是当我们执行每一个分片的小任务时,至少给其他任务提供了可执行的机会
res.on('end', () => {//结束
try {// 高级编程 错误捕获
const parsedData = JSON.parse(rawData);
console.log(parsedData);
} catch (e) {
console.error(e.message);
}
});