Python开发的HTTP库requests详解


Posted in Python onAugust 29, 2017

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

1. GET请求

# 1、无参数实例
  
 import requests
  
 ret = requests.get('https://github.com/timeline.json')
  
 print(ret.url)
 print(ret.text)

 # 2、有参数实例
  
 import requests
  
 payload = {'key1': 'value1', 'key2': 'value2'}
 ret = requests.get("http://httpbin.org/get", params=payload)
  
 print(ret.url)
 print(ret.text)

2. POST请求

# 1、基本POST实例
  
 import requests
  
 payload = {'key1': 'value1', 'key2': 'value2'}
 ret = requests.post("http://httpbin.org/post", data=payload)
  
 print(ret.text)
  
  
 # 2、发送请求头和数据实例
  
 import requests
 import json
  
 url = 'https://api.github.com/some/endpoint'
 payload = {'some': 'data'}
 headers = {'content-type': 'application/json'}
  
 ret = requests.post(url, data=json.dumps(payload), headers=headers)
  
 print(ret.text)
 print(ret.cookies)

3. 其它请求

requests.get(url, params=None, **kwargs)
 requests.post(url, data=None, json=None, **kwargs)
 requests.put(url, data=None, **kwargs)
 requests.head(url, **kwargs)
 requests.delete(url, **kwargs)
 requests.patch(url, data=None, **kwargs)
 requests.options(url, **kwargs)
  
 # 以上方法均是在此方法的基础上构建
 requests.request(method, url, **kwargs)

4. 请求参数

def request(method, url, **kwargs):
  """Constructs and sends a :class:`Request <Request>`.

  :param method: method for the new :class:`Request` object.
  :param url: URL for the new :class:`Request` object.
  :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
  :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
  :param json: (optional) json data to send in the body of the :class:`Request`.
  :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
  :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
  :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
    ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
    or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
    defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
    to add for the file.
  :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
  :param timeout: (optional) How long to wait for the server to send data
    before giving up, as a float, or a :ref:`(connect timeout, read
    timeout) <timeouts>` tuple.
  :type timeout: float or tuple
  :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
  :type allow_redirects: bool
  :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
  :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``.
  :param stream: (optional) if ``False``, the response content will be immediately downloaded.
  :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
  :return: :class:`Response <Response>` object
  :rtype: requests.Response

  Usage::

   >>> import requests
   >>> req = requests.request('GET', 'http://httpbin.org/get')
   <Response [200]>
  """

5. 参数示例

def param_method_url():
  # requests.request(method='get', url='http://127.0.0.1:8000/test/')
  # requests.request(method='post', url='http://127.0.0.1:8000/test/')
  pass


def param_param():
  # - 可以是字典
  # - 可以是字符串
  # - 可以是字节(ascii编码以内)

  # requests.request(method='get',
  # url='http://127.0.0.1:8000/test/',
  # params={'k1': 'v1', 'k2': '水电费'})

  # requests.request(method='get',
  # url='http://127.0.0.1:8000/test/',
  # params="k1=v1&k2=水电费&k3=v3&k3=vv3")

  # requests.request(method='get',
  # url='http://127.0.0.1:8000/test/',
  # params=bytes("k1=v1&k2=k2&k3=v3&k3=vv3", encoding='utf8'))

  # 错误
  # requests.request(method='get',
  # url='http://127.0.0.1:8000/test/',
  # params=bytes("k1=v1&k2=水电费&k3=v3&k3=vv3", encoding='utf8'))
  pass


def param_data():
  # 可以是字典
  # 可以是字符串
  # 可以是字节
  # 可以是文件对象

  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # data={'k1': 'v1', 'k2': '水电费'})

  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # data="k1=v1; k2=v2; k3=v3; k3=v4"
  # )

  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # data="k1=v1;k2=v2;k3=v3;k3=v4",
  # headers={'Content-Type': 'application/x-www-form-urlencoded'}
  # )

  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # data=open('data_file.py', mode='r', encoding='utf-8'), # 文件内容是:k1=v1;k2=v2;k3=v3;k3=v4
  # headers={'Content-Type': 'application/x-www-form-urlencoded'}
  # )
  pass


def param_json():
  # 将json中对应的数据进行序列化成一个字符串,json.dumps(...)
  # 然后发送到服务器端的body中,并且Content-Type是 {'Content-Type': 'application/json'}
  requests.request(method='POST',
           url='http://127.0.0.1:8000/test/',
           json={'k1': 'v1', 'k2': '水电费'})


def param_headers():
  # 发送请求头到服务器端
  requests.request(method='POST',
           url='http://127.0.0.1:8000/test/',
           json={'k1': 'v1', 'k2': '水电费'},
           headers={'Content-Type': 'application/x-www-form-urlencoded'}
           )


def param_cookies():
  # 发送Cookie到服务器端
  requests.request(method='POST',
           url='http://127.0.0.1:8000/test/',
           data={'k1': 'v1', 'k2': 'v2'},
           cookies={'cook1': 'value1'},
           )
  # 也可以使用CookieJar(字典形式就是在此基础上封装)
  from http.cookiejar import CookieJar
  from http.cookiejar import Cookie

  obj = CookieJar()
  obj.set_cookie(Cookie(version=0, name='c1', value='v1', port=None, domain='', path='/', secure=False, expires=None,
             discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False,
             port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False)
          )
  requests.request(method='POST',
           url='http://127.0.0.1:8000/test/',
           data={'k1': 'v1', 'k2': 'v2'},
           cookies=obj)


