基本
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) # 请求 urlrsp = 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 requestss = 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
