目录

Python网络请求系列Requests使用详解(二)

一、前言:

  • 我们之前学习了requests的基本使用
  • 本次我们将继续学习requests的使用技巧,包含自定义代理等头部信息、cookies的管理创建复杂的post请求等等。

二、挖坑历程

1、自定义headers数据

  • 实际开发过程中我们将不可避免的需要自定义请求的头部参数,如设置代理、过期时间等等。

  • 使用requests自定义headers参数是非常方便的。

  • 如自定义代理的示例代码如下:

      import requests
      url = 'https://api.github.com/some/endpoint'
      headers = {'user-agent': 'my-app/0.0.1'}
      r = requests.get(url, headers=headers)
    
  • headers参数接收一个字典类型的数据,我们通过设置user-agent便可配置我们的代理了。

  • 注意事项:通过headers配置头部参数优先级并不是最高的,

  • 1、如果在.netrc中指定了证书,那么headers中的auth将会被重写。

  • 2、如果你的请求重定向到一台离线的主机上,那么Authorization头部信息将被移除。

  • 3、如果请求的url中提供了证书,那么Proxy-Authorization头部信息将被重写

  • 4、如果requests从响应的数据中检测到了内容的长度,Content-Length的值将被重写。

2、发送复杂的post请求

  • 如果你想像html一样发送表达数据,此时我们只需要传递一个字典类型的数据给data参数即可。

  • 代码如下:

      import requests
      payload = {'key1': 'value1', 'key2': 'value2'}
    
      r = requests.post("http://httpbin.org/post", data=payload)
      print(r.text)
    
  • 结果输出如下:

      {
        "args": {}, 
        "data": "", 
        "files": {}, 
        "form": {
      	"key1": "value1", 
      	"key2": "value2"
        }, 
        "headers": {
      	"Accept": "*/*", 
      	"Accept-Encoding": "gzip, deflate", 
      	"Connection": "close", 
      	"Content-Length": "23", 
      	"Content-Type": "application/x-www-form-urlencoded", 
      	"Host": "httpbin.org", 
      	"User-Agent": "python-requests/2.18.4"
        }, 
        "json": null, 
        "origin": "61.140.162.240", 
        "url": "http://httpbin.org/post"
      }
    
  • 当然,我们也可以传入一个元组类型的数据达到同样的效果,而且在同一个key对应多个值,该方式更好。

  • 代码如下:

      import requests
      payload = (('key1', 'value1'), ('key1', 'value2'))
      r = requests.post("http://httpbin.org/post", data=payload)
      print(r.text)
    
  • 结果输出如下:

      {
        "args": {}, 
        "data": "", 
        "files": {}, 
        "form": {
      	"key1": [
      	  "value1", 
      	  "value2"
      	]
        }, 
        "headers": {
      	"Accept": "*/*", 
      	"Accept-Encoding": "gzip, deflate", 
      	"Connection": "close", 
      	"Content-Length": "23", 
      	"Content-Type": "application/x-www-form-urlencoded", 
      	"Host": "httpbin.org", 
      	"User-Agent": "python-requests/2.18.4"
        }, 
        "json": null, 
        "origin": "61.140.162.251", 
        "url": "http://httpbin.org/post"
      }
    
  • 当然,我们也可以直接发送一个string类型的数据,这样的需求往往也是比较多的。

  • 我们看示例代码:

      import requests
      import json
    
      url = 'https://api.github.com/some/endpoint'
      payload = {'some': 'data'}
      r = requests.post(url, data=json.dumps(payload))
      print(r.text)
    
  • 当然,更直接的我们可以直接发送一个json格式的数据

  • 代码如下:

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

3、post上传文件

  • 实际开发过程中,上传文件的需求也是比较常见的,requests针对文件上传也做了很好的封装

  • 使用是我们通过files参数自定文件即可。

  • 示例代码如下:

      import requests
    
      url = 'http://httpbin.org/post'
      files = {'file': open('report.xls', 'rb')}
      r = requests.post(url, files=files)
    
  • 我们还可以更细粒度的控制文件上传的细节,如指定文件名,文件类型以及过期时间等等。

  • 代码修改如下:

      import requests
    
      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)
    
  • 其实,我们还可以直接发送一个字符串数据给服务端,但是告诉服务端这是个文件,你要当作文件进行处理

  • 代码修改如下

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