def param_files():
  # 发送文件
  # file_dict = {
  # 'f1': open('readme', 'rb')
  # }
  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # files=file_dict)

  # 发送文件,定制文件名
  # file_dict = {
  # 'f1': ('test.txt', open('readme', 'rb'))
  # }
  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # files=file_dict)

  # 发送文件,定制文件名
  # file_dict = {
  # 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf")
  # }
  # requests.request(method='POST',
  # url='http://127.0.0.1:8000/test/',
  # files=file_dict)

  # 发送文件,定制文件名
  # file_dict = {
  #   'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf", 'application/text', {'k1': '0'})
  # }
  # requests.request(method='POST',
  #         url='http://127.0.0.1:8000/test/',
  #         files=file_dict)

  pass


def param_auth():
  from requests.auth import HTTPBasicAuth, HTTPDigestAuth

  ret = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('wupeiqi', 'sdfasdfasdf'))
  print(ret.text)

  # ret = requests.get('http://192.168.1.1',
  # auth=HTTPBasicAuth('admin', 'admin'))
  # ret.encoding = 'gbk'
  # print(ret.text)

  # ret = requests.get('http://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass'))
  # print(ret)
  #


def param_timeout():
  # ret = requests.get('http://google.com/', timeout=1)
  # print(ret)

  # ret = requests.get('http://google.com/', timeout=(5, 1))
  # print(ret)
  pass


def param_allow_redirects():
  ret = requests.get('http://127.0.0.1:8000/test/', allow_redirects=False)
  print(ret.text)


def param_proxies():
  # proxies = {
  # "http": "61.172.249.96:80",
  # "https": "http://61.185.219.126:3128",
  # }

  # proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}

  # ret = requests.get("http://www.proxy360.cn/Proxy", proxies=proxies)
  # print(ret.headers)


  # from requests.auth import HTTPProxyAuth
  #
  # proxyDict = {
  # 'http': '77.75.105.165',
  # 'https': '77.75.105.165'
  # }
  # auth = HTTPProxyAuth('username', 'mypassword')
  #
  # r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth)
  # print(r.text)

  pass


def param_stream():
  ret = requests.get('http://127.0.0.1:8000/test/', stream=True)
  print(ret.content)
  ret.close()

  # from contextlib import closing
  # with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
  # # 在此处理响应。
  # for i in r.iter_content():
  # print(i)


def requests_session():
  import requests

  session = requests.Session()

  ### 1、首先登陆任何页面,获取cookie

  i1 = session.get(url="http://dig.chouti.com/help/service")

  ### 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权
  i2 = session.post(
    url="http://dig.chouti.com/login",
    data={
      'phone': "8615131255089",
      'password': "xxxxxx",
      'oneMonth': ""
    }
  )

  i3 = session.post(
    url="http://dig.chouti.com/link/vote?linksId=8589623",
  )
  print(i3.text)

6. requests模拟登陆GitHub

import requests
 from bs4 import BeautifulSoup
 
 
 def login_github():
   """
   通过requests模块模拟浏览器登陆GitHub
   :return: 
   """
   # 获取csrf_token
   r1 = requests.get('https://github.com/login')  # 获得get请求的对象
   s1 = BeautifulSoup(r1.text, 'html.parser')   # 使用bs4解析HTML对象
   token = s1.find('input', attrs={'name': 'authenticity_token'}).get('value')   # 获取登陆授权码,即csrf_token
   get_cookies = r1.cookies.get_dict()   # 获取get请求的cookies,post请求时必须携带
   
   # 发送post登陆请求
   '''
   post登陆参数
   commit  Sign+in
   utf8  ✓
   authenticity_token  E961jQMIyC9NPwL54YPj70gv2hbXWJ…fTUd+e4lT5RAizKbfzQo4eRHsfg==
   login  JackUpDown(用户名)
   password  **********(密码)
   '''
   r2 = requests.post(
     'https://github.com/session',
     data={
       'commit': 'Sign+in',
       'utf8': '✓',
       'authenticity_token': token,
       'login': 'JackUpDown',
       'password': '**********'
     },
     cookies=get_cookies   # 携带get请求的cookies
            )
   login_cookies = r2.cookies.get_dict()  # 获得登陆成功的cookies,携带此cookies就可以访问任意GitHub页面
 
   # 携带post cookies跳转任意页面
   r3 = requests.get('https://github.com/settings/emails', cookies=login_cookies)
   print(r3.text)
Python 相关文章推荐
Python的自动化部署模块Fabric的安装及使用指南
Jan 19 Python
Python应用库大全总结
May 30 Python
有关Python的22个编程技巧
Aug 29 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
使用Python进行中文繁简转换的实现代码
Oct 18 Python
python实现根据文件格式分类
Oct 31 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 #Python
详解Python进程间通信之命名管道
Aug 28 #Python
基于Python闭包及其作用域详解
Aug 28 #Python
利用Python查看目录中的文件示例详解
Aug 28 #Python
Python如何通过subprocess调用adb命令详解
Aug 27 #Python
Python中序列的修改、散列与切片详解
Aug 27 #Python
Python正确重载运算符的方法示例详解
Aug 27 #Python
You might like
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
javascript处理table表格的代码
2010/12/06 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
深入理解Python3 内置函数大全
2017/11/23 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
flask 实现token机制的示例代码
2019/11/07 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Linux Interview Questions For software testers
2013/05/17 面试题
小学母亲节活动方案
2014/03/14 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
论文答谢词
2015/01/20 职场文书
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL
小程序实现侧滑删除功能
2022/06/25 Javascript
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python