HTTP协议
HTTP 协议:一般指HTTP(超文本传输)协议。
HTTP是为Web浏览器和Web服务器之间的通信而设计的,基于TCP/IP通信协议嘞传递数据。
HTTP消息结构
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式
- 请求行(request line)
- 请求头(header)
- 空行
- 请求数据
服务器相应消息
HTTP相应也由四个部分组成
- 状态行
- 消息报头
- 空行
- 响应正文
HTTP响应头信息
HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。
以下是一些例子
- Allow 服务器支持哪些请求方法
- Connect-Encoding 文档的编码方法
- Connect-Length 表示内容长度
- Connect-Type 表示后面的文档属于什么MIME类型。
- 该属性用于定义网络文件的类型和网页的编码 例如
Connect-Type: text/html; charset=utf-8
- MIME类型:描述消息内容类型的标准。通用结构
type/subtype
- 该属性用于定义网络文件的类型和网页的编码 例如
- Date 当前的GMT(格林威治标准时间)时间
HTTP请求方法
HTTP请求方法有很多种,其中1.0版本有 GET、POST、HEAD三种,1.1版本又新增了六种。
- GET:请求指定的页面信息,并返回实体主体
- HEAD:类似于GET请求,只不过返回的响应中没有具体内容,用于获取报头
- POST:向指定资源提交数据进行处理请求。数据被包含在请求体中。请求可能导致新的资源的建立或已有资源的修改。
HTTP状态码
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,共五类。
- 1xx:信息,服务器收到请求,需要操作者继续执行操作
- 2xx:成功,操作被成功接收并处理
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
urllib 示例
urllib发送get请求
直接上代码,urllib发送get请求
from urllib import request
with request.urlopen('http://httpbin.org/get') as f:
data = f.read() #f.read()返回响应正文
#print(data.decode('utf-8'))
#直接输出结果,需要解码
#输出结果到文件
with open('get_response.text', 'wb') as f:
f.write(data)
最简单的发送get请求的方法,使用openurl函数,尽管这个函数能实现的功能较为有限。
http://httpbin.org/get
可以帮助学习如何发送get请求。响应的正文包含了get请求的相关信息。
with
语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭/线程中锁的自动获取和释放等。
以下是响应的正文部分:
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.12",
"X-Amzn-Trace-Id": "Root=1-65d7213d-6d15d2b651139df358d943b7"
},
"origin": "42.229.145.105",
"url": "http://httpbin.org/get"
}
该网址返回的正文是请求的响应信息
args
可以通过url直接带入:http://httpbin.org/get?name=Bob&job=teacher
headers
请求头中可以看出,User-Agent就是我们使用的库函数,一些网站需要将User-Agent
指定为常用的浏览器。
若要添加请求头,则需要用到
urllib.Request()
类。
requests库
requests库是基于python开发的HTTP库,与urllib标准库相比,代码要简洁。实际上,requests库是在urllib的基础上进行了高度封装。
使用requests库来发送HTTP请求更加简便。
get请求
import requests
#设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
}
#传入参数时,可以利用params关键字传入,接收字典类型,与直接在url加入参数效果相同。
#使用post方法时,利用data关键字接收参数。
r = requests.get('https://baidu.com', headers = headers)
#基本属性
print(type(r))
#响应对象类型 <class 'requests.models.Response'>
print(r.status_code)
#响应状态码 200
print(r.cookies)
#查看cookies <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
print(r.headers)
#查看响应头
print(r.url)
#url
#响应正文内容
print(r.text) #相应内容(str)
print(r.content) #响应内容(bytes) 可以用decode解码