天天看點

python3 requests子產品_Python3使用requests子產品顯

一、配置request

1. 相關資料

請求關鍵參數:stream=True。預設情況下,當你進行網絡請求後,響應體會立即被下載下傳。你可以通過 stream 參數覆寫這個行為,推遲下載下傳響應體直到通路 Response.content 屬性。tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'

r = requests.get(tarball_url, stream=True)

此時僅有響應頭被下載下傳下來了,連接配接保持打開狀态,是以允許我們根據條件擷取内容:if int(r.headers['content-length']) < TOO_LONG:

content = r.content

...

進一步使用 Response.iter_content 和 Response.iter_lines 方法來控制工作流,或者以 Response.raw 從底層urllib3的 urllib3.HTTPResponsefrom contextlib import closing

with closing(requests.get('http://httpbin.org/get', stream=True)) as r:

# Do things with the response here.

保持活動狀态(持久連接配接)

歸功于urllib3,同一會話内的持久連接配接是完全自動處理的,同一會話内發出的任何請求都會自動複用恰當的連接配接!

注意:隻有當響應體的所有資料被讀取完畢時,連接配接才會被釋放到連接配接池;是以確定将 stream 設定為 False 或讀取 Response 對象的 content 屬性。

2. 下載下傳檔案并顯示進度條with closing(requests.get(self.url(), stream=True)) as response:

chunk_size = 1024 # 單次請求最大值

content_size = int(response.headers['content-length']) # 内容體總大小

progress = ProgressBar(self.file_name(), total=content_size,

unit="KB", chunk_size=chunk_size, run_status="正在下載下傳", fin_status="下載下傳完成")

with open(file_name, "wb") as file:

for data in response.iter_content(chunk_size=chunk_size):

file.write(data)

progress.refresh(count=len(data))

二、進度條類的實作

在Python3中,print()方法的預設結束符(end=’\n’),當調用完之後,光标自動切換到下一行,此時就不能更新原有輸出。

将結束符改為“\r”,輸出完成之後,光标會回到行首,并不換行。此時再次調用print()方法,就會更新這一行輸出了。

結束符也可以使用“\d”,為倒退符,光标回退一格,可以使用多個,按需求回退。

在結束這一行輸出時,将結束符改回“\n”或者不指定使用預設

下面是一個格式化的進度條顯示子產品。代碼如下:class ProgressBar(object):

def __init__(self, title,

count=0.0,

run_status=None,

fin_status=None,

total=100.0,

unit='', sep='/',

chunk_size=1.0):

super(ProgressBar, self).__init__()

self.info = "【%s】%s %.2f %s %s %.2f %s"

self.title = title

self.total = total

self.count = count

self.chunk_size = chunk_size

self.status = run_status or ""

self.fin_status = fin_status or " " * len(self.status)

self.unit = unit

self.seq = sep

def __get_info(self):

# 【名稱】狀态 進度 機關 分割線 總數 機關

_info = self.info % (self.title, self.status,

self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit)

return _info

def refresh(self, count=1, status=None):

self.count += count

# if status is not None:

self.status = status or self.status

end_str = "\r"

if self.count >= self.total:

end_str = '\n'

self.status = status or self.fin_status

print(self.__get_info(), end=end_str)

三、參考資料