美文网首页测试开发Python接口测试
Python HTTP 库:requests 入门

Python HTTP 库:requests 入门

作者: 七月尾巴_葵花 | 来源:发表于2017-10-29 10:10 被阅读167次

    初识 requests
    在网络编程中,最最基本的任务包含:

    发送请求
    登录
    获取数据
    解析数据
    反序列化打印内容
    我们以 GitHub 为例,先看一下使用 urllib2 要怎么做。为了把事情弄简单点,我们假设实现已经知道,GET 请求 https://api.kuihua.com/ 返回的内容是个 JSON 格式的数据(实际上通过 content-type 也能判断)。

    import urllib2
    import json
    
    gh_url  = 'https://api.github.com'
    cs_user = 'user'
    cs_psw  = 'password'
    
    req = urllib2.Request(gh_url)
    
    password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
    password_manager.add_password(None, gh_url, cs_user, cs_psw)
    
    auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
    opener = urllib2.build_opener(auth_manager)
    
    urllib2.install_opener(opener)
    
    handler = urllib2.urlopen(req)
    
    if handler.getcode() == requests.codes.ok:
        text = handler.read()
        d_text = json.loads(text)
        for k, v in d_text.items():
            print k, v
    

    如果运行正确,那么代码应该返回:

    issues_url https://api.github.com/issues
    current_user_repositories_url https://api.github.com/user/repos{?type,page,per_page,sort}
    rate_limit_url https://api.github.com/rate_limit
    repository_url https://api.github.com/repos/{owner}/{repo}
    ...
    user_repositories_url https://api.github.com/users/{user}/repos{?type,page,per_page,sort}
    team_url https://api.github.com/teams
    

    同样的效果,用 requests 库则有如下代码:

    import requests
    
    cs_url  = 'https://api.github.com'
    cs_user = 'user'
    cs_psw  = 'password'
    
    r = requests.get(cs_url, auth=(cs_user, cs_psw))
    
    if r.status_code == requests.codes.ok
        for k, v in r.json().items():
            print k, v
    

    溢美之词就不用说了,读到这里的你心里肯定只有一声「卧槽,这才是 Python 该有的样子」。那么,接下来我们看看 requests 都有哪些黑魔法。
    安装
    最推荐的方式,是直接安装推荐过的 Anaconda
    如果你不想安装 Anaconda,那么建议你使用 pip
    安装;只需在命令行下执行:

    pip install requests
    

    基本用法
    requests 的基本用法,呃,真是不能再基本了。最基本的操作,就是以某种 HTTP 方法向远端服务器发送一个请求而已;而 requests 库就是这么做的

    import requests
    
    cs_url = 'http://httpbin.org'
    
    r = requests.get("%s/%s" % (cs_url, 'get'))
    r = requests.post("%s/%s" % (cs_url, 'post'))
    r = requests.put("%s/%s" % (cs_url, 'put'))
    r = requests.delete("%s/%s" % (cs_url, 'delete'))
    r = requests.patch("%s/%s" % (cs_url, 'patch'))
    r = requests.options("%s/%s" % (cs_url, 'get'))
    

    从语法上看,requests 库设计的非常自然。所谓 requests.get,就是以 GET 方式发送一个 REQUEST,得到一个 Response 类的结果,保存为 r。

    你可以在 r 中取得所有你想得到的和 HTTP 有关的信息。下面,我们以 GET 方法为例,依次介绍。

    URL 传参 / 获取请求的 URL

    如果你经常上网(废话,看到这里的都上过网吧……),一定见过类似下面的链接:
    https://www.kuihua.com/search?q=hello
    即:
    <协议>://<域名>/<接口>?<键1>=<值1>&<键2>=<值2>

    requests
    库提供的 HTTP 方法,都提供了名为 params
    的参数。这个参数可以接受一个 Python 字典,并自动格式化为上述格式。

    import requests
    cs_url = 'http://www.kuihua.com/s'
    param  = {'ie':'utf-8', 'q':'query'}
    
    r = requests.get (cs_url, params = param)
    print r.url
    

    运行将得到:

    http://www.kuihua.com/s?q=query&ie=utf-8
    HTTP 状态码 / 重定向跳转

    requests 库定义的 Response 类可以方便地获取请求的 HTTP 状态码和重定向状态。

    import requests
    
    cs_url = 'http://www.so.com/s'
    param  = {'ie':'utf-8', 'q':'query'}
    r = requests.get (cs_url, params = param)
    print r.url, r.status_code
    
    cs_url = 'http://www.kuihua.com/s'
    r = requests.get (cs_url, params = param)
    print r.url, r.status_code, r.history
    

    结果是:

    http://www.kuihua.com/s?q=query&ie=utf-8 200
    http://www.kuihua.com/s?q=query&ie=utf-8 200 [<Response [302]>]
    

    我们发现,requests 默认自动地处理了 302 跳转。在经过跳转的请求中,返回的 URL 和状态码都是跳转之后的信息;唯独在 history 中,用 Python 列表记录了跳转情况。

    大多数情况下,自动处理是挺好的。不过,有时候我们也想单步追踪页面跳转情况。此时,可以给请求加上 allow_redirects = False 参数。

    相关文章

      网友评论

        本文标题:Python HTTP 库:requests 入门

        本文链接:https://www.haomeiwen.com/subject/yewosxtx.html