• 美娱彩票官网

  • 美娱彩票官网

  • 美娱彩票官网

  • 美娱彩票官网

美娱彩票官网

作者︰  發布日期︰2020-02-24 23:41:54
Tag標簽︰request庫,python  
  • 2015年我觸(chu)及 Python 的(de)那時候(hou),就(jiu)得聞(wen) Python 的(de)網(wang)絡編(bian)程能力非常強悍。因而,在了解 Python 的(de)基礎(chu)語(yu)法以後(hou),我就(jiu)和幾個小(xiao)伙伴們一塊(kuai)兒協作,試著用 Python 的(de) urllib 和 urllib2 庫構(gou)建了一個百度貼(tie)吧(ba) Python 客戶端。
    然huan) τ玫de)過程中(zhong),我發現(xian)了兩個標準庫的(de)語(yu)法並不自然,以至于可以說非常反(fan)人(ren)類(lei)——用著很不舒服。又有(you),我平日應用 Python 甚少涉及ba)wang)絡編(bian)程的(de)內(na)容。因而,Python 的(de)網(wang)絡編(bian)程就(jiu)被我放下了,直至我了解了 requests 庫。

    初次了解 requests
    requests 庫的(de)宣言是(shi)
     
    HTTP for Humans (給(gei)人(ren)用的(de) HTTP 庫)
     
    我們最(zui)先來檢驗一下。
     
    在網(wang)絡編(bian)程中(zhong),最(zui)為基礎(chu)的(de)任務包(bao)括(kuo)︰
     
        發送請(qing)求(qiu)
        登(deng)入
        獲(huo)取數據(ju)
        解析數據(ju)
        反(fan)序列化重新(xin)打(da)印獲(huo)得的(de)內(na)容
     
    我們以 GitHub 為例(li),先看一下應用 urllib2 要怎(zen)樣做。因為要把事兒弄簡單,我們假設實現(xian)已(yi)經知道,GET 請(qing)求(qiu) https://api.github.com/ 返回的(de)內(na)容是(shi)個 JSON 格式的(de)數據(ju)(事實上通(tong)過 content-type 也(ye)可以判定)。
     
    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
     
    如果運行(xing)正確,那麼chuang)胗Ω梅禱兀br /> 
    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
     
    一樣的(de)作用,用 requests 庫則有(you)如下代碼︰
     
    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
     
    溢美(mei)之詞(ci)shi)筒槐人(ren)盜耍 du)完(wan)在這里的(de)你內(na)心一huan) hui)只有(you)一聲「握(wo)草,這才算 Python 該有(you)的(de)模樣」。那麼,接下去讓我們看一下 requests 還有(you)哪幾種黑魔(mo)法。
     
    安裝
     
    最(zui)受歡(huan)迎的(de)方式,是(shi)直ben)影滄巴(ba)萍齬de) Anaconda。
     
    當然如果你不願安裝 Anaconda,那我建議你采用 pip 安裝;hui)恍柙諉鐶xing)下執行(xing)︰
     
    pip install requests

    基本用法
     
    requests 的(de)主要使用方法,呃,簡直不能再主要了。最(zui)主要的(de)操作方法,就(jiu)是(shi)說以某種 HTTP 方式向遠端服務器發送1個請(qing)求(qiu)不過如此(ci);huan)requests 庫就(jiu)是(shi)這樣做的(de)︰
     
    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'))
     
    從語(yu)法上看,requests 庫設計構(gou)思的(de)十分自然。說白了 requests.get,就(jiu)是(shi)說以 GET 方式發送1個 REQUEST,得到1個 Response 類(lei)的(de)結果,儲存為 r。
     
    你能在 r 中(zhong)獲(huo)得全部你想要的(de)和 HTTP 有(you)關的(de)信(xin)息(xi)。下面,讓我們以 GET 方式為例(li),先後(hou)詳(xiang)細(xi)介紹。
     
    URL 傳參(can) / 獲(huo)得請(qing)求(qiu)的(de) URL
     
    如果要是(shi)你常常上網(wang)(屁(pi)話,看到這兒的(de)都(du)上過網(wang)吧(ba)……),一huan) hui)見過相似下邊的(de)鏈接︰
     
    https://encrypted.google.com/search?q=hello
     
    即︰
     
    <協議>://<網(wang)站域名>/<接口>?<鍵1>=<值1>&<鍵2>=<值2>
     
    requests 庫給(gei)出的(de) HTTP 方式方法,都(du)提供了名為 params 的(de)基本參(can)數。這一基本參(can)數能夠接收1個 Python 字典,並自動(dong)格式化為上述文件格式。
     
    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
     
    執行(xing)將獲(huo)得︰
     
    http://www.so.com/s?q=query&ie=utf-8
     
    HTTP 情況碼 / 重定向跳轉
     
    requests 庫定義的(de) Response 類(lei)能夠便捷地獲(huo)得請(qing)求(qiu)的(de) HTTP 狀態(tai)碼和重定向情況。
     
    360 公司(si)的(de)搜索引擎,以前的(de)名字叫xiao)負hao)搜」,如今改(gai)為「360 搜索」;網(wang)站域名也(ye)從 www.haosou.com 改(gai)為了 www.so.com。要是(shi)你在瀏覽器的(de)地址(zhi)欄中(zhong)輸(shu)入 www.haosou.com,那樣會(hui)通(tong)過 302 跳轉到 www.so.com。讓我們借此(ci)機會(hui)來演試。

    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.haosou.com/s'
    r = requests.get (cs_url, params = param)
    print r.url, r.status_code, r.history
     
    結果是(shi)︰
    http://www.so.com/s?q=query&ie=utf-8 200
    http://www.so.com/s?q=query&ie=utf-8 200 [302]>]
     
    我們發現(xian),requests 默認自動(dong)地處(chu)理了 302 跳轉。在經過跳轉的(de)請(qing)求(qiu)中(zhong),返回的(de) URL 和狀態(tai)碼都(du)是(shi)跳轉之後(hou)的(de)信(xin)息(xi);唯獨在 history 中(zhong),用 Python 列表記(ji)錄了跳轉情況。
    大多(duo)數情況下,自動(dong)處(chu)理是(shi)挺好(hao)的(de)。不過,有(you)時候(hou)我們也(ye)想單步追(zhui)蹤頁面跳轉情況。此(ci)時,可以給(gei)請(qing)求(qiu)加上 allow_redirects = False 參(can)數。
     
    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.haosou.com/s'
    r = requests.get (cs_url, params = param, allow_redirects = False)
    print r.url, r.status_code, r.history
     
    輸(shu)出結果︰
     
    http://www.so.com/s?q=query&ie=utf-8 200
    http://www.haosou.com/s?q=query&ie=utf-8 302 []
     
    不容許 requests 自動(dong)處(chu)置重定向跳轉後(hou),反(fan)回的(de) URL 和狀態(tai)碼都(du)合乎預估(gu)了。
     
    請(qing)求(qiu)超時設定
     
    requests 的(de)請(qing)求(qiu)超時設定以秒為基本單位。比如,對請(qing)求(qiu)加主要參(can)數 timeout = 5 就(jiu)可設定請(qing)求(qiu)超時為 5 秒。
     
    # a very short timeout is set intentionally
     
    import requests
     
    cs_url = 'http://www.zhihu.com'
    r = requests.get (cs_url, timeout = 0.000001)
     
    反(fan)回錯(cuo)誤碼︰
     
    Traceback (most recent call last):
      File "D:\test\py\test.py", line 6, in <module>
        r = requests.get (cs_url, timeout = 0.000001)
      File "C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\requests\api.py", line 69, in get
        return request('get', url, params=params, **kwargs)
      File "C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\requests\api.py", line 50, in request
        response = session.request(method=method, url=url, **kwargs)
      File "C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\requests\sessions.py", line 465, in request
        resp = self.send(prep, **send_kwargs)
      File "C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\requests\sessions.py", line 573, in send
        r = adapter.send(request, **kwargs)
      File "C:\Users\username\AppData\Local\Continuum\Anaconda\lib\site-packages\requests\adapters.py", line 419, in send
        raise ConnectTimeout(e, request=request)
    requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='www.zhihu.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(object at 0x0000000002AFABE0>, 'Connection to www.zhihu.com timed out. (connect timeout=1e-06)'))
     
    請(qing)求(qiu)頭(tou)
     
    我們使用 httpbin 這一個網(wang)站,先了解一下 requests 發出的(de) HTTP 報文默認的(de)請(qing)求(qiu)頭(tou)是(shi)啥(sha)樣子(zi)的(de)。
     
    import requests
     
    cs_url = 'http://httpbin.org/get'
    r = requests.get (cs_url)
    print r.content
     
    反(fan)回結果︰
    {
      "args": {},
      "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Host": "httpbin.org",
        "User-Agent": "python-requests/2.7.0 CPython/2.7.10 Windows/7"
      },
      "origin": "xx.xx.xx.xx",
      "url": "http://httpbin.org/get"
    }
    需注(zhu)意,在這里采用 r.content 來查詢請(qing)求(qiu)頭(tou)部是(shi)由于 httpbin 這一個網(wang)站的(de)特別性(xing)——它什麼活都(du)不干,就(jiu)把xun)苑角qing)求(qiu)的(de)具(ju)體內(na)容反(fan)回給(gei)請(qing)求(qiu)者。在 requests 之中(zhong),應該采用 r.request.headers 來查詢請(qing)求(qiu)的(de)頭(tou)部。
    一般而言讓我們較為關心其中(zhong)的(de) User-Agent 和 Accept-Encoding。要是(shi)讓我們要改(gai)動(dong) HTTP 頭(tou)中(zhong)的(de)這兩項具(ju)體內(na)容,只需用將1個適合的(de)字典基本參(can)數傳到 headers 即可。
     
    import requests
     
    my_headers = {'User-Agent' : 'From Liam Huang', 'Accept-Encoding' : 'gzip'}
    cs_url = 'http://httpbin.org/get'
    r = requests.get (cs_url, headers = my_headers)
    print r.content
     
    反(fan)回︰
    {
      "args": {},
      "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "Host": "httpbin.org",
        "User-Agent": "From Liam Huang"
      },
      "origin": "xx.xx.xx.xx",
      "url": "http://httpbin.org/get"
    }
     
    可以看到,UA 和 AE 都(du)已(yi)經被改(gai)動(dong)了。
     
    響(xiang)應頭(tou)
     
    作為 HTTP 請(qing)求(qiu)的(de)響(xiang)應,返回的(de)內(na)容中(zhong)也(ye)有(you) HTTP 頭(tou)。它是(shi)一個反(fan)序列化為 Python 字典的(de)數據(ju)結構(gou),可以通(tong)過 Response.headers 來查看chu)/div>
     
    import requests
     
    cs_url = 'http://httpbin.org/get'
    r = requests.get (cs_url)
    print r.headers
    返回︰
     
    {
        "content-length": "263",
        "server": "nginx",
        "connection": "keep-alive",
        "access-control-allow-credentials": "true",
        "date": "Fri, 26 Feb 2016 10:26:17 GMT",
        "access-control-allow-origin": "*",
        "content-type": "application/json"
    }
     
    響(xiang)應內(na)容
     
    字節模式 / 自動(dong)解包(bao)
     
    長期以來,互聯網(wang)都(du)存在帶寬有(you)限的(de)情況。因此(ci),網(wang)絡上傳輸(shu)的(de)數據(ju),很多(duo)情況下都(du)是(shi)經過壓縮的(de)。經由 requests 發送的(de)請(qing)求(qiu),當收到的(de)響(xiang)應內(na)容經過 gzip 或(huo) deflate 壓縮時,requests 會(hui)自動(dong)為我們解包(bao)。我們可以用 Response.content 來獲(huo)得以字節形式返回的(de)相應內(na)容。
     
    import requests
     
    cs_url = 'http://www.zhihu.com'
    r = requests.get (cs_url)
     
    if r.status_code == requests.codes.ok:
        print r.content
     
    這相當于 urllib2.urlopen(url).read()。
     
    如果相應內(na)容不是(shi)文本,而是(shi)二進(jin)制數據(ju)(比如圖片),那麼上述打(da)印結果可能會(hui)糊你一臉(lian)。這里以圖片為例(li),示(shi)例(li)一下該怎(zen)麼chuang)ban)。
     
    import requests
    from PIL import Image
    from StringIO import StringIO
     
    cs_url = 'http://liam0205.me/uploads/avatar/avatar-2.jpg'
    r = requests.get (cs_url)
     
    if r.status_code == requests.codes.ok:
        Image.open(StringIO(r.content)).show()
     
    運行(xing)無誤的(de)話,能看到我和我愛人(ren)的(de)照片。
     
    文本模式 / 編(bian)碼
     
    如果響(xiang)應返回是(shi)文本,那麼你可以用 Response.text 獲(huo)得 Unicode 編(bian)碼的(de)響(xiang)應返回內(na)容。
     
    import requests
     
    cs_url = 'http://www.zhihu.com'
    r = requests.get (cs_url)
     
    if r.status_code == requests.codes.ok:
        print r.text
     
    要獲(huo)得 Unicode 編(bian)碼的(de)結果,意味(wei)著 requests 會(hui)為我們做解碼工作。那麼 requests 是(shi)按(an)照何(he)種編(bian)碼去對返回結果解碼的(de)呢?
     
    requests 會(hui)讀(du)取 HTTP header 中(zhong)關于字zhi) de)內(na)容。如果獲(huo)取成功,則會(hui)依此(ci)進(jin)行(xing)解碼;若不然,則會(hui)根據(ju)響(xiang)應內(na)容對編(bian)碼進(jin)行(xing)猜(cai)測。具(ju)體來ci)擔 頤強梢雜Response.encoding 來查看/修改(gai)使用的(de)編(bian)碼。
     
    import requests
     
    cs_url = 'http://www.zhihu.com'
    r = requests.get (cs_url)
     
    if r.status_code == requests.codes.ok:
        print r.encoding
     
    反(fan)序列化 JSON 數據(ju)
     
    開篇給(gei)出的(de)第一個 requests 示(shi)例(li)中(zhong),特別吸引人(ren)的(de)一點就(jiu)是(shi) requests 無需任何(he)其他庫,就(jiu)能解析序列化為 JSON 格式的(de)數據(ju)。
     
    我們以 IP 查詢 Google 公共 DNS 為例(li)︰
     
    import requests
     
    cs_url   = 'http://ip.taobao.com/service/getIpInfo.php'
    my_param = {'ip':'8.8.8.8'}
     
    r = requests.get(cs_url, params = my_param)
     
    print r.json()['data']['country'].encode('utf-8')
     
    結果將輸(shu)出︰
     
    美(mei)國
     
    模擬登(deng)錄 GitHub 看看
     
    Cookie 介紹
     
    HTTP 協議是(shi)無狀態(tai)的(de)。因此(ci),若不借助其他手段(duan),遠程的(de)服務器就(jiu)無法知道以前和客戶端做了哪些通(tong)信(xin)。Cookie 就(jiu)是(shi)「其他手段(duan)」之一。
     
    Cookie 一個典型的(de)應用場景,就(jiu)是(shi)用于記(ji)錄用戶在網(wang)站上的(de)登(deng)錄狀態(tai)。
     
        用戶登(deng)錄成功後(hou),服務器下發一個(通(tong)常是(shi)加密(mi)了的(de))Cookie 文件。
        客戶端(通(tong)常是(shi)網(wang)頁瀏覽器)將收到的(de) Cookie 文件保存起來chu)/div>
        下次客戶端與服務器連接時,將 Cookie 文件發送給(gei)服務器,由服務器校驗其含義,恢(hui)復(fu)登(deng)錄狀態(tai)(從而避免再次登(deng)錄)。

    Cookie 在 requests 中(zhong)
     
    Cookie? 你說的(de)是(shi)小(xiao)甜點吧(ba)!
     
    別忘了,requests 是(shi)給(gei)人(ren)類(lei)設計pin)de) Python 庫。想想使用瀏覽器瀏覽網(wang)頁的(de)時候(hou),我們沒有(you)手工去保存、重新(xin)發送 Cookie 對嗎(ma)?瀏覽器都(du)為我們自動(dong)完(wan)成了。
     
    在 requests 中(zhong),也(ye)是(shi)這樣。
     
    當瀏覽器作為客戶端與遠端服務器連接時,遠端服務器會(hui)根據(ju)需要,產生(sheng)一個 SessionID,並附在 Cookie 中(zhong)發給(gei)瀏覽器。接下來的(de)時間里,只要 Cookie 不過期,瀏覽器與遠端服務器的(de)連接,都(du)會(hui)使用這個 SessionID;huan) 榔骰hui)自動(dong)與服務器協作,維護相應的(de) Cookie。
     
    在 requests 中(zhong),也(ye)是(shi)這樣。我們可以創(chuang)建一個 requests.Session,爾(er)後(hou)在該 Session 中(zhong)與遠端服務器通(tong)信(xin),其中(zhong)產生(sheng)的(de) Cookie,requests 會(hui)自動(dong)為我們維護好(hao)。
     
    POST 表單
     
    POST 方法可以將一組用戶數據(ju),以表單的(de)形式發送到遠端服務器。遠端服務器接受後(hou),依照表單內(na)容做相應的(de)動(dong)作。
     
    調用 requests 的(de) POST 方法時,可以用 data 參(can)數接收zhao)桓Python 字典結構(gou)。requests 會(hui)自動(dong)將 Python 字典序列化為實際的(de)表單內(na)容。例(li)如︰
     
    import requests
     
    cs_url    = 'http://httpbin.org/post'
    my_data   = {
        'key1' : 'value1',
        'key2' : 'value2'
    }
     
    r = requests.post (cs_url, data = my_data)
    print r.content
    返回︰
     
    {
      ...
      "form": {
        "key1": "value1",
        "key2": "value2"
      },
      ...
    }
    實際模擬登(deng)錄 GitHub 試試看
     
    模擬登(deng)錄的(de)第一步,首先是(shi)要搞清楚我們用瀏覽器登(deng)錄時都(du)發生(sheng)了什麼chu)/div>
     
    GitHub 登(deng)錄jia)趁媸shi) https://github.com/login。我們首先清空(kong)瀏覽器 Cookie 記(ji)錄,然後(hou)用 Chrome 打(da)開登(deng)錄jia)趁妗/div>
     
    填入 Username 和 Password 之後(hou),我們打(da)開 Tamper Chrome 和 Chrome 的(de)元素審查工具(ju)(找(zhao)到 Network 標簽頁),之後(hou)點登(deng)錄按(an)鈕。
     
    在 Tamper Chrome 中(zhong),我們發現(xian)︰雖(sui)然登(deng)錄jia)趁媸shi) https://github.com/login,但實際接收表單的(de)是(shi) https://github.com/session。若登(deng)錄成功,則跳轉到 https://github.com/ 首頁,返回狀態(tai)碼 200。


     
    而在 Chrome 的(de)審查元素窗(chuang)口中(zhong),我們可以看到提交給(gei) session 接口的(de)表單信(xin)息(xi)。內(na)里包(bao)含
     
        commit
        utf8
        authenticity_token
        login
        password



     
    其中(zhong),commit 和 utf8 兩項是(shi)定值;login 和 password 分別是(shi)用戶名和密(mi)碼,這很好(hao)mei)斫狻N authenticity_token 是(shi)一長串無規(gui)律的(de)字zhi) 頤遣磺宄shi)什麼chu)/div>
     
    POST 動(dong)作發生(sheng)在與 session 接口交互之前,因此(ci)可能的(de)信(xin)息(xi)來源只有(you) login 接口。我們打(da)開 login 頁面的(de)源碼,試著搜索 authenticity_token 就(jiu)不難發現(xian)有(you)如下內(na)容︰
     
    <input name="authenticity_token" type="hidden" value="......" />
     
    原來,所謂的(de) authenticity_token 是(shi)明白卸載 HTML 頁面里的(de),只不過用 hidden 模式隱(yin)藏起來了。為此(ci),我們只需要使用 Python 的(de)正則庫解析一下,就(jiu)好(hao)了。
     
    這樣一來,事情就(jiu)變得簡單起來,編(bian)碼吧(ba)!
     
    模擬登(deng)錄 GitHub
     
    import requests
    import re
     
    cs_url  = 'https://github.com/login'
    cs_user = 'user'
    cs_psw  = 'psw'
    my_headers = {
        'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
        'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding' : 'gzip',
        'Accept-Language' : 'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4'
    }
    sss     = requests.Session()
    r       = sss.get(cs_url, headers = my_headers)
    reg     = r'<input name="authenticity_token" type="hidden" value="(.*)" />'
    pattern = re.compile(reg)
    result  = pattern.findall(r.content)
    token   = result[0]
    my_data = {
        'commit' : 'Sign in',
        'utf8' : '%E2%9C%93',
        'authenticity_token' : token,
        'login' : cs_user,
        'password' : cs_psw
    }
    cs_url  = 'https://github.com/session'
    r       = sss.post(cs_url, headers = my_headers, data = my_data)
    print r.url, r.status_code, r.history
    輸(shu)出︰
     
    https://github.com/ 200 [<Response [302]>]
    代碼很好(hao)mei)斫猓 涫抵皇shi)完(wan)全地模擬了sui) 榔韉de)行(xing)為。
     
    首先,我們準備好(hao)了和 Chrome 一hui)碌de) HTTP 請(qing)求(qiu)頭(tou)部信(xin)息(xi)。具(ju)體來ci)擔 渲zhong)的(de) User-Agent 是(shi)比較xian)匾 de)。而後(hou),仿照瀏覽器與服務器的(de)通(tong)信(xin),我們創(chuang)建了一個 requests.Session。接著,我們用 GET 方法打(da)開登(deng)錄jia)趁媯  謎蚩飩 齙authenticity_token。隨(sui)後(hou),將所需的(de)數據(ju),整備成一個 Python 字典備用。最(zui)後(hou),我們用 POST 方法,將表單提交到 session 接口。
     
    最(zui)終的(de)結果也(ye)是(shi)符合預期的(de)︰經由 302 跳轉,打(da)開了(200)GitHub 首頁。
     

美娱彩票官网

About IT165 -廣告(gao)服務 -隱(yin)私聲明 -版權(quan)申明 -免責條(tiao)款 -網(wang)站地圖 -網(wang)友投稿 -聯系方式
本站內(na)容來自于互聯網(wang),僅供用于網(wang)絡ke)際躚 學習中(zhong)請(qing)遵循相關法律法規(gui)
美娱彩票官网 | 下一页