侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python开发的HTTP库requests详解

Python  /  管理员 发布于 7年前   128

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/')  passdef 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'))  passdef 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'}  # )  passdef 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)  passdef 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)  passdef 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)  passdef 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实现按学生年龄排序的实际问题详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客