1 发起网络请求

1.1 Get请求

response = requests.get('http://www.baidu.com')

1.2 Post请求

response = requests.post('http://www.baidu.com',data = {'key':'value'})

1.3 put请求

response = requests.put('http://www.baidu.com',data = {'key':'value'})

1.4 delete请求

response = requests.delete('http://httpbin.org/delete')

1.5 Head请求

response = requests.head('http://httpbin.org/get')

1.6 options

response = requests.options('http://httpbin.org/get')

2 网络请求的响应内容

2.1 文本

文本的响应内容一般用于获取网页源码

response = requests.get('http://www.baidu.com')
response.text #文本

2.2 二进制

二进制响应内容一般用于下载图片,视频等二进制资源

response = requests.get('http://www.baidu.com')
response.content #二进制

2.3 Json

json响应内容一般用于请求web接口

response = requests.get('http://www.baidu.com')
response.json() #json

2.4 原始响应内容

response = requests.get('http://www.baidu.com')
response.raw

3 requests的可传递参数详解

  1. url:请求的网络地址
  2. params:要发送的元祖或者字节列表
  3. data:要发送的字典,元祖,字节列表
  4. json:要发送的json对象
  5. headers:Http请求头
  6. cookies:与请求一起发送的cookies
  7. file:传递一个文件,该参数为字典
  8. auth:用于Http验证
  9. timeout:等待服务器发送数据的描述,超时设置
  10. allow_redirects:开启或者静止options/post/get/put/patch/delete/head重定向,默认为True
  11. proxies:代理url,字典形式传递
  12. verify:是否验证服务器的TLS证书或者字符串,默认为True
  13. stream:如果为False,响应内容立即被下载
  14. cert:如果为String,则为ssl客户端证书文件.pem的路径,如果是元祖,则为(“证书”,“秘钥”)

4 示例应用

4.1 Post请求传递数据

4.1.1 Post请求传递表单(字典)

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)

4.1.2 Post请求传递表单(元组)

payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)

4.1.3 Post请求传递json

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}r = requests.post(url, data=json.dumps(payload))

4.1.4 Post请求传递文件

一:

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

二:

url = 'http://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)

三:

url = 'http://httpbin.org/post'
files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
r = requests.post(url, files=files)

流式上传

with open('massive-body') as f:
    requests.post('http://some.url/streamed', data=f)

4.2 使用代理

4.2.1 Http或者Https代理

import requests
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

4.2.2 Socket代理

安装第三方依赖
pip install requests[socks]

import requests
proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}
requests.get("http://example.org", proxies=proxies)

4.3 超时设置

为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着 timeout 参数。在默认情况下,除非显式指定了 timeout 值,requests 是不会自动进行超时处理的。如果没有 timeout,你的代码可能会挂起若干分钟甚至更长时间。

4.3.1 一个超时参数

r = requests.get('https://github.com', timeout=5)
如果只是传递一个超时参数,则这个超时参数将作为connect和read二者的超时参数

4.3.2 两个超时参数

r = requests.get('https://github.com', timeout=(3.05, 27))
如果传入一个元祖,则分别代表connect和read的超时参数

4.3.3 永久等待

如果远端服务器很慢,你可以让 Request 永远等待,传入一个 None 作为 timeout 值
r = requests.get('https://github.com', timeout=None)
谨慎使用。

4.4 Get请求传递参数

4.4.1 直接使用请求接口链接,拼接?号携带参数

import requests

url = 'http://www.baidu.com/s?wd=python'  # 使用?携带参数
r = requests.get(url)
print(r.url)

4.4.2 使用字典传参

import requests

url = 'http://www.baidu.com/s'  
params = {'wd': 'python'}  # 也可以将携带的参数传给params
r = requests.get(url, params=params)
print(r.url)

5 响应内容属性

r = requests.get('http://www.baidu.com')
那么我们可以获取响应内容的一些属性:

  1. r.status_code:响应状态码
  2. r.raw:原始响应体,使用r.raw.read()读取
  3. r.content:字节方式的响应体,需要进行解码
  4. r.text:字符串方式的响应体,会自动更具响应头部的字符编码进行解码
  5. r.headers:以字典对象储存服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在,则返回None
  6. r.json():request中内置的json解码器
  7. r.raise_for_status():请求失败(非200响应),抛出异常
  8. r.url:获取请求的url
  9. r.cookies:获取请求后的cookies
  10. r.encoding:获取编码格式

6 异常

  1. requests.exceptions.HTTPError:HTTP错误
  2. requests.exceptions.ConnectionError:连接错误
  3. requests.exceptions.ProxyError:代理错误
  4. requests.exceptions.SSLError:SSL错误
  5. requests.exceptions.Timeout:请求超时错误,包含requests.exceptions.ConnectTimeout和requests.exceptions.ReadTimeout
  6. requests.exceptions.ConnectTimeout:尝试连接到远程服务器时错误
  7. requests.exceptions.ReadTimeout:服务器未在分配的时间内发送任何数据
  8. requests.exceptions.URLRequired:url格式错误
  9. requests.exceptions.TooManyRedirects:过多的重定向
  10. requests.exceptions.MissingSchema:网址架构(例如http或https)丢失。
  11. requests.exceptions.InvalidSchema:无效的架构
  12. requests.exceptions.InvalidURL:无效的url
  13. requests.exceptions.InvalidHeader:无效的请求头
  14. requests.exceptions.InvalidProxyURL:无效的代理链接
  15. requests.exceptions.ChunkedEncodingError:服务器声明了分块编码,但发送了无效的分块。
  16. requests.exceptions.ContentDecodingError:解码响应内容失败
  17. requests.exceptions.StreamConsumedError:该响应的内容已被占用
  18. requests.exceptions.RetryError:自定义重试逻辑失败
  19. requests.exceptions.UnrewindableBodyError:尝试快退正文时,请求遇到错误

7 requests.status_code(同Http请求状态码)

1xx:请求收到,继续处理
2xx:操作成功收到,分析、接受
3xx:完成此请求必须进一步处理
4xx:请求包含一个错误语法或不能完成
5xx:服务器执行一个完全有效请求失败
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——客户端发起的请求错误,如语法错误
401——请求授权失败,需要身份认证
402——保留有效ChargeTo头响应
403——服务端理解客户端的请求,但是拒接此请求(你说气不气?)
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址,410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器内部发生错误,无法完成请求响应
501——服务器不支持请求的功能
502——充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503——服务器过载或处于维护状态,暂停服务
504——充当网关或代理的服务器,未及时从远端服务器获得请求
505——服务器不支持或拒绝请求头中指定的HTTP版本