基本

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() 的基本参数有两个,urldatadata 不再作为访问控制参数。

get 方法

函数原型:requests.get(url[, **kwargs])

  1. rsp = requests.get(url) # 请求 url
  2. rsp = requests.get(url, headers = 字典)
  3. # 自定义请求头,如 headers = {'user-agent': 'my-app/0.0.1'} rsp = requests.get(url, headers=headers)
  4. rsp = requests.get(url, timeout = 时间) # 设置超时时间
  5. rsp = requests.get(url, params = 字典)
  6. # 将字典中的数据自动转换为 key1=value1&key2=value2 的形式向指定 url 发送请求
  7. rsp = requests.get(url, proxies = 字典) # 设置代理
  8. rsp = requests.get(url, stream=True)
  9. # 启用流下载。默认为 False
  10. # 若关闭流下载,数据会在请求时就下载并保存到内容中
  11. # 若开启,只有响应头被立即下载,数据不会立即下载,而是在打印或写入文件时再一块一块地下载。在下载大文件时,最好用这种方式,占用内存少

下载网页等字符数据:直接将 rsp.text 的内容保存到文件中。

下载图片、音乐、视频等二进制数据:

  1. 直接将 rsp.content 以二进制方式写入到文件中。
  2. 用流模式下载
    1. rsp = requests.get(url, stream = True) //打开流下载模式
    2. with open('file.mp3', 'wb') as file:
    3. for data in rsp.iter_content(1024 * 10): //指定每块为 10240 字节,一块一块的下载,并写入文件
    4. file.write(data)

    post 方法

函数原型:requests.post(url[, **kwargs])

基本用法:rsp = requests.post(url, data = 字典)

上传文件:

  1. 直接上传

    1. files = {'file': open('report.xls', 'rb')}
    2. rsp = requests.post(url, files = files)
  2. 流上传

    1. with open('massive-body', 'rb') as f:
    2. 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 对象中,并在以后每次请求时携带,简化了爬虫的编写:

  1. import requests
  2. s = requests.session() # 创建 session 对象
  3. s.post("https://xxx.xxx/login", data={ # 假设这是登录
  4. "username": "xxx",
  5. "password": "xxx"
  6. })
  7. # 以后发任何请求时将 requests 换成 s 即可
  8. print(s.cookies) # s.cookies 是一个 cookie对象 列表
  9. s.cookies["cookie_name"] = "cookie_value" # 有时候可能需要手动添加或修改 cookie