摘要
准备系统地学习下python的三方库 - requests。python自带的urllib, urllib3就不写了。
参考书籍是另一位大佬的
系统环境:MacOS,python3
参考内容:Requests API;参考书籍下载;
预备知识
HTTP的消息结构
参考资料:https://www.runoob.com/http/http-messages.html
有两种类型的消息:客户端到服务器、服务器到客户端
消息结构都有三部分:起始行、头域、空行、消息体
起始行 | 头域 | 空行 | 消息体 | |
客户端请求消息 | 请求行(request line) | 请求头(header) | 空行 | 请求体 |
---|---|---|---|---|
服务器响应消息 | 响应行 | 响应头 | 空行 | 响应体 |
HTTP请求消息
参考资料:https://www.runoob.com/http/http-methods.html
- 请求行
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件,数据被包含在请求体中。 POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
- 请求头
方法 | 描述 |
---|---|
Accept | 浏览器声明请求接收的文件类型。 |
Accept-Encoding | 浏览器声明接受的响应内容的编码格式。 |
Accept-Language | 浏览器声明其接受的自然语言类型。 |
Connection | 浏览器声明此次请求的连接模式。 |
Cookie | 浏览器发出的为了声明本次请求的身份、便于进行 session 跟踪而储存在本地的数据。 通常由键值对组成,常用于用户身份的持久化认证。 |
Host | 表示浏览器请求的主域名。 |
User-Agent | 浏览器的标识。不同操作系统、不同版本、不同厂商的浏览器的标识各不一致。 |
- 请求体
通常只有post、put请求方法会用到。
HTTP响应消息
参考资料:https://www.runoob.com/http/http-status-codes.html
- 响应行
响应行即是状态码,由三个十进制数字组成,第一个十进制数字定义了状态码的类型。
响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)。
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的HTTP状态码:
状态码 | 说明 |
---|---|
200 | 请求成功 |
301 | 资源(网页等)被永久转移到其它URL |
404 | 请求的资源(网页等)不存在 |
500 | 内部服务器错误 |
- 响应头
key | 说明 |
---|---|
Connection | 表示这个 HTTP 连接的模式 |
Content-Encoding | 表示响应实体的编码方式。浏览器在发送请求的时候,会通过 Accept-Encoding 头域带上自己支持的内容编码格式列表;服务器端接收到之后,会从中挑选一种用来对响应实体进行编码,并通过 Content-Encoding 响应头指明选定的格式;浏览器拿到响应正文后,依据 Content-Encoding 进行解压。 |
Content-Type | 表示响应实体的类型,用于定义响应的文件类型和网页的编码,以此来决 定浏览器以什么形式、什么编码来读取这个响应实体。 |
Date | 当前的GMT时间。 |
Server | 表示响应服务器的架构。 |
Transfer-Encoding | 表示响应实体的传输编码模式。 |
- 响应体
网页正文
这里有更详细的说明
安装requests库
在terminal中直接安装。
pip3 install requests
注意terminal使用的是系统bash还是zsh,两个脚本的环境变量不通用,之前用的哪个就用哪个。
requests的基本使用
# 导包
import requests
# 网址
url = "https://www.baidu.com"
# 请求方式
method = "get"
# 获取内容
response = requests.request(method, url)
# 查看返回的内容
a = dir(response)
print("_______________响应结果的所有属性_______________")
for i in range(len(a)):
if i % 5 == 0:
print()
print(f'{a[i]}'.ljust(25), end = ' ')
print("\n_______________目标地址_______________")
print(response.url)
print("\n_______________响应头_______________")
h = response.headers
for i in h:
print(f'{i}'.ljust(20)+':'+f'{h[i]}')
# 编码方式
print("\n_______________响应体的编码方式_______________")
print(f"原编码方式:"+response.encoding)
response.encoding = "utf-8"
print(f'修改后的编码方式:'+response.encoding)
# 响应体的内容
print("\n_______________响应体的内容_______________")
print(f'通过text方法获取:\n'+response.text[:100] + "...")
print(f'通过content方法获取:\n', response.content[:100])
requests的正常使用
参考资料:https://docs.python-requests.org/en/latest/_modules/requests/api/#head
常这样去请求服务器:
url = "https://www.baidu.com"
r = requests.get(url)
r = requests.post(url)
r = requests.put(url)
r = requests.options(url)
...
但代码内部实际上是执行的下面这句话
method = "post"
requests.request(method, url)
...
添加请求头信息
import requests
header = {
'Host': 'www.baidu.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36',
'Connection': 'Keep-Alive',
'Content-Type': 'text/plain; Charset=UTF-8', 'Accept-Language': 'zh-cn',
'Cookie': '1111',
}
r = requests.get("https://www.baidu.com", headers=header)
c = requests.request("get", "https://www.baidu.com", headers=header)
# 两种方法都一样
print(r.text[:222])
print(c.text[:222])