上传文件时注意事项:

  • 实际开发中我们难免有上传大文件的需求,但是requests本身并不支持这一特性,非常可惜,但是你可以使用requests-toolbelt工具来实现这一功能。
  • 上传的文件建议使用二进制模式进行打开,因为上文文件时最终是以流的形式进行发送,此时requests大部分情况下会根据文件的大小自动设置一个Content-Length头部值,此时如果你以txt模式打开文件就会出现问题了。

4、cookies的管理

  • 网络请求过程中,Cookies是必不可少的,requests对于cookies的操作也做了很好的封装。

  • 1、获取Cookies

  • 代码如下:

      import requests
    
      url = 'http://example.com/some/cookie/setting/url'
      r = requests.get(url)
    
      r.cookies['example_cookie_name']
    
  • 2、发送我们的Cookies

  • Cookies是个字典,我们只需传一个字典类型的数据给cookies参数即可

  • 示例代码如下:

      import requests
      url = 'http://httpbin.org/cookies'
      cookies = dict(cookies_are='working')
      r = requests.get(url, cookies=cookies)
      print( r.text)
    
      - 结果输出如下
    
      {
        "cookies": {
      	"cookies_are": "working"
        }
      }
    
  • 3、RequestsCookieJar,更好的管理我们的cookies

  • RequestsCookieJar实际上就像一个字典一样,但是他提供了更完整的接口,适用于多个域或路径。 Cookie jar 也可以传递到请求中:

  • 示例代码如下:

      import requests
    
      jar = requests.cookies.RequestsCookieJar()
      jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
      jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
      url = 'http://httpbin.org/cookies'
      r = requests.get(url, cookies=jar)
      print(r.text)
    
      url = 'http://httpbin.org/elsewhere'
      r = requests.get(url, cookies=jar)
      print(r.text)
    
  • 如此我们便可以分别控制httpbin.org域下面的每个路径分别使用那个cookies了。

  • 是不是很简单呢?

5、重定向和历史的管理

  • 默认情况下,除了HEAD请求外其他请求遇到从定向都会执行本地的重定向。

  • 为了证明这一结论我们将用history来追踪请求中的重定向。

  • Response.history列表包含了请求完成后而创建的响应对象。列表按从最旧的到最近的响应进行排序。

  • 例如我们看下请求github 时使用http,其会重定向到https

  • 示例代码如下:

      import requests
    
      r = requests.get('http://github.com')
    
      print(r.url)
    
      print(r.status_code)
    
      print(r.history)
    
  • 结果打印如下:

      https://github.com/
      200
      [<Response [301]>]
    
  • 如果我们关闭来重定向功能会如何呢?

  • 示例代码修改如下:

      import requests
    
      r = requests.get('http://github.com',allow_redirects = False)
    
      print(r.url)
    
      print(r.status_code)
    
      print(r.history)
    
  • 结果输出如下:

      http://github.com/
      301
      []
    
  • 可以看到,我们通过设置allow_redirects参数为False关闭重定向功能,在此执行则直接返回301。

6、请求超时的控制

  • 如果你发出一个请求,此时网络很差或者服务器一直没给响应,此时我们肯定不能一直死等下去,我们应该告诉请求,你就等他100年,他不回就不理他来。

  • OK,我们来看下requests是如何控制请求超时的,示例代码如下:

      import requests
      requests.get('http://github.com', timeout=0.001)
    
  • yes,就是这么简单,我们便控制来请求的超时时间

  • OK,本次我们学习来requests的post复杂请求、上传文件、处理cookies、处理超时时间等等。

  • 希望更加深入的学习可以查看requests官网,学习需要厚积薄发。

  • 感谢您的浏览,谢谢。