隨筆記錄方便自己和同路人查閱。
#------------------------------------------------我是可恥的分割線-------------------------------------------
requests 模塊讓你很容易從 Web 下載文件,不必擔心一些復雜的問題,諸如網絡錯誤、連接問題和數據壓縮。requests 模塊不是 Python 自帶的,所以必須先安裝。
通過命令行,運行 pip install requests。
#------------------------------------------------我是可恥的分割線-------------------------------------------
1、檢查requests模塊是否安裝成功,在交互式環境輸入import requests,如果沒有報錯,就證明安裝成功。
這樣就證明是沒有問題的。
2、用requests.get()函數下載一個網頁,示例代碼;
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang #導入第三方庫 import requests #該 URL 指向一個文本頁面,其中包含整部羅密歐與朱麗葉 res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') #打印它的類型 print(type(res)) #通過檢查 Response 對象的 status_code 屬性,你可以了解對這個網頁的請求是否成功。如果該值等於requests.codes.ok,那么一切都好 if res.status_code == requests.codes.ok: print('True') else: print('False') #打印大小 print(len(res.text)) #打印文本內容 print(res.text[:250])
運行結果:
requests.get()函數接受一個要下載的 URL 字符串。通過在 requests.get()的返回值上調用 type(),你可以看到它返回一個 Response 對象,其中包含了 Web 服務器對
你的請求做出的響應。
該 URL 指向一個文本頁面,其中包含整部羅密歐與朱麗葉。通過檢查 Response 對象的 status_code 屬性,你可以了解對這個網頁的請求是否成功。如果該值等於requests.codes.ok,那么一切都好(順便說一下,HTTP協議中“OK”的狀態碼是 200。你可能已經熟悉404 狀態碼,它表示“沒找到”)。如果請求成功,下載的頁面就作為一個字符串,保存在 Response 對象的 text變量中。這個變量保存了包含整部戲劇的一個大字符串,調用 len(res.text)表明,它的長度超過 178000 個字符。最后,調用 print(res.text[:250])顯示前 250 個字符。
3、檢查錯誤
正如你看到的,Response 對象有一個 status_code 屬性,可以檢查它是否等於requests.codes.ok,了解下載是否成功。檢查成功有一種簡單的方法,就是在 Response
對象上調用 raise_for_status()方法。如果下載文件出錯,這將拋出異常。如果下載成功,就什么也不做。
raise_for_status()方法,下載錯誤,示例代碼:
#! python 3
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
import requests
res = requests.get('http://inventwithpython.com/page_ _that_ _does_ _not_ _exist')
res.raise_for_status()
運行結果:
raise_for_status()方法,下載正常,示例代碼:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') res.raise_for_status()
運行結果:
raise_for_status()方法是一種很好的方式,確保程序在下載失敗時停止。這是一件好事:你希望程序在發生未預期的錯誤時,馬上停止。如果下載失敗對程序來說
不夠嚴重,可以用 try 和 except 語句將 raise_for_status()代碼行包裹起來,處理這一錯誤,不讓程序崩潰。
遇到下載錯誤是不停止工作,示例代碼:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests ''' 遇到下載錯誤不停止工作 ''' res = requests.get('http://inventwithpython.com/page_ _that_ _does_ _not_ _exist') try: res.raise_for_status() except Exception as exc: print('there was a problem: %s'%(exc))
運行結果:
4、將下載文件保存在硬盤
現在,可以用標准的 open()函數和 write()方法,將 Web 頁面保存到硬盤中的一個文件。但是,這里稍稍有一點不同。首先,必須用“寫二進制”模式打開該文件,即向函數傳入字符串'wb',作為 open()的第二參數。即使該頁面是純文本的(例如前面下載的羅密歐與朱麗葉的文本),你也需要寫入二進制數據,而不是文本數據,目的是為了保存該文本中的“Unicode 編碼”。
為了將 Web 頁面寫入到一個文件,可以使用 for 循環和 Response 對象的iter_content()方法。
示例代碼:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') try: res.raise_for_status() except Exception as exc: print('there was a problem: %s' % (exc)) playFile = open('d:\\RomeoAndJuliet.txt','wb') #iter_content方法,循環的每次迭代中 for chunk in res.iter_content(100000): #把每次迭代內容寫入文件 playFile.write(chunk) playFile.close()
運行結果:會把下載內容寫入指定文件