没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论










[实现 N 个 API/⽹⻚爬⾍] Node
的 HTTP 处理 - 请求与响应
本节⽬标:[各种⼿段请求爬取⽹⻚内容] 你请求,我应答,⽹络两
头乐开花,Node 之所以成为服务器⽅案,离不开 HTTP 模块的能
⼒之帆。
在 Node ⾥⾯,起⼀个 HTTP Server ⾮常简单,如官⽹示例:

// 加载 http 模块
const http = require('http')
// 定义服务运⾏的主机名和端⼝号
const hostname = '127.0.0.1'
const port = 3000
// 通过 http.createServer ⽅法创建⼀个服务实例
// 同时传⼊回调函数,以接管后⾯进来的请求
// 后⾯请求进来时,这个回调函数会被调⽤执⾏,同时会拿到两个
参数,分别是 req 和 res
// req 是可读流(通过 data 事件接收数据),res 是可写流
(通过 write 写数据,end 结束输出)
const server = http.createServer((req, res) => {
// 设置返回的状态码 200 表示成功
res.statusCode = 200
// 设置返回的请求头类型 text/plain 表示普通⽂本
res.setHeader('Content-Type', 'text/plain')
// 对响应写⼊内容后,关闭可写流
res.end('Hello World\n')
})
// 调⽤实例的 listen ⽅法把服务正式启动
server.listen(port, hostname, () => {
console.log(`Server running at
http://${hostname}:${port}/`)
})
HTTP 作为整个互联⽹数据通信中⼏乎最主流的协议,它本身就是巨
⼤的知识库,⽆论是⼯作 1 年还是 10 年的⼯程师,每⼀次重温
HTTP 的整体知识相信都会有很多收获,从 HTTP/1.1 到
HTTP/2,从 HTTP 到 HTTPS,从 TCP 的握⼿到 cookie/session
的状态保持...,我们在接触和 HTTP 的时候,⼀开始很容易被吓唬

到,扎进去学习的时候也确实枯燥乏味,⽐较好的办法,就是在⼯作
中不断的使⽤它,不断的练习,随着使⽤中的⼀点点深⼊,我们会对
HTTP 越来越熟悉。
那么这⼀节,我们就挑 HTTP 模块在 Node 中的⼏个应⽤知识来学
习,以代码练习为主,主要学习 HTTP 模块在 Node 中的使⽤。
简单的 HTTP 头常识
⼀个请求,通常会建⽴在两个⻆⾊之间,⼀个是客户端,⼀个是服务
端,⽽且两者的身份可以互换的,⽐如⼀台服务器 A 向 服务器 B 发
请求,那么 A 就是客户端,B 是服务端,反过来身份就变了,甚⾄
如果 A 这台服务器⾃⼰向⾃⼰发⼀个请求,那么 A ⾥⾯发请求的程
序就是客户端,响应请求的程序就是服务端了,所以⼤家可以打开思
路,不⽤局限在端的形态上⾯。
我们简单的看下⼀个请求从浏览器发出,以及服务器返回,它们的头
信息,我们去实现爬⾍的时候,有时候需要构造假的请求头,或者解
析响应头,这在特定场景下会有⼀定的参考作⽤,⽐如打开掘⾦的⾸
⻚,我们针对这个⽹⻚ HTML 的 GET 请求,简单学习它⾥⾯的头信
息知识:
// 请求由 A 请求⾏、B 请求头组成
// A 请求⾏由 3 端组成,HTTP Verb/URL Path/HTTP
Version
// 1. 标明请求⽅法是 GET,往往⽤作获取资源(图⽚、视频、
⽂档等等)
// 2. /timeline 是请求的资源路径,由服务器来决定如何响应
该地址
// 3. HTTP 协议版本是 1.1
GET /timeline HTTP/1.1
// B 如下都是请求头
// 去往哪个域名(服务器)去获取资源

Host: juejin.im
// 保持连接,避免连接重新建⽴,减少通信开销提⾼效率
Connection: keep-alive
// HTTP 1.0 时代产物,no-cache 禁⽤缓存
Pragma: no-cache
// HTTP 1.1 时代产物,与 Pragma ⼀样控制缓存⾏为
Cache-Control: no-cache
// 浏览器⾃动升级请求,告诉服务器后续会使⽤ HTTPS 协议请
求
Upgrade-Insecure-Requests: 1
// 上报⽤户代理的版本信息
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS
X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/70.0.3538.102 Safari/537.36
// 声明接收哪种格式的数据内容
Accept:
text/html,application/xhtml+xml,application/xml;q
=0.9,image/webp,image/apng,*/*;q=0.8
// 声明所接受编码压缩的格式
Accept-Encoding: gzip, deflate, br
// 声明所接受的地区语⾔
Accept-Language: en-US,en;q=0.9,zh-
CN;q=0.8,zh;q=0.7
// 捎带过去⽤户之前访问时候存储在客户端的 Cookie 信息,⽅
便服务器识别记录
Cookie: gr_user_id=1fa5e8a7b7c90;
_ga=GA1.2.787252639.1488193773; ab={}; _gat=1;
gr_session_id_89669d96c88aefbc_a009fcc=true
...
当然还有 POST,HEAD, PUT, DELETE 等这些请求⽅法,他们甚⾄
可以多传⼀些数据包,⽐如 POST 会多⼀个请求体,我们继续看下
上⾯的这个请求头给到服务端,服务器返回的头是如何的:

// 整体上, response header 跟 request header 格式都
是类似的
// 响应由 3 部分组成,A 响应⾏; B 响应头;C 响应体
// A 响应⾏依然是 HTTP 协议与响应状态码,200 是响应成功
HTTP/1.1 200 OK
// 响应的服务器类型
Server: nginx
// 当前响应的时间
Date: Wed, 21 Nov 2018 05:45:21 GMT
// 返回的数据类型,字符编码集
Content-Type: text/html; charset=utf-8
// 数据传输模式
Transfer-Encoding: chunked
// 保持连接
Connection: keep-alive
// HTTP 协议的内容协商,⽐如如何响应缓存
Vary: Accept-Encoding
// 内容安全策略,检测和削弱恶意共计,学问很深
Content-Security-Policy: default-src * blob:
data:;script-src 'self' 'unsafe-eval' *.xitu.io
*.juejin.im *.baidu.com *.google-analytics.com
*.meiqia.com dn-growing.qbox.me *.growingio.com
*.guard.qcloud.com *.gtimg.com;style-src 'self'
'unsafe-inline' *.xitu.io *.juejin.im
*.growingio.com *.guard.qcloud.com *.gtimg.com;
// 设置各种 Cookie 以及何时失效,这些 cookie 会存储在发
出请求的客户端本地
Set-Cookie: ab={}; path=/; expires=Thu, 21 Nov
2019 05:45:21 GMT; secure; httponly
Set-Cookie: auth=eyJ0b2tlbiI6...; path=/;
expires=Wed, 28 Nov 2018 05:45:21 GMT; secure;
httponly
Set-Cookie: QINGCLOUDELB=165e4274d60907...;
剩余22页未读,继续阅读
资源评论


地理探险家
- 粉丝: 534
- 资源: 4078
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
