事件 events 模块

原生事件写法

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

Node.js 事件驱动

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

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

  1. const events= require('events');
  2. //events.EventEmitter//构造函数
  3. console.log(events.EventEmitter.prototype)//原型链
  4. /*
  5. EventEmitter {
  6. _events: undefined,
  7. _eventsCount: 0,
  8. _maxListeners: undefined,
  9. setMaxListeners: [Function: setMaxListeners],
  10. getMaxListeners: [Function: getMaxListeners],
  11. emit: [Function: emit],
  12. addListener: [Function: addListener],
  13. on: [Function: addListener],
  14. prependListener: [Function: prependListener],
  15. once: [Function: once],
  16. prependOnceListener: [Function: prependOnceListener],
  17. removeListener: [Function: removeListener],
  18. off: [Function: removeListener],
  19. removeAllListeners: [Function: removeAllListeners],
  20. listeners: [Function: listeners],
  21. rawListeners: [Function: rawListeners],
  22. listenerCount: [Function: listenerCount],
  23. eventNames: [Function: eventNames]
  24. }
  25. */
  26. const archetype=events.EventEmitter.prototype;
  27. // archetype.on(事件,事件处理函数) 作用发布
  28. // archetype.emit(事件名,实际参数) 作用订阅
  29. archetype.on('handler',(val)=>{
  30. console.log('事件触发',val);
  31. })
  32. archetype.emit('handler',111)

Readline模块逐行读取文本内容

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

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

简易爬虫

  1. /*
  2. * 爬虫
  3. * 1. 进行数据请求,获取网页内容 http
  4. * 2. 进行数据分析、数据清洗
  5. * 3. 发送给我们自己的网页
  6. */
  1. const http=require('http')
  2. //获取 JSON 的示例:
  3. http.get('http://jsonplaceholder.typicode.com/albums', (res) => {
  4. /* res就是我得到的返回值 */
  5. const { statusCode } = res;//状态码
  6. const contentType = res.headers['content-type'];//得到的文件类型
  7. // 错误代码处理
  8. let error;
  9. if (statusCode !== 200) {
  10. error = new Error('请求失败\n' +
  11. `状态码: ${statusCode}`);
  12. } else if (!/^application\/json/.test(contentType)) {
  13. error = new Error('无效的 content-type.\n' +
  14. `期望的是 application/json 但接收到的是 ${contentType}`);
  15. }
  16. if (error) {
  17. console.error(error.message);
  18. // 消费响应数据来释放内存。
  19. res.resume();//重新发起数据
  20. return;
  21. }
  22. res.setEncoding('utf8');//中文编码
  23. let rawData = '';//真实数据
  24. res.on('data', (chunk) => { rawData += chunk; });// 通过data事件将数据分片,然后逐片添加到rawData身上,好处就是当我们执行每一个分片的小任务时,至少给其他任务提供了可执行的机会
  25. res.on('end', () => {//结束
  26. try {// 高级编程 错误捕获
  27. const parsedData = JSON.parse(rawData);
  28. console.log(parsedData);
  29. } catch (e) {
  30. console.error(e.message);
  31. }
  32. });
  33. }).on('error', (e) => {
  34. console.error(`出现错误: ${e.message}`);
  35. });
  1. const http=require('http');
  2. const cheerio=require('cheerio')
  3. const options={
  4. hostname: 'jx.1000phone.net',
  5. port: 80,
  6. path: '/teacher.php/Class/classDetail/param/rqiWlsefmajGmqJhXXWhl3ZiZ2Zn',
  7. method: 'GET',
  8. headers: {
  9. Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  10. 'Accept-Encoding': 'gzip, deflate',
  11. 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
  12. 'Cache-Control': 'no-cache',
  13. Connection: 'keep-alive',
  14. Cookie: 'PHPSESSID=ST-117984-IVZSfYMlr9YXvRfFRm-A1TimOeA-izm5ejd5j1npj2pjc7i3v4z',
  15. Host: 'jx.1000phone.net',
  16. Pragma: 'no-cache',
  17. Referer: 'http://jx.1000phone.net/teacher.php/Class/index',
  18. 'Upgrade-Insecure-Requests': 1,
  19. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
  20. 'Content-Type': 'application/x-www-form-urlencoded',
  21. 'Content-Length': 0
  22. }}
  23. http.get(options, (res) => {
  24. const { statusCode } = res;
  25. const contentType = res.headers['content-type'];
  26. res.setEncoding('utf8');
  27. let rawData = '';
  28. res.on('data', (chunk) => { rawData += chunk; });
  29. res.on('end', () => {
  30. try {
  31. const $=cheerio.load(rawData);
  32. $('.student a').each(function(item,index){
  33. console.log($(this).text());
  34. })
  35. } catch (e) {
  36. console.error(e.message);
  37. }
  38. });
  39. }).on('error', (e) => {
  40. console.error(`出现错误: ${e.message}`);
  41. });

NodeJS概述2-事件插件-简易爬虫的更多相关文章

  1. nodeJS实现简易爬虫

    nodeJS实现简易爬虫 需求:使用nodeJS爬取昵图网某个分类下的图片并存入本地 运用nodeJS自带系统模块http.fs 示例代码: var http =require('http'); va ...

  2. python简易爬虫来实现自动图片下载

    菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷. 估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择.本人借鉴网上的部分实现 ...

  3. 使用 HttpClient 和 HtmlParser 实现简易爬虫

    这篇文章介绍了 HtmlParser 开源包和 HttpClient 开源包的使用,在此基础上实现了一个简易的网络爬虫 (Crawler),来说明如何使用 HtmlParser 根据需要处理 Inte ...

  4. php+phpquery简易爬虫抓取京东商品分类

    这是一个简单的php加phpquery实现抓取京东商品分类页内容的简易爬虫.phpquery可以非常简单地帮助你抽取想要的html内容,phpquery和jquery非常类似,可以说是几乎一样:如果你 ...

  5. [转]使用 HttpClient 和 HtmlParser 实现简易爬虫

    http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...

  6. 爬虫系列1:python简易爬虫分析

    决定写一个小的爬虫系列,本文是第一篇,讲爬虫的基本原理和简易示例. 1.单个网页的简易爬虫 以下爬虫的主要功能是爬取百度贴吧中某一页面的所有图片.代码由主要有两个函数:其中getHtml()通过页面u ...

  7. 项目中nodejs包高效升级插件npm-check-updates

    nodejs包高效升级插件npm-check-updates 最近想升级npm的包 1.//常规的包升级方式/2.npm update (包) 到npm一搜发现了一个很好的升级工具 npm-check ...

  8. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  9. day17 python re模块 简易爬虫

    day17 python   一.re模块     1.re模块的基础方法         查找findall() import re #re.findall(pattern,string,flags ...

随机推荐

  1. Python学习day42-数据库的基本操作(1)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  2. Redis学习笔记01-分布式锁

    1.分布式锁的定义与理解 在并发任务中,当对数据执行修改和删除时为了防止多个任务同时拿到数据而产生的混乱,这时就要用到分布式锁来限制程序的并发执行. Redis分布式锁本质上要实现的目标就是在Redi ...

  3. <每日一题>题目6:二分查找

    #二分查找 ''' 1.end问题 2.44对应的end<start 找不到情况 3.返回值递归的情况 4,611,aim太大的情况 ''' l = [2,3,5,10,15,16,18,22, ...

  4. HTML编码的用户输入------阻止向Controller的方法传入参数时用链接注入javascript代码或者HTML标记

  5. vue 报错:Cannot read property '_wrapper' of undefined

    我的情况是@click="xx" ,而xx函数未定义

  6. At- Linux必学的60个命令

    1.作用 at命令用来在指定时刻执行指定的命令序列. 2.格式 at [-V] [-q x] [-f file] [-m] time 3.主要参数 -V:显示标准错误输出. -q:许多队列输出. -f ...

  7. 简单排列习题2.5 的 2 - 6 P35

    用1,2,3,...9组成3个3位数abc, def, ghi:每个数字恰好用一次,要求 abc:def :ghi = 1: 2 : 3:按照abc : def : ghi的格式输出. 通常想到的思路 ...

  8. day45作业

    利用 html + css 写一个最基本的页面 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. pip报错ImportError: cannot import name main

    编辑pip sudo gedit /usr/bin/pip 修改pip文件: 源文件 from pip import main if __name__ == '__main__': sys.exit( ...

  10. ACM中Java使用注意事项

    1. String 类用来存储字符串,可以用charAt方法来取出其中某一字节,计数从0开始, 而不是像C/C++那样使用 []访问是每个字符. 2. 在主类中 main 方法必须是 public s ...