Requests: HTTP for Humans

Release v2.18.4. (Installation)

GET請求

普通單純的網頁,只需要用最簡單的GET請求即可直接下載,以下是一個簡單的範例:

# 引入 requests 模組
import requests

# 使用 GET 方式下載普通網頁
r = requests.get('https://www.google.com.tw/')

這裡我們以GET下載 Google 的網頁後,將結果儲存於r這個變數中,首先確認一下從伺服器傳回的狀態碼:

# 伺服器回應的狀態碼
print(r.status_code)

>>200

如果顯示200就代表沒問題。我們也可以利用以下這個判斷式來檢查狀態碼:

# 檢查狀態碼是否 OK
if r.status_code == requests.codes.ok:
    print("OK")

在確認狀態碼沒問題之後,接著即可放心使用抓回來的資料,如果要查看原始的網頁 HTML 程式碼,可以從r.text取得:

# 輸出網頁 HTML 原始碼
print(r.text)

增加 URL 查詢參數

許多的 GET 請求都會在 URL 中夾帶簡短的查詢參數(例如搜尋關鍵字等),這種狀況可以這樣寫:

# 查詢參數
my_params = {'key1':'value1', 'key2':'value2'}

# 將查詢參數加入 GET 請求中
r = requests.get('http://httpbin.org/get', params = my_params)

我們可以觀察最後所產生的 URL:

# 觀察 URL
print(r.url)
http://httpbin.org/get?key2=value2&key1=value1

雖然我們也可以自己產生這段 URL,然後直接指定給requests,不過自己處理的話,還必須注意編碼問題(尤其是有中文字的情況),所以建議還是交給requests統一處理比較省事。

自訂請求表頭

在進階的網路爬蟲程式中,自訂請求表頭也是一個很常被使用的技術,以下是一個簡單的範例:

# 自訂表頭
my_headers = {'user-agent': 'my-app/0.0.1'}

# 將自訂表頭加入 GET 請求中
r = requests.get('http://httpbin.org/get', headers = my_headers)

帳號密碼登入

若遇到需要帳號與密碼登入後才能看的網頁(HTTP 基本認證),可以使用auth參數指定帳號與密碼:

# 需要帳號登入的網頁
r = requests.get('https://api.github.com/user', auth=('user', 'pass'))

POST請求

POST請求也是很常用的 HTTP 請求,只要是網頁中有讓使用者填入資料的表單,大部分都會需要用POST請求來處理,以下是一個簡單的範例:

# 資料
my_data = {'key1': 'value1', 'key2': 'value2'}

# 將資料加入 POST 請求中
r = requests.post('http://httpbin.org/post', data = my_data)

若有遇到重複鍵值(key)的 HTML 表單欄位,可以這樣處理:

# 具有重複鍵值的資料
my_data = (('key1', 'value1'), ('key1', 'value2'))

# 將資料加入 POST 請求中
r = requests.post('http://httpbin.org/post', data = my_data)

上傳檔案

若要上傳檔案,也可以使用POST請求來處理,這是一個上傳 Word 文件的範例:

# 要上傳的檔案
my_files = {'my_filename': open('my_file.docx', 'rb')}

# 將檔案加入 POST 請求中
r = requests.post('http://httpbin.org/post', files = my_files)

如果伺服器傳回的網頁資料中含有 cookies,requests也可以輕鬆取出 cookies 的資料:

# 含有 cookie 的內容
r = requests.get("http://my.server.com/has/cookies")

# 取出 cookie
print(r.cookies['my_cookie_name'])

若要將自己設定的 cookies 放進GET請求中送給伺服器,可以這樣寫:

# 設定 cookie
my_cookies = dict(my_cookie_name='G. T. Wang')

# 將 cookie 加入 GET 請求
r = requests.get("http://httpbin.org/cookies", cookies = my_cookies)

常見問題

這裡列出一些實務上常見的問題與解決方式。

等待逾時

requests預設會一直等待直到伺服器完成回應為止,如果想改變等待逾時設定,可以用timeout設定(單位為秒):

# 等待 3 秒無回應則放棄
requests.get('http://github.com/', timeout = 3)

等待逾時設定是指伺服器無回應的狀態下所等待的時間,更精確的說就是完全沒有收到任何資料的狀況下,可等待的最常時間。

不合格憑證

當我們在自架網頁伺服器進行測試時,HTTPS 時常會有憑證不合格的問題,當requests遇到這種伺服器就容易會出現requests.exceptions.SSLError這樣的錯誤,解決的方式就是加上verify=False,關閉requests的憑證檢查功能:

# 關閉憑證檢查
r = requests.get('https://my.server.com/', verify = False)

參考資料:Python 使用 requests 模組產生 HTTP 請求,下載網頁資料教學

results matching ""

    No results matching ""