入门HTTP协议看这篇文章就够了 - 爬虫和Web开发必备!
时间:2023-08-19 14:18:02 | 来源:网站运营
时间:2023-08-19 14:18:02 来源:网站运营
入门HTTP协议看这篇文章就够了 - 爬虫和Web开发必备!:HTTP对于爬虫是
重中之重,对于学Web开发(前端或者后端)也是
必备技能。本文涵盖了HTTP的必要知识点,把本文看透,基本够用了,然后再按需适当扩展就可以了。
另外,文末也有视频本教程的视频链接。
1. 原理介绍
爬虫就是用程序模拟浏览器的行为,发送请求给服务器,获取网页的内容,解析网页数据。
要学会爬虫,先要了解浏览器是如何和服务器交流的。浏览器通过HTTP协议和服务器交流。
2. HTTP协议简介
简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,主要用于网页的传输,现在也常应用网络API的开发(Restful API)。
HTTP是一个TCP/IP通信协议的最上层的协议之一(HTML 文件, 图片文件, 查询结果等)。TCP/IP协议有兴趣的可以自行学习,做Web开发的需要学习一下,对于爬虫不是必要内容。
以访问百度首页为例,可以看到网址的最前面就是http。
这里是https,你可以暂时忽略后面的s,https相对于http添加了数字证书加密功能,这不影响正常的爬虫。但写爬取的时候也要添加s,现在大部分网站都是https的。
了解https,请参考麦叔的文章,链接见底部第一篇。
基本工作原理
HTTP是浏览器或者其他客户端(如手机App)和网站服务器之间沟通的协议。
浏览器作为HTTP
客户端通过
URL向HTTP服务端即
WEB服务器发送所有请求。
常用的Web服务器有:
Nginx,
Apache,
IIS服务器(微软的产品)等。
Web服务器接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
HTTP三个要点
- HTTP是无连接: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的: 这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3. chrome浏览器和开发者工具
这个课程我们要使用chrome浏览器和它自带的开发者工具。
如果你还没有安装chrome浏览器,请下载和安装Chrome浏览器,麦叔高速镜像下载地址:
https://blog.qingke.me/post/10我们可以使用chrome来查看http的请求信息,基本操作步骤如下:
- 通过Elements我们可以看到网页的代码;通过Network我们可以看到HTTP的请求信息
4. HTTP的消息结构
主要流程和概念
- 请求
- 地址和动词:例如 GET https://www.baidu.com
- 请求头(header):用来描述请求和发送者的一些信息
- 请求参数:以百度为例,要搜索的关键词。
- 相应
- 响应代码:200表示成功,404表示不存在等
- 响应头header:描述相应内容的一些信息
- 响应内容:HTML, JSON, 图片等
请求和响应例子
客户端请求:
GET /hello.txt HTTP/1.1User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi
服务端响应:
HTTP/1.1 200 OKDate: Mon, 27 Jul 2009 12:28:53 GMTServer: ApacheLast-Modified: Wed, 22 Jul 2009 19:15:56 GMTETag: "34aa387-d-1568eb00"Accept-Ranges: bytesContent-Length: 51Vary: Accept-EncodingContent-Type: text/plain
响应内容:
Hello World! My payload includes a trailing CRLF.
一个很好用看请求的网站 http://httpbin.org/get
通过这个网站可以更简单的查看请求的详细信息。
可以通过Python代码模拟各种请求参数和header,发送给这个网站,再来验证发送的是否正确。
5. 完整的网页请求过程
注意你看到一个网页,通常是分多次请求的,一般的过程为:
- 先请求网页文本,也就是HTML
- 根据HTML中的指定的地址,请求其他内容,最常见的是:样式表,JavaScript,图片等
所以在chrome中可以看到很多个请求。如下图所示:
- 每一行都是一个请求
- 浏览器先请求http://www.baidu.com获得了HTML
- 然后发起了多个其他请求去获取css, woff2, png等其他资源
这种特点给爬虫带来困难:
- 我们用代码发送请求,一行代码只能发送一次请求,也就是获得了最基本的HTML。
- 有的网站在第一次的HTML中没有包含真实的数据,真实的数据是通过后续请求获得的,所以有时候你用代码去请求发现获得的网页没有内容。
解决这个问题办法通常有两个:
- 分析各个请求,找到关键的后续请求,用代码发送后续关键请求获取数据。通常,我们没必要像浏览器一样发送所有后续请求,找到关键请求就够了。
- 使用selenium等浏览器驱动,模拟真实的浏览器操作,发送后续所有请求。
6. 请求
1) 请求行
下面例子中的第一行就是请求行,它包含几个关键信息:
- 请求方法:例子中是GET,表示你要干什么
- 请求的资源地址:例子中是 /hello.txt,结合下面的Host (http://ww.example.com)就可以拼接处完整的地址
- 使用的HTTP协议的版本号
HTTP协议有多个版本,现在主要用1.1,HTTP2也有一些应用
GET /hello.txt HTTP/1.1User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi
2) 请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法,这些方法表示这个请求要做什么。
HTTP1.0 定义了三种请求方法:GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
最常用的请求方法是:
- GET 请求表示要获取内容,它不会修改服务器上的数据
- POST 请求表示要提交内容,通常会修改服务器上的内容
这是最基本应该掌握的两个点。下面是完整的HTTP请求方法。
3) 请求参数
GET请求的参数
GET 请求的参数都是放在URL中的,网页看见:
请求参数是以键值对的形式出现,一般形式为:
- 网址的后面紧跟着是一个问号
- 问号的后面是一对对参数,形式为:参数1=参数1的值
- 多个参数之间用&符号隔开
举例:https://www.example.com/page1?参数1=参数1的值&参数2=参数2的值
看一下,上面的截图中有哪些参数,它们的值分别是什么?
POST请求的参数
- POST请求的参数放在请求体中
- 网页上看不见
- 但可以通过chrome开发者工具或者抓包工具看见
格式举例:
GET /hello.txt HTTP/1.1User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi{'name':'麦叔', '特征':'帅','坐标':'一个美丽的城市'}
4) 请求头
这部分内容非常重要,这是爬虫的关键技术之一,因为服务器通常通过请求头来:
- 判定请求是否合法,这是基本的反爬措施。爬虫通常需要添加多个请求头来模拟真实的网页请求
- 判断用户是否登陆了,一般通过Cookie这个特殊的请求头的内容来判定,只要我们给出合理的Cookie,服务器就认为我们是登录过了
下面是一个请求头列表,其中最重要的几个是:
- User-Agent 代表发起访问是什么浏览器。如果不写,基本会被判定为爬虫,直接被拒了。
- Cookie 里面记录了登录信息,或者上次请求服务端设置的信息,也是常用的反爬判定点
- Referer 表示这次请求是从哪里点过来的,有的网站不允许你直接访问某个网页,必须是从它的其他网页点过来才行,这时候就要设置一个Referer值,模拟是从别的网页点过来的情况
7. 响应
1) 状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
HTTP状态码由三个数字组成,第一个数字定义了状态码的类型,后两个数字表示具体的状态。HTTP状态码共分为5种类型:
HTTP状态码列表:
2) 响应头
HTTP响应头包含了网页的重要描述信息,比如网页的格式,网页的过期时间等。
注意下面的
Set-Cookie,它会设置网页的Cookie,在后面的请求中发送给服务器端,用来做身份判定或者反爬。
3) 响应内容和content type
我们最常见的网页的内容格式为:
- HTML - 给人看的页面
- JSON - 数据格式,一般是API,给程序用的,比如手机APP
- XML - 也是数据格式
其实除此之外,还有图片,样式表,JavaScript等。
Content-Type就表示了网页的内容类型,它告诉浏览器文件类型,网页编码,帮助浏览器决定将以什么形式、什么编码读取这个文件。
Content-Type 标头告诉客户端实际返回的内容的内容类型。
语法格式:
Content-Type: text/html; charset=utf-8Content-Type: multipart/form-data; boundary=something
实例:
常见的媒体格式类型如下:
- text/html :HTML格式
- text/plain :纯文本格式
- text/xml :XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml:XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json:JSON数据格式
- application/pdf:pdf格式
- application/msword :Word文档格式
- application/octet-stream :二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded :中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data :需要在表单中进行文件上传时,就需要使用该格式
看视频
配套视频在B站,搜索
“麦叔编程”,不要吝啬你的三连。
我是麦叔,带你学编程,陪你走职场的路。