http协议
什么是http和https协议
- http协议:全称是HyperText Transfer Protocol,中文意思是超文本传输协议,是一种发布和接受HTML页面的方法,服务器端口号是80端口。
- https协议:是HTTP协议的加密版本,在HTTP下加入了SSL层。服务器端口号是443端口。
在浏览器冲发送一个http请求的过程
1. 用户输入网址,浏览器发起DNS查询请求
- 在浏览器中输入www.qq.com域名,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)。
- 当浏览器缓存中无域名对应IP时操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
- 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
DNS解析详细过程参考
https://blog.csdn.net/m0_37812513/article/details/78775629
https://blog.csdn.net/zhangyuan19880606/article/details/51141610
https://www.cnblogs.com/smilenana/p/3414077.html
2. 建立TCP连接
浏览器通过DNS获取到web服务器真的IP地址后,便向web服务器发起tcp连接请求,通过TCP三次握手建立好连接后,浏览器便可以将HTTP请求数据通过发送给服务器了。
3. 浏览器向 web 服务器发送一个 HTTP 请求
HTTP请求是一个基于TCP协议之上的应用层协议——超文本传输协议。一个http事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。
4. 发送响应数据给客户端
Web服务器通常通过监听80端口,来获取客户端的HTTP请求。与客户端建立好TCP连接后,web服务器开始接受客户端发来的数据,并通过HTTP解码,从接受到的网络数据中解析出请求的url信息以前其他诸如Accept-Encoding、Accept-Language等信息。Web服务器根据HTTP请求头的信息,得到响应数据返回给客户端。
5. 浏览器解析http response
- html文档解析(DOM Tree)
- 浏览器发送获取嵌入在HTML中的对象
- css解析(parser Render Tree)
- js解析
URL组成详解
Uniform Resource Locator,统一资源定位符。一个url由以下几部分组成:
scheme:
//host:port/path/?query-string=xxx#anchor
scheme:代表访问的协议,一般为http或者https以及ftp
host:主机名,域名,比如:www.baidu.com。
port:端口号。浏览器默认使用80端口。
path:查找路径。比如www.jianshu.com/trending/now,后面的trending/now就是path
query-string:查询字符串。比如:www.baidu.com/s?wd=python,后面的wd=python就是查询字符串。
anchor:锚点,后台一般不用管,前端用来做页面的定位的。
注意:URL中所有的字符都是ASCII字符集,如果出现非ASCII字符集,比如中文,浏览器会先进行编码再进行传输
常用请求方法
在http协议中,定义了八种请求方法。其中最常用的是get和post。
- get请求:一般情况下,只从服务器获取数据,并不会对服务器资源产生任何影响时会使用get请求。
- post请求:向服务器发送数据(登陆),上传文件等,会对服务器资源产生影响时使用post请求。
以上是网站开发中常用的两种方法,并且一般情况下都会遵循这样的使用原则。但有的网站和服务器为了做反爬机制,也经常会不按常理出牌,有可能应该使用get请求时改用post请求(例如拉勾网),这个要视情况而定。
请求常用的参数
在http协议中,向服务器发送一个请求,数据分为三个部分,第一个把数据放在url中,第二个是把数据放在body中(在post中),第三个是把数据放在head中,这里介绍一些经常在网络爬虫经常会用到的请求头参数:
- User-Agent:浏览器名称,这个在网络爬虫会经常用到。请求一个网页时,服务器通过这个参数就可以知道这个请求是由那种浏览器发送的。python开发的爬虫User-Agent的值是python,这对于有反爬机制的网站来说,可以轻易的判断你的请求是爬虫。因此我们一般要对这个值进行设置,来伪装请求。
- Referer:表明当前的请求是从那个url过来的,这个一般也可以用来做反爬技术。如果不是从指定的页面过来,那么就不做相关的响应。
- Cookies:因为http协议是无状态的,也就是同一个人发送了两个请求,服务器没有能力知道请求是否来自同一个人,这时候可以用cookie来标识。一般想要做登陆后才能访问的网站,那么就需要发送cookie信息了。
HTTP常见响应状态码及解释
- 2XX Success(成功状态码)
- 200 表示从客户端发来的请求在服务器端被正常处理
- 204 该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分
- 206 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求
- 3XX Redirection(重定向状态码)
- 301 永久性重定向
- 302 临时性重定向
- 4XX Client Error(客户端错误状态码)
- 400 该状态码表示请求报文中存在语法错误
- 401 该状态码表示发送的请求需要有通过HTTP认证的认证信息
- 403 该状态码表明对请求资源的访问被服务器拒绝了。
- 404 该状态码表明服务器上无法找到请求的资源
- 5XX Server Error(服务器错误状态码)
- 500 该状态码表明服务器端在执行请求时发生了错误。
- 503 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。