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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
Python设计模式之单例模式实例
Apr 26 Python
Python中转换角度为弧度的radians()方法
May 18 Python
python实现统计代码行数的方法
May 22 Python
分享Python字符串关键点
Dec 13 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
Python中property属性实例解析
Feb 10 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 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
Yii操作数据库的3种方法
2014/03/11 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
Python Cookie 读取和保存方法
2018/12/28 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
金智子午JAVA面试题
2015/09/04 面试题
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
服装机修工岗位职责
2013/12/26 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
初中成绩单评语
2014/12/29 职场文书
小学教师自我评价
2015/03/04 职场文书
党支部意见范文
2015/06/02 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
学习心理学心得体会
2016/01/22 职场文书
redis中lua脚本使用教程
2021/11/01 Redis
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL