URI和URL
URI:统一资源标志符(全称Uniform Resource Identifier )
URL:统一资源定位符(全称Universal Resource Locator )
URL简单来说就是网页链接,比如下面这个百度的网址,就是一个URL
URI和URL是父与子的关系,URL是URI的子集
URI还有一个子集URN,URN是统一资源名称,只命名资源不定位资源,互联网中用的非常少
为了简单记忆,一般网页链接我们可以统称为URL
超文本
超文本=网页源代码(HTML代码)
我们看到的所有网页,都是超文本解析而成的。
如何查看超文本
打开任意网页→右键→检查(审查元素)
HTTP和HTTPS
在URL的开头会有http或https,比如知乎的网址中,开头是https。
/
无论是http还是https,它们都是一种协议类型。
HTTP的中文名叫作超文本传输协议
HTTP和HTTPS的区别是,HTTPS是HTTP的安全版,它传输的内容都是经过SSL加密的。
HTTPS的作用是建立一个信息安全通道来保证数据传输安全。凡是使用了HTTPS的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证后的真实信息。
目前越来越多的网站和App都已经向HTTPS方向发展
自1月1日以后,苹果公司强制要求所有的IOS App都必须使用HTTPS加密,否则无法在应用商店上架。谷歌从1月开推出的Chrome56开始,对未进行HTTPS加密的网址链接亮出风险提示。
腾讯微信小程序的官方需求文档要求后台使用HTTPS请求进行网络通信,不满足条件的域名和协议无法请求。
HTTP请求过程
步骤:
【1】输入URL
【2】浏览器向网站所在服务器发送请求
【3】网站服务器接收到请求后进行处理和解析
【4】将响应内容传回给浏览器,包含页面的源码(超文本)
【5】浏览器对返回内容进行解析,然后呈现结果。
访问示例
下面我们使用Chrome浏览器,访问百度,进行详细说明。
首先,打开Chrome浏览器,右击并选择“检查”选项,点击Network选项卡
然后输入百度的URL后回车,观察这个过程发生了怎样的网络请求。
我们观察第一个网络请求:。
各列含义如下:
第一列Name:请求的名称,一般为URL的最后一部分第二列Status:响应的状态码,200,代表响应正常第三列Type:请求的文档类型,document,代表我们请求的是一个HTML文档。第四列Initiator:请求源,用来标记请求是哪个对象或进程发起的。第五列Size:从服务器下载的文件和请求的资源大小。第六列Time:发起请求到获取响应所用时间第七列Waterfall:网络请求的可视化瀑布流
点击这个条目,查看详细信息
General部分
Request URL:请求的URL
Request Method:请求方法
Status Code:响应状态码
Remote Address:远程服务器的地址和端口
Referrer Policy:Referrer判别策略
Response Headers 和 Request Headers 分别代表响应头和请求头
Response Headers:响应头就是响应的一部分,例如其中包含了服务器的类型、文档类型、日期等信息,浏览器接受到响应后,会解析响应内容,进而呈现网页内容。
Request Headers:请求头里代表许多请求信息,例如浏览器标识、Cookies、Host等信息。服务器会根据请求头内的信息判断请求是否合法,进而作出对应响应。
请求
请求是由客户端向服务端发出,可以分为4部分内容:
请求方法(Request Method)请求的网址(Request URL)请求头(Request Headers)请求体(Request Body)
1.请求方法
常见的的请求方法有两种:GET和POST
GET:在浏览器中直接输入URL并回车,便发起了一个GET请求,请求参数会直接包含到URL里。例如,在百度中搜索Pyhon,链接为 /s?wd=Python,其中URL中包含了请求的参数信息,这里参数wd表示要搜寻的关键字。
POST:对于一个登陆表单,输入用户名和密码后,点击“登陆”按钮,这通常会发起一个POST请求,其数据通常以表单形式传输,而不会体现在URL中。(因为需要提交的用户名和密码包含了敏感信息,使用GET方式请求的话,密码会暴露在URL里。)
GET和POST请求的区别:
【1】GET请求的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据通常以表单形式传输,会包含在请求体中。
【2】GET请求提交的数据最多只有1024节,POST方式没有限制。
我们平时接触到的绝大部分请求都是GET和POST请求,另外还有其他的请求方法。
详情可查询( HTTP 请求方法 | 菜鸟教程)
2.请求的网址
即为统一资源定位符URL,它可以唯一确定我们想请求的资源。
3.请求头
用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。
常用的头信息:
Accept:请求报头域,用于指定客户端可接受那些类型的信息。
Accept-Encoding:指定客户端客可接受的内容编码。
Accept-Language:指定客户端可接受的语言类型。
Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关位置。
Cookie:也常用复数形式Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。
举例:你输入了用户名和密码登陆了知乎,服务器会用会话保存登陆状态信息,后面我们每次刷新或请求知乎的其他页面时,我们始终会保持登陆状态。
这就是Cookie的作用,Cookie的信息标识了我们对应服务器的会话,每次浏览器在请求知乎的页面时,都会在请求头中加上Cookie并发送给服务器,服务器通过Cookie识别出你,并查出当前是登陆状态,所以返回结果就是登陆之后才能看到的网页内容。
Referer:此内容用来标识这个请求是从哪个页面发过来,服务器可以拿这个信息做来源统计、防盗链处理等。
User-Agent:简称UA,它是一个特殊字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本信息,相当于浏览器的身份证。在做爬虫时加上这个信息,可以伪装为浏览器,如果不加,很可能会被识别为爬虫。
Content-Type:也叫互联网媒体类型或者MIME类型,在HTTP下协议消息头中,它用来标识具体请求中的媒体类型信息。
例如:text/html代表HTML格,image/gif代表GIF图片,applocation/json代表JOSN类型。
4.请求体
一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。
在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并了解各种请求库的各个参数设置时,使用的是哪种Content-Type,不然可能会导致POST提交后无法正常响应。
详情可以查询(HTTP content-type)
响应
响应由服务端放回给客户端,可以分为三部分:
响应状态码(Response Status Code)响应头(Response Headers)响应体(Response Body)
1.响应状态码
响应状态码表示服务器的响应状态,例如200代表服务器正常响应,404代表页面未找到,500代表服务器内部发生错误。
在爬虫中,我们可以根据状态码来判断服务器响应状态,如状态码200,则证明成功返回数据,再进行进一步的处理,否则直接忽略。
常见状态代码及错误原因可以查询(HTTP状态码 | 菜鸟教程)
2.响应头
响应头包含了服务器对请求的应答信息,如Content-Type、Server、Set-Cookie等。
常用的头信息:
Date:标识响应产生的时间。
Last-Modified:指定资源的最后修改时间。
Expires:指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。
Content-Encoding:指定响应内容的编码。
Server:包含服务器的信息,比如名称、版本号等。
Content-Type:文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档,application/x-javascript则代表返回Javascript文件,image/jpeg则代表返回图片。
Set-Cookie:设置Cookie,响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookie中,下次请求携带Cookie请求。
3.响应体
响应体是最重要的内容,响应的正文数据都在响应体中。
比如请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据,我们做爬虫请求网页后,要解析的内容就是响应体。
在浏览器开发者工具中点击Preview,就可以看到网页的源代码,也就是响应体的内容,它是解析的目标
在做爬虫时,我们主要通过响应体得到网页的源代码、JSON数据等,然后从中做相应内容的提取。
本文总结参考《Python3网络爬虫开发实战》