← 返回首页
Python3基础教程(六十七)
发表时间:2022-04-28 23:19:34
requests

Requests是一个基于Python开的Http库,其在Python内置模块的基础上进行了高度的封装,从而我们在使用Http请求的时候变得非常的简单。

Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。

1.requests

import requests
r = requests.get('https://www.baidu.com/') # 百度首页
#获得响应码
print(r.status_code)
#获得响应数据
print(r.text)

运行结果:

200
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

对于带参数的URL,传入一个dict作为params参数:

import requests

# 带参数的get请求
page_params = requests.get(url='https://dict.baidu.com/s', params={'wd': 'python'})
print(page_params.status_code)
print(page_params.text)

运行结果:

200
<!Doctype html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" href="https://m.baidu.com/static/index/icon/w_icon2.png" type="image/x-icon" />
            <meta name="keywords" content="python"/>
        <meta name="description" content="百度汉语_python: "/>
        <title>python_词语_成语_百度汉语</title>
        <script>
  var _hmt = _hmt || [];
  (function() {
    var hm = document.createElement("script");
    hm.src = "//hm.baidu.com/hm.js?010e9ef9290225e88b64ebf20166c8c4";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
  })();
</script>
        <link rel="stylesheet" href="/static/asset/css/main.css" />
    <link rel="stylesheet" type="text/css" href="/static/asset/css/style.css?v=201703281500" />

        <script src="/static/fe-source/dep/ubc/index.js"></script>
</head>

<body class="pc module" id="pc--body" data-name="python">

<div style="display:none">
    <script type="text/javascript">
        window.__start_time = +(new Date());
    </script>
</div>
<div id="search-bar">
    <div class="wrapper">
        <div style="margin-right:300px;position: relative">
    <div class="dict-logo"><a href="/" title="百度汉语"></a></div>
    <div class="search-box module" id="search-box" style="34px;">
        <form name="f" id="form" action="/s" class="fm">
            <span class="bg s_ipt_wr quickdelete-wrap">
                <input id="kw" name="wd" class="s_ipt" placeholder="请输入要查询的词语、成语、诗词" value="python" maxlength="40" autocomplete="off">
                <input name="from" value="zici" type="hidden">
            </span>
            <span class="bg s_btn_wr focus">
                <input type="submit" id="su" value="百度一下" class="bg s_btn">
            </span>
        </form>
        <div class="suggest-div">
            <div class="suggest-content">
            </div>
        </div>
    </div>
</div>

        <div class="wrap-userbar module" id="wrap-userbar">

    <ul class="userbar logout">
    <li class="userbar-item">
        <a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http://hanyu.baidu.com%2Fs%3Fwd%3Dpython" id="login_link">登录</a>
    </li>
    <li class="pipe userbar-item">|</li>
    <li><a href="/download" name="tj_cidian" class="userbar-item download-link">手机版</a></li>
    <li class="pipe userbar-item">|</li>
    <li class="userbar-item">
        <a href="http://www.baidu.com" target="_blank">百度首页</a>
    </li>
    </ul>
</div>
    </div>
</div>
<!-- 外层包裹 -->
<div id="body-wrapper">
    <div id="main" class="module">
        <div class="app-qrcode">
    <img class="app-qrcode-pic" src="/static/fe-source/img/qrcode_load02.png" />
    <div class="app-qrcode-title">下载百度汉语App</div>
    <div>名师好课免费看</div>
    <img class="app-qrcode-split" src="/static/fe-source/img/qrcode_split.png" />
</div>

        <div class="left nav-list module" id="nav-list"></div>
        <div class="content-panel module" id="content-panel">
            <div id="qa-tip" style="display:none"></div>
                                    <input type="hidden" id="resultType" value="empty" />
                    <div class="tab-list module" id="empty-body">





<div id="term-header" class="header-info">
    <div id="pinyin">
        <h2>
            <strong>python</strong>
                    </h2>
    </div>

</div>
<div class="content" id="baike-wrapper">
    <div style="position:relative;">
        <h1><b class="title" id="baike">百科释义</b></h1>
        <span class="baike-feedback" data="p" style="position: absolute;top: 5px;right: 10px;color: #999;cursor: pointer;">报错</span>
    </div>
    <div class="tab-content">
        <p>
            Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。2021年10月,...
                                                                            <a href="http://baike.baidu.com/subview/21087/21087.htm?forcehttps=1?fr=kg_hanyu" target="baike">查看百科</a>
        </p>
    </div>
    <div class="tab-content" style="color: #d0d0d0;text-indent: 0;">注:百科释义来自于百度百科,由网友自行编辑。</div>
</div>


</div>
                        <div id="right-panel" class="right module">
            <div class="recmd-panel module" id="recmd-panel">
                                <div class="list">



                </div>
            </div>
        </div>
    </div>
    <!--content-panel-->
    </div>
    </div>
    <!--body-wapper-->
</div>

<div id="scroll-top"></div>

<p id="copyright">© Baidu
        <a href="http://www.baidu.com/duty/">使用百度前必读</a>
        <a href="http://www.baidu.com">百度首页</a>
        <a href="/zici/search" style="display:none">站内搜索</a>
        <a href="http://help.baidu.com/newadd?prod_id=8&category=1">问题反馈</a>
        <a href="/contact">商务合作</a>
        <a href="http://weibo.com/5789783834/manage">关注微博</a>
    <!-- <a href="http://qm.qq.com/cgi-bin/qm/qr?k=WUsL3Jbek0Km8R4r-m1dK4JZjGw_A8Ba" target="_blank">用户QQ群:484758177</a> -->
</p>

<div id="fmp_flash_div" style="display:none"><audio id="audio"></audio></div>


<script src="/static/asset/dep/zepto/zepto.min.js"></script>
<script src="/static/asset/dep/esl/esl.min.js"></script>
<script src="/static/asset/dep/ubc/index.js"></script>
<script>

require.config(
    {
        baseUrl: '/static/asset/asset',
        urlArgs: 'v=201703281500',
        'packages': [
            {
                'name': 'etpl',
                'location': '../dep/etpl',
                'main': 'main'
            }
        ]
    }
);
require(['main', 'sug_pc', 'ubcUtils'], function(mian, sug_pc, ubcUtils){
    sug_pc.init();
    if ($('#resultType').val()) {
        // 页面pv打点
        ubcUtils.init('pagePv', 13910);
        ubcUtils.event('pagePv', {
            page: $('#resultType').val() + '_detail_pc_pv',
            type: 'view',
            value: 'page'
        });
    }
});

$("#kw")[0].focus();
window.__finish_time = + (new Date());
window.__used_time = __finish_time - window.__start_time;
</script>
</div>
</body>
</html>

要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据:

import requests

# 带参数的post请求
article_data = {
    "uid": 100,
    "title": '测试文章',
    "body": "<h1>hello,world!</h1>"
}
page_post = requests.post(url='http://jsonplaceholder.typicode.com/posts', data=article_data)

print(page_post.status_code)
print(page_post.text)
# 获得响应头部
print(page_post.headers)

运行结果:

201
{
  "uid": "100",
  "title": "测试文章",
  "body": "<h1>hello,world!</h1>",
  "id": 101
}
{'Date': 'Sun, 01 May 2022 01:49:01 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '93', 'Connection': 'keep-alive', 'X-Powered-By': 'Express', 'X-Ratelimit-Limit': '1000', 'X-Ratelimit-Remaining': '999', 'X-Ratelimit-Reset': '1651369764', 'Vary': 'Origin, X-HTTP-Method-Override, Accept-Encoding', 'Access-Control-Allow-Credentials': 'true', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Expires': '-1', 'Access-Control-Expose-Headers': 'Location', 'Location': 'http://jsonplaceholder.typicode.com/posts/101', 'X-Content-Type-Options': 'nosniff', 'Etag': 'W/"5d-488x7zAF9bl6JHZR+GGYrrGQrqM"', 'Via': '1.1 vegur', 'CF-Cache-Status': 'DYNAMIC', 'Report-To': '{"endpoints":[{"url":"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=YsJwtbOxtbuWLE7gkgzuBOcek8LmkoMZMuv52BTy1EKGpIMFaBuFns%2BRSnZIznbyhGeRi8Wapn92mVQjinfV2Pbpu6ndi0wiAkcuDm9KrsRgKP4LOFTF5teh3hKKy0fvUvfmuMViZS7NyshdANMQ"}],"group":"cf-nel","max_age":604800}', 'NEL': '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}', 'Server': 'cloudflare', 'CF-RAY': '7044dbb56a6b7bdf-LAX', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'}

要在请求中传入Cookie,只需准备一个dict传入cookies参数:

import requests

cs = {'token': '6778945345', 'status': 'test'}
resp = requests.get('http://jsonplaceholder.typicode.com/posts', cookies=cs)
print(resp.text)

其它请求方式如下总结:

# GET请求
requests.get('www.google.com')  
# POST请求                                                
requests.post('http://useinfo/list/post')
# PUT请求                                     
requests.put('http://useinfo/list/put') 
# DELETE请求                                         
requests.delete('http://useinfo/list/delete')  
# HEAD请求                                  
requests.head('http://useinfo/list/head') 
# OPTIONS请求                                       
requests.options('http://http://useinfo/list/option')