Python學習筆記從Web抓取信息之用requests模塊從web下載文件


隨筆記錄方便自己和同路人查閱。

#------------------------------------------------我是可恥的分割線-------------------------------------------

  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()

  運行結果:會把下載內容寫入指定文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM