基本
requests 的运行流程:构造一个 Request
对象发送给服务器,将服务器返回的内容构造成一个 Response
对象返回。
requests 库的 7 个方法:request()
, get()
, post()
, head()
, patch()
, put()
, delete()
,其中后六个分别对应 HTTP 对 URL 位置的资源的六种操作。
requests 模块中实际上只有一个方法 request()
,其他六个方法都是基于该方法。
requests 库的根本:request 方法
函数原型:requests.request(method, url[, **kwargs])
method
为请求方式,有 GET
, POST
, HEAD
, PATCH
, PUT
, delete
, OPTIONS
。将 method
设置为 GET
,那么这个函数的作用就相当于 requests.get()
,其他同理。OPTIONS
为获取一些服务器和客户端打交道的参数,很少用。
**kwargs
包含 13 个访问控制参数:
参数 | 含义 |
---|---|
headers | 一个字典。定制请求头。 |
timeout | 设置请求超时时间,单位 s。如果在请求时间内没有请求成功,抛出一个 Timeout 异常 |
params | 一个字典,将字典中的数据自动转换为 key1=value1&key2=value2 的形式向指定 url 发送请求 |
proixes | 设置代理,值是一个字典,字典格式:字典名 = {'http': 'http://10.10.1.10:3128', 'https': 'https://10.10.1.10:1080'} 。可以只写 http 或 https。有 https 时默认先使用 https |
data | 字典或字节序列或文件,一般在向服务器提交数据时使用。一般用于 POST 方法。 |
json | 一个字典,将数据以 json 格式提交。 |
files | 一个字典,字典格式为 file = {'file': open('report.xls', 'rb')} 。用于上传文件。 |
stream | 值为 True / False 。表示是否开启流模式,默认为 False 。 |
allow_redirects | 值为 True / False 。表示是否允许重定向,默认为 True 。 |
verify | 值为 True / False 。是否认证 SSL 证书,默认为 True 。 |
cookies | 字典或 CookieJar 。从 HTTP 协议中解析 cookie。 |
auth | 一个元组。用于身份认证功能。 |
cert | 本地 SSL 证书路径。 |
基于 request()
的其他方法也都是这 13 个参数,只不过有些函数的有些访问控制参数不再作为访问控制参数,而是作为默认参数。如 requests.post()
的基本参数有两个,url
和 data
,data
不再作为访问控制参数。
get 方法
函数原型:requests.get(url[, **kwargs])
rsp = requests.get(url) # 请求 url
rsp = requests.get(url, headers = 字典)
# 自定义请求头,如 headers = {'user-agent': 'my-app/0.0.1'} rsp = requests.get(url, headers=headers)
rsp = requests.get(url, timeout = 时间) # 设置超时时间
rsp = requests.get(url, params = 字典)
# 将字典中的数据自动转换为 key1=value1&key2=value2 的形式向指定 url 发送请求
rsp = requests.get(url, proxies = 字典) # 设置代理
rsp = requests.get(url, stream=True)
# 启用流下载。默认为 False
# 若关闭流下载,数据会在请求时就下载并保存到内容中
# 若开启,只有响应头被立即下载,数据不会立即下载,而是在打印或写入文件时再一块一块地下载。在下载大文件时,最好用这种方式,占用内存少
下载网页等字符数据:直接将 rsp.text
的内容保存到文件中。
下载图片、音乐、视频等二进制数据:
- 直接将
rsp.content
以二进制方式写入到文件中。 - 用流模式下载
rsp = requests.get(url, stream = True) //打开流下载模式
with open('file.mp3', 'wb') as file:
for data in rsp.iter_content(1024 * 10): //指定每块为 10240 字节,一块一块的下载,并写入文件
file.write(data)
post 方法
函数原型:requests.post(url[, **kwargs])
基本用法:rsp = requests.post(url, data = 字典)
上传文件:
直接上传
files = {'file': open('report.xls', 'rb')}
rsp = requests.post(url, files = files)
流上传
with open('massive-body', 'rb') as f:
requests.post('http://some.url/streamed', data=f)
Response 对象的常用属性和方法
| 属性、方法 | 含义 | | —- | —- | | rsp.url | 服务器返回的 url (重定向后的 url) | | rsp.content | 服务器返回的 原始数据(即 二进制数据) | | rsp.text | 将服务器返回的二进制数据 根据
rsp.encoding
的值 编码后的数据 | | rsp.encoding | 指定用哪种编码类型来将rsp.text
编码(默认值是从 HTTP header 中猜测出来的) | | rsp.apparent_encoding | 从内容中分析出的响应内容编码方式(一般用作备选编码方式) | | rsp.status_code | 状态码 | | rsp.headers | 服务器响应的 headers | | rsp.requests.headers | 发送到服务器的 headers | | rsp.history | 可用于追踪重定向 | | rsp.raise_for_status() | 如果状态码是 200,不执行操作;如果不是 200,会产生一个requests.HTTPError
异常 |
requests 库的异常
异常 | 含义 |
---|---|
requests.ConnectionError | 网络连接错误异常,如 DNS 查询失败、拒绝连接等 |
requests.HTTPError | HTTP 错误异常 |
requests.ConnectTimeout | 连接服务器超时(仅指与服务器连接过程产生的超时异常) |
requests.Timeout | 请求超时(发出 URL 请求到获得内容整个过程的超时异常) |
requests.URLRequired | URL 缺失异常 |
requests.TooManyRedirects | 超过 requests 内定的最大重定向次数,产生重定向异常 |
session 的使用
编写爬虫时经常会遇到需要登录的情况,目前来说大多数网站还是采用 session + cookies 的方式来验证用户身份。在用户登录后,网站服务器会返回一个 SESSIONID
并以 cookie 形式保存在本地,后续访问该网站时每个请求都必须携带这个 cookie,否则会重定向到登录页面。
requests
库提供了一个 session
类用来管理会话,用 session
对象发送请求时,requests
会自动将服务器返回的 cookies 保存在 session
对象中,并在以后每次请求时携带,简化了爬虫的编写:
import requests
s = requests.session() # 创建 session 对象
s.post("https://xxx.xxx/login", data={ # 假设这是登录
"username": "xxx",
"password": "xxx"
})
# 以后发任何请求时将 requests 换成 s 即可
print(s.cookies) # s.cookies 是一个 cookie对象 列表
s.cookies["cookie_name"] = "cookie_value" # 有时候可能需要手动添加或修改 cookie