note: demo代码要编号

导出模块

一个js文件就是一个模块,模块内部的所有变量,对象,方法对外界都不可见。如果想暴漏出去让别人用,就需要导出模块。语法如下:

module.exports = {a :a,foo
}

crypto模块

NodeJs的crypto模块提供了哈希,加密相关的功能支持。

哈希算法:MD5,SHA1,SHA256,Hmac

哈希算法用来对数据进行签名,确定数据的唯一性,以及是否被篡改。由于其过程不可逆,也常常用来对用户密码进行加密。

// 计算字符串的hash
let data = '123456'
// const hash = crypto.createHash('md5')
// const hash = crypto.createHash('sha1')
// const hash = crypto.createHash('sha256')
const hash = crypto.createHash('sha512')
hash.update(data)
console.log(hash.digest('hex'));
// 计算文件的hash
const reader = fs.createReadStream('xxx.txt')
reader.on('data', (chunk) =>{hash.update(chunk)
})
reader.on('end', ()=>{console.log(hash.digest('hex'));
})

Hmac是基于key和hash的认证算法。它在上面哈希算法的基础上,再传入一个key。只要key变化,即使输入同样的数据也会得到不同的结果。可以将Hmac理解为随机数增强的哈希算法。

const key = 'hehe'
const hmac = crypto.createHmac('md5', key)
hmac.update(data)
console.log(hmac.digest('hex'));

对称加密算法:AES

AES是一种常用的对称加密算法,加解密都用同一个密钥。

AES加密:

let data = '123456'
let password = 'baby'
const cipher  = crypto.createCipher('aes192', password)
let encrypted = cipher.update(data, 'utf-8', 'hex')
encrypted += cipher.final('hex')
console.log(encrypted);

AES解密:

const decipher = crypto.createDecipher('aes192', password)
let encrytedData = 'd1b992fe45e85e43f3b73e0716874bc8'
let decrypted = decipher.update(encrytedData, 'hex', 'utf-8')
decrypted += decipher.final('utf-8')
console.log(decrypted);

event模块

大多数 Node.js 核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)。例如,fs.ReadStream会在文件被打开时触发事件;stream 会在数据可读时触发事件。

用法如下:

const EventEmitter = require('events')
class MyEmitter extends EventEmitter{}const myEmitter = new MyEmitter()
// 注册xxx事件
myEmitter.on('aaa', (a)=>{console.log('aaa事件被触发,参数:'+a);
})
// 1秒钟之后触发aaa事件,并传递参数
setTimeout(()=>{myEmitter.emit('aaa', 'aaaaaa')
},1000)

当你想设计一个模块,它具有在某个条件下执行某个操作的功能,那么event模块就派上用场了。例如:你想设计一个用户注册模块,当用户注册成功之后给用户发送一个email。

【案例】美女图片爬虫项目

功能需求:爬取http://www.27270.com/ent/meinvtupian/网站页面,处理GBK乱码的问题;从中提取出图片数据,并下载美女图片。

提示:html的解析需要用到cheerio模块,使用iconv-lite模块处理gbk编码问题,iconv-lite Github

前置知识点学习:

  • 学习使用cheerio模块进行数据的提取。cheerio官方文档

    参考官网的api,分别练习从一段给定的dom中,提取标签的text,属性值,以及如何取多个标签的text。

实现爬虫功能,需要实现抓取页面,提取数据,下载图片,这些子功能。而这些功能的调用都是当某个步骤完成了,就执行下一个步骤,有顺序的。

所以,请尝试使用event模块来重构整个项目的架构


MongoDB

介绍

MongoDB是一个由C++编写的高性能的文档型数据库,为web应用提供可扩展数据库解决方案。它和MySQL的区别如下:

项目 MongoDB MySQL
存储单元 按collection存储,一个collection中包含很多document 按table存储,一个table中包含很多的记录
数据格式要求 非常灵活,document可以存储任意json格式的数据 row中的每一列的数据类型都是限定死的,不够灵活
数据字段扩展 对数据字段的扩展零消耗 数据扩展字段有很大的消耗。比如:上万条数据再增加一列就要消耗几十秒。
事务支持 在4.0之后版本支持,目前已经支持 支持
读写性能 一般情况下,读写性能都要略高于MySQL 性能平稳

具体区别如下:

下载与安装

下载地址:https://www.mongodb.com/download-center?jmp=nav#community,然后傻瓜式安装。

启动

  • 为了方便执行命令,先将安装目录下的bin添加到环境变量中。

  • 启动server端:mongod --dbpath F:\xxx

  • 启动clent端:mongo

  • 为了方便,推荐将mongodb设置为Windows的开机启动服务,做法如下:

    1. 在mongodb的根目录下创建mongo.config文件,内容如下:

      dbpath=F:\mongodb\data
      logpath=F:\mongodb\log\mongo.log
    2. 用管理员启动cmd,执行:

      mongod --config f:\mongodb\mongo.config --install --serviceName mongodb

      服务安装完毕,不要忘记启动服务。

    3. 启动和停止服务

      net start/stop mongodb

mongo shell的增删改查

简单演示。


ORM - mongoose

无论是mysql还是mongodb,传统的与数据库交互的方式都是按照他们提供的API来写代码。它们提供的API往往不是很容易理解,而且难以记忆,如果传错了参数,写错一个符号都要查文档。就像上面我们学习的数据库API一样。

ORM框架允许我们面向对象操作,不需要记忆任何的数据库API,只需要操作对象即可,由框架底层去调用数据库API,这样就大大提高了程序员的开发效率。不过既然多了一层封装,肯定要损失一点点的性能,可以忽略不计。

在NodeJS中,mongodb最好的orm框架就是mongoose

安装mongoose

npm install mongoose --save

如果你本机没有安装nodejs驱动,会自动安装nodejs驱动,因为mongoose依赖nodejs驱动了。

文档参考:mongoose官方文档

连接数据库

const mongoose = require('mongoose')
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test");
const db = mongoose.connection;db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {console.log('连接mongodb成功!');
});

模型定义

mongoose使用schema来描述数据的格式,字段,规则,有了schema之后可以生成model来操作数据。

const mongoose = require('mongoose')
const schema = mongoose.Schema({name: {type: String,required: true},age: Number,fav: [String],
});module.exports = mongoose.model('user', schema)

增删改查

直接查看文档中Model相关API。

await User.create()
await User.findOne()
await User.updateOne()
await User.deleteOne()
//增加条件操作符: 所有支持的操作符:https://docs.mongodb.com/manual/reference/operator/query/
await User.findOne({age: {$gt:11},tags:{$in:[1,2,3]}})

高级查询

//分页查询
await Book.find().skip(10).limit(10)//排序和字段映射
await Book.find().sort("field").select("field1 field2")// 填充查询
let res = await Book.find({price: {$gt: 50}}).populate('author', 'name')
console.log(res);

转载于:https://www.cnblogs.com/xiaocongcong888/p/9436226.html

NodeJs02 美女爬虫相关推荐

  1. python3 27270网站美女爬虫(二)

    对于27270网站美女 进行了一个尝试 使用 python3 库: urllib BeautifulSoup lxml 主要是下载静态网页的图片 显示从IP代理网站上获取代理池,然后在从静态页面获取图 ...

  2. python 知乎美女_知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)

    原标题:知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测) 1 数据源 知乎话题『美女』下所有问题中回答所出现的图片 2 抓取工具 Python 3,并使用第三方库 Requests.l ...

  3. 用python写一个美女图片爬虫

    介绍 最近无聊学了一下python,决定打算用python写一个爬虫,既然要写爬虫,就写一个美女爬虫,养眼,哈哈..你们懂的 准备阶段 首先我们必须先找到一个有美女的网站,这里我以7kk网站为例子, ...

  4. 使用Python爬虫爬取网络美女图片

    代码地址如下: http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip instal ...

  5. 运用Python爬虫爬取一个美女网址,爬取美女图

    运用Python爬虫爬取一个美女网址,爬取美女图 要运用到的python技术: 导入库 1.request 发送请求,从服务器获取数据 2.BeautifulSoup 用来解析整个网页的源代码 imp ...

  6. Java爬虫之利用Jsoup+HttpClient爬取类叔叔不约匿名聊天网站的图片,未果——后爬取某网站美女图片案例

    博主最近学了一点爬虫的知识,闲着无聊,秉承学以致用的理念,于是突然想到何不挑战一下,爬取一些叔叔不约网站的图片,来巩固一下所学知识(#滑稽).说干就干,打开eclipse或idea,创建maven工程 ...

  7. Python爬虫福利:带你爬取妹子图上的美女图片,学习改变生活

    学习python爬虫,总得实战演练一下才能真正有所收获.今天我们就来用python爬虫爬取妹子图,哇~全是美女哦!那么,我们步入正题吧! 看完这篇文章,你将会用python爬虫做到这样: 首先我们打开 ...

  8. python爬取美女_知乎大神用Python爬取高颜值美女(Python爬虫+人脸检测+颜值检测)...

    import time import os import re import requests from lxml import etree from aip import AipFace #百度云 ...

  9. 爬虫爬取二次元网站美女图片

    爬虫爬取二次元网站美女图片 前言 xpath解析 需求分析 代码编写 总代码 前言 本次需要爬取二次元网站cos板块下的图片 需要用到request模块与lxml模块,所以请提前安装好这两个模块,打开 ...

最新文章

  1. 内涵! 程序员才懂的动图... | 节日出行注意安全~~
  2. jdbc批量调用oracle存储过程,oracle学习笔记(二十三)——JDBC调用存储过程以及批量操作...
  3. 红帽启动apache服务器_redhat 启动ssh服务器
  4. WCF RIA优缺点
  5. python图片保存为txt文件_python + opencv实现提取png图像的像素信息并存储到txt文件中(附安装指导)...
  6. vs2017python配置opencv_关于VS2017配置OpenCV出现无法打开文件“opencv_ml249d.lib”的解决方案...
  7. 生成检测报告在哪_惠检LIMS系统在材料检测行业的应用
  8. Android 文本监听接口TextWatcher详解
  9. 继CDH收费之后,这家公司率先推出了免费版大数据套件服务!
  10. 内蒙古特检院利用物联网/RFID技术提高电梯检测水平
  11. cad画固定长度的弧线_CAD中如何绘制指定弧长的圆弧
  12. 距阵乘以一个未知距阵得单位矩阵 怎么算_干货分享:怎样假装一个带货流水过亿的直播达人?...
  13. QT 错误:Unable to create a debugging engine解决
  14. 博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译
  15. 论文阅读笔记《Dynamic Few-Shot Visual Learning without Forgetting》
  16. centos7搭建http代理ip TinyProxy 及验证是否有效(python)
  17. React 入门教程笔记
  18. OTA市场寡头竞争态势严峻,同程艺龙赴港IPO能否改变现状?
  19. Django基础概念和MVT架构(一)
  20. 烤仔看世界 | 1700万美元成交,征服苏富比的匿名艺术家

热门文章

  1. HTML5音乐播放器(最新升级改造加强版)
  2. nvme分区选mbr还是guid_设置UEFI+GPT分区安装win10教程
  3. charles证书过期-mac
  4. 六西格玛与统计数字化
  5. Learning with noisy labels总结
  6. 果果带你写链表,小学生看了都说好
  7. Java程序员常用的各种快捷键和命令:
  8. 4月英语学习——走在路上
  9. 人生顿悟之学好不一定就真的会了
  10. 【RDMA】6. RDMA之Memory Region