iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

Why it works: python requests and urllib3系列 第 13

Day13-Requests-The User Guide-Quickstart-1

  • 分享至 

  • xImage
  •  

一開始就直指Requests的核心:Make a Request,竟然只要一行程式碼就可以得到一個Response物件,展示了簡單易用的特性,光是第一段就非常吸引人繼續往下閱讀。

第二段在講如何產生問號後面的URL query string,兩行解決,並且提示Response物件有一個屬性url,展示了經由Requests後產生的url長相。

第三段慢慢地揭開Response物件的面紗,提到Requests會針對伺服器所回傳的內容進行自動解碼(automatically decode),且會猜測回傳內容的編碼是什麼,根據Day10-Models-Response,其實就是借用了chardet這個套件的力量。提示Response物件有第二個屬性encoding,向使用者說明有機會對該內容的值做修改,結果會影響到第三個屬性text的內容。

...
...
        # Fallback to auto-detected encoding.
        if self.encoding is None:
            encoding = self.apparent_encoding
        # Forcefully remove BOM from UTF-8
        elif self.encoding.lower() == 'utf-8':
            encoding = 'utf-8-sig'
...
...
    @property
    def apparent_encoding(self):
        """The apparent encoding, provided by the chardet library."""
        return chardet.detect(self.content)['encoding']

Requests will automatically decode content from the server.
Requests makes educated guesses about the encoding of the response based on the HTTP headers. The text encoding guessed by Requests is used when you access r.text.

講完了編碼之後,第四到第六段針對伺服器回傳的內容分類,分為Binary, JSON, Raw
說明JSON的時候額外提到若需要判斷該次回傳是否成功,需要透過status_code 或是raise_for_status()決定成功與否。
針對處理streaming的資料,提供了一個易用的模式給使用者。使用iter_content,用到了yieldgenerator的觀念

  • Binary: Access the response body as bytes
    • The gzip and deflate transfer-encodings are automatically decoded for you.
      • 目前看不出來如何做到
  • JSON: There’s also a builtin JSON decoder, in case you’re dealing with JSON data
  • Raw: Raw socket response
    • If you want to do this, make sure you set stream=True in your initial request
r = requests.get('https://api.github.com/events', stream=True)
with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size=128):
        fd.write(chunk)

整理一下到目前為止提到的幾個屬性和方法

r = requests.get('https://api.github.com/events', stream=True)
r.url
r.encoding
r.text
r.status_code
r.raise_for_status()
r.content
r.json()
r.raw
r.iter_content()

參考


上一篇
Day12-From External to Internal
下一篇
Day14-Requests-The User Guide-Quickstart-2
系列文
Why it works: python requests and urllib330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言