1、url网址解析
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
url.format(urlObject)
url.resolve(from, to)
┌─────────────────────────────────────────────────────────────────────────────┐
│ href │
├──────────┬┬───────────┬─────────────────┬───────────────────────────┬───────┤
│ protocol ││ auth │ host │ path │ hash │
│ ││ ├──────────┬──────┼──────────┬────────────────┤ │
│ ││ │ hostname │ port │ pathname │ search │ │
│ ││ │ │ │ ├─┬──────────────┤ │
│ ││ │ │ │ │ │ query │ │
" http: // user:pass @ host.com : 8080 /p/a/t/h ? query=string #hash "
│ ││ │ │ │ │ │ │ │
└──────────┴┴────???──────┴──────────┴──────┴──────────┴─┴──────────────┴───────┘
(all spaces in the "" line should be ignored -- they are purely for formatting)
https://www.baidu.com:8080/api.php?from=1000phone&course=nodejs#test
{
protocol: ‘https:‘,
slashes: true,
auth: null,
host: ‘www.baidu.com:8080‘,
port: ‘8080‘,
hostname: ‘www.baidu.com‘,
hash: ‘#test‘,
search: ‘?from=1000phone&course=nodejs‘,
query: { from: ‘1000phone‘, course: ‘nodejs‘ },
pathname: ‘/api.php‘,
path: ‘/api.php?from=1000phone&course=nodejs‘,
href: ‘https://www.baidu.com:8080/api.php?from=1000phone&course=nodejs#test‘ }
执行命令
node
url
url.parse("https://www.baidu.com")
url.parse("https://www.baidu.com:8080/api.php?from=qianfeng&course=node#level")-----query为字符串
url.parse("https://www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)-----query为对象
url.parse("https://www.baidu.com",true)
url.parse("//www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)--没有解析到协议和端口号
url.parse("//www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)--解析到host和port
将之前的解析出来的使用url.format()执行,可以解析出一个url地址
两段url解析成一个url.resolve("http://www.baidu.com","/api/list.php");
2、querystring网址:http://nodejs.cn/api/
querystring.escape(str)
querystring.parse(str[, sep[, eq[, options]]])
querystring.stringify(obj[, sep[, eq[, options]]])
querystring.unescape(str)
node
querystring
querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""})
querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""},",")----设置分隔符
querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""},",",":")
querystring.parse(默认的字符串)
querystring.escape({"from":"beijing"}});
querystring.escape("北京")
3、http模块
4、http小爬虫
创建一个文件spider.js
网址:https://www.lagou.com
var http = require("http");
var https = require("https");
var url = "https://www.lagou.com";
https.get(url,function(res){
var html="";
res.on("data",function(data){
html+=data;
)
res.on("end",function(){
console.log(html);
})
res.on("error",function(err){
console.log(err);
})
})
引入一个第三方工具
cnpm install cheerio --save-dev
注意:
--save表示安装到本地---项目依赖--dependencies
-dev表示安装到开发依赖----devDependencies---项目上线时不需要开发依赖
var http = require("http");
var https = require("https");
var cheerio = require("cheerio");
var url = "https://www.lagou.com";
function filter(html){
var $ = cheerio.load(html);
var menu = $(".menu_main");
var menuData = [];
menu.each(function(index,value){
var menuTitle = $(value).find("h2").text();
var menuLists = $(value).find("a");
var menulist = [];
menuLists.each(function(index,value){
menulist.push($(value).text())
})
menuData.push({menuTitle:menuTitle,menulist:menulist})
})
return menuData
}
https.get(url,function(res){
var html="";
res.on("data",function(data){
html+=data;
)
res.on("end",function(){
console.log(html);
var result = filter(html);
printMenu(result);
})
res.on("error",function(err){
console.log(err);
})
})
function printMenu(menu){
menu.forEach(function(value){
console.log(value.menuTitle+"\n");
value.menuList.forEach(function(value){
console.log(value);
}
)
})
}
5、request方法
新建文件requestGet.js https://developers.douban.com/wiki/?title=movie_v2#top250
请求的数据http://api.douban.com/v2/movie/top250
http://json.cn/
const https = require(‘https‘)
var options = {
hostname: ‘api.douban.com‘,
port: 443,
method: ‘GET‘,
path: ‘/v2/movie/top250‘
}
var responseData = ‘‘
var request = https.request(options, (response) => {
// console.log(response)
// console.log(response.statusCode)
// console.log(response.headers)
response.setEncoding(‘utf8‘)
response.on(‘data‘, (chunk) => {
responseData += chunk
})
response.on(‘end‘, () => {
JSON.parse(responseData).subjects.map((item) => {
console.log(item.title)
})
})
})
request.on(‘error‘, (error) => {
console.log(error)
})
request.end()
新建文件requestPost.js
const http = require(‘http‘)
const querystring = require(‘querystring‘)
var postData = querystring.stringify({
‘question[title]‘:‘这个视频不错2‘,
‘question[content]‘:‘<p>赞一个</p>‘,
‘question[courseId]‘:‘227‘,
‘question[lessonId]‘:‘1753‘,
‘_csrf_token‘:‘32b0e1e07c657000e1f7250cdeac0377e6af688f‘
})
var options = {
hostname: ‘www.codingke.com‘,
port: 80,
method: ‘POST‘,
path: ‘/ajax/create/course/question‘,
headers: {
‘Accept‘:‘*/*‘,
‘Accept-Encoding‘:‘gzip, deflate‘,
‘Accept-Language‘:‘zh-CN,zh;q=0.8,en;q=0.6‘,
‘Connection‘:‘keep-alive‘,
‘Content-Length‘: postData.length,
‘Content-Type‘:‘application/x-www-form-urlencoded; charset=UTF-8‘,
‘Cookie‘:‘PHPSESSID=qsqkoo0bq1grc6a5jo7kgk5tn7; CNZZDATA1256018185=1839628736-1476447839-null%7C1485424829; Hm_lvt_9f92046de4640f3c08cf26535ffdd93c=1485410187,1485420976; Hm_lpvt_9f92046de4640f3c08cf26535ffdd93c=1485426828‘,
‘Host‘:‘www.codingke.com‘,
‘Origin‘:‘http://www.codingke.com‘,
‘Referer‘:‘http://www.codingke.com/v/398-chapter-227-course‘,
‘User-Agent‘:‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36‘,
‘X-CSRF-Token‘:‘32b0e1e07c657000e1f7250cdeac0377e6af688f‘,
‘X-Requested-With‘:‘XMLHttpRequest‘
}
}
var request = http.request(options, (res) => {
console.log(‘Status:‘ + res.statusCode)
console.log(‘headers:‘ + JSON.stringify(res.headers))
res.setEncoding(‘utf8‘)
res.on(‘data‘, (chunk) => {
console.log(chunk)
})
res.on(‘end‘, () => {
console.log(‘技术问答提交完毕!‘)
})
})
request.on(‘error‘, (error) => {
console.log(error)
})
request.write(postData)
request.end()
7、event事件
events
使用事件:EventEmitter
事件的参数
只执行一个的事件监听器
创建一个文件event_emitter.js
const EventEmitter = require(‘events‘)
class Player extends EventEmitter {}
var player = new Player()
player.once(‘play‘, (track) => {
console.log(`正在播放:《${track}》`)
})
player.emit(‘play‘, ‘精绝古城‘)
player.emit(‘play‘, ‘黄皮子坟‘)
8、File System
得到文件与目录的信息:stat
创建一个目录:mkdir
创建文件并写入内容:writeFile,appendFile
读取文件的内容:readFile
列出目录的东西:readdir
重命名目录或文件:rename
删除目录与文件:rmdir,unlink
创建fs_1.js---查看状态
const fs = require(‘fs‘)
fs.stat(‘hello.js‘, (error, stats) =>{
if(error){
console.log(error)
} else {
console.log(stats)
console.log(`文件:${stats.isFile()}`)
console.log(`目录:${stats.isDirectory()}`)
}
})
创建fs_2.js---创建目录
const fs = require(‘fs‘)
fs.mkdir(‘logs‘, (error) => {
if(error){
console.log(error)
} else {
console.log(‘成功创建目录:logs‘)
}
})
创建fs_3.js---写入文件
const fs = require(‘fs‘)
fs.writeFile(‘logs/hello.log‘, ‘您好 ~ \n‘, (error) => {
if(error) {
console.log(error)
} else {
console.log(‘成功写入文件‘)
}
})
fs.appendFile(‘logs/hello.log‘, ‘hello ~ \n‘, (error) => {
if(error) {
console.log(error)
} else {
console.log(‘成功写入文件‘)
}
})
创建fs_4.js---读取文件
const fs = require(‘fs‘)
fs.readFile(‘logs/hello.log‘, ‘utf8‘, (error, data) =>{
if (error) {
console.log(error)
} else {
console.log(data)
}
})
创建fs_5.js---读取文件夹
const fs = require(‘fs‘)
fs.readdir(‘logs‘, (error, files) => {
if (error) {
console.log(error)
} else {
console.log(files)
}
})
创建fs_6.js--文件重命名
const fs = require(‘fs‘)
fs.rename(‘logs/hello.log‘, ‘logs/greeting.log‘, (error) =>{
if (error) {
console.log(error)
} else {
console.log(‘重命名成功‘)
}
})
创建fs_7.js--删除目录
const fs = require(‘fs‘)
fs.readdirSync(‘logs‘).map((file) => {
fs.unlink(`logs/${file}`, (error) => {
if (error) {
console.log(error)
} else {
console.log(`成功的删除了文件: ${file}`)
}
})
})
fs.rmdir(‘logs‘, (error) =>{
if (error) {
console.log(error)
} else {
console.log(‘成功的删除了目录:logs‘)
}
})
9、Stream
读取文件流
可读流的事件
可写的文件流
pipe
链式使用 pipe
创建文件stream.js
const fs = require(‘fs‘)
var fileReadStream = fs.createReadStream(‘data.json‘)
var fileWriteStream = fs.createWriteStream(‘data-1.json‘)
var count = 0
fileReadStream.once(‘data‘, (chunk) => {
console.log(chunk.toString())
fileWriteStream.write(chunk)
})
fileReadStream.on(‘data‘, (chunk) => {
console.log(`${ ++count } 接收到:${chunk.length}`)
fileWriteStream.write(chunk)
})
fileReadStream.on(‘end‘, () => {
console.log(‘--- 结束 ---‘)
})
fileReadStream.on(‘error‘, (error) => {
console.log(error)
})
流的操作
const fs = require(‘fs‘)
var fileReadStream = fs.createReadStream(‘data.json‘)
var fileWriteStream = fs.createWriteStream(‘data-1.json‘)
fileReadStream
.pipe(fileWriteStream)
进一步处理---写入之前进行压缩
const fs = require(‘fs‘)
const zlib = require(‘zlib‘)
var fileReadStream = fs.createReadStream(‘data.json‘)
var fileWriteStream = fs.createWriteStream(‘data.json.gz‘)
fileWriteStream.on(‘pipe‘, (source) => {
console.log(source)
})
fileReadStream
.pipe(zlib.createGzip())
.pipe(fileWriteStream)
原文:http://www.cnblogs.com/shenjp/p/6407235.html