[Python爬蟲] Requests 模組

Requests模組

Python requests 模組

requests 是一個非常流行的 Python 套件,用於發送 HTTP 請求。它的設計目的是使 HTTP 請求變得簡單易用。以下是對 requests 套件的介紹:

主要特點

  1. 簡單性requests 的接口直觀且易於使用,使得發送各種 HTTP 請求變得簡單。
  2. 靈活性:支持 GET、POST、PUT、DELETE 等多種 HTTP 方法。
  3. 自動處理:自動處理諸如重定向、會話(sessions)、cookies 等常見任務。
  4. 自定義和擴展性:允許使用者自定義頭部(headers)、參數(params)、資料(data)和 JSON。
  5. 豐富的功能:支持 SSL 請求、身份驗證、代理設置等。

基本使用

安裝:可以透過 pip 安裝 requests

pip install requests

GET 請求:獲取網頁內容

  1. 參數附加在 URL 上:GET 請求通常將參數附加在 URL 的末尾,參數之間用 & 分隔,並且以 ? 開始。
  2. 數據可見性:由於參數附加在 URL 上,因此 數據對任何人都是可見的 ,這意味著敏感信息不應該通過 GET 方法傳輸。
  3. 長度限制:URL 的長度有限制(由瀏覽器和伺服器決定),這意味著 GET 請求的 參數有長度限制
  4. 適用於數據檢索:GET 主要用於請求數據,而不是發送數據給伺服器。
  5. 使用場景:用於請求頁面、圖片、執行查詢等,通常不改變服務器狀態。
import requests
# 直接在 URL 夾帶參數
response = requests.get('https://httpbin.org/get?key1=value1&key2=value2')
print(response.text)  # 輸出網頁內容

# 參數不夾帶在URL
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
requests get 方法

POST 請求:提交表單

  1. 參數包含在請求主體中:POST 請求將數據作為請求 主體發送 。這意味著參數不會出現在 URL 中。
  2. 數據隱私性更好:由於數據不在 URL 中顯示,因此 POST 方法 適合傳輸敏感或私密數據
  3. 無長度限制:POST 請求 沒有數據長度限制 ,適用於大量數據的傳輸。
  4. 適用於數據提交:POST 常用於向伺服器提交表單數據或上傳文件。
  5. 使用場景:用於提交表單、上傳文件、進行交易等,可能會改變服務器狀態或數據。
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=payload)
print(response.text)
requests post 方法

常用方法

方法說明範例
GET向指定的資源發送一個 HTTP GET 請求,用於請求數據。requests.get(‘https://httpbin.org’, params={‘key’: ‘value’})
POST向指定資源提交數據進行處理請求。通常用於提交表單。requests.post(‘https://httpbin.org’, data={‘key’: ‘value’})
PUT向指定資源位置上傳其最新內容。requests.put(‘https://httpbin.org’, data={‘key’: ‘value’})
DELETE請求伺服器刪除指定的資源。requests.delete(‘https://httpbin.org’)
PATCH對資源進行部分修改。requests.patch(‘https://httpbin.org’, data={‘key’: ‘value’})

使用頭部

requests 模組中,HTTP 請求的頭部(Headers)是關鍵的組成部分,用於在發送請求時向伺服器提供額外的上下文信息。頭部是由一系列的鍵值對構成的,它們定義了請求的許多重要屬性,如內容類型、用戶代理、認證信息等。

頭部的主要作用

  1. 用戶代理(User-Agent):標識發出請求的客戶端軟件,常用於伺服器識別請求來源。
  2. 內容類型(Content-Type):指定發送數據的格式,如 application/jsonapplication/x-www-form-urlencoded
  3. 接受(Accept):指定客戶端能夠接收的回應內容類型。
  4. 認證(Authorization):包含用於認證的憑證,如基本認證的用戶名和密碼,或者是令牌。
  5. 緩存控制(Cache-Control):指示緩存行為,如 no-cachemax-age
  6. 接受語言(Accept-Language):指定客戶端偏好的語言,用於內容協商。

如何在 requests 中設置頭部

requests 中,可以在發送請求時通過 headers 參數自定義頭部:

headers = {
    'User-Agent': 'MyApp/1.0',
    'Accept': 'application/json',
    'Authorization': 'Bearer <TOKEN>'
}
response = requests.get('https://httpbin.org', headers=headers)

頭部注意事項

  • 安全性:在設置頭部時,應避免發送敏感信息,除非確保通訊過程的安全性(如使用 HTTPS)。
  • 合規性:應正確使用頭部信息,尊重 HTTP 協議的標準和伺服器的要求,特別是在使用 Authorization 頭部時。

常見頭部設定

參數說明範例
User-Agent標識發出請求的客戶端類型。‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36’
Accept指定客戶端能夠接收的內容類型。‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8′
Content-Type發送數據到伺服器時的內容類型。‘Content-Type’: ‘application/json’
Authorization用於認證的憑據,如基本認證或令牌。‘Authorization’: ‘Bearer YOUR_TOKEN’
Accept-Encoding標識客戶端支持的內容編碼類型。‘Accept-Encoding’: ‘gzip, deflate, br’
Connection控制是否保持網絡連接的活躍。‘Connection’: ‘keep-alive’
Host指定發送請求的目標伺服器。‘Host’: ‘example.com’
Referer指示請求的原始資源的地址。‘Referer’: ‘https://www.example.com’
Cookie從客戶端傳送到伺服器的 Cookie。‘Cookie’: ‘name=value; name2=value2’

處理回應

當使用 requests 模組進行 HTTP 請求時,伺服器的回應(即回傳的資料)可以通過 Response 對象來訪問和解析。以下是如何解析 requests 回傳的資料的不同方面:

狀態碼

在使用 requests 模組進行 HTTP 請求時,伺服器會返回不同的 HTTP 狀態碼,以表示請求的結果。以下是一些常見的 HTTP 狀態碼及其說明:

response = requests.get('https://example.com')
status_code = response.status_code
代碼說明
200OK – 請求成功處理。
201Created – 請求成功並創建了新的資源。
202Accepted – 請求已被接受進行處理,但處理尚未完成。
204No Content – 請求成功,但沒有新的內容返回。
301Moved Permanently – 請求的資源已永久移動到新位置。
302Found – 請求的資源臨時從不同的 URI 回應。
400Bad Request – 伺服器無法或不會處理請求(客戶端錯誤)。
401Unauthorized – 認證失敗或未提供認證。
403Forbidden – 伺服器拒絕請求。
404Not Found – 找不到請求的資源。
405Method Not Allowed – 不允許使用請求中指定的方法。
500Internal Server Error – 伺服器遇到了不知道如何處理的情況。
502Bad Gateway – 獲取請求的伺服器,從上游伺服器收到無效回應。
503Service Unavailable – 伺服器目前無法使用(超載或停機維護)。
504Gateway Timeout – 未能及時從上游伺服器或輔助伺服器收到請求。

這些狀態碼是根據 HTTP 標準定義的,代表了伺服器對 HTTP 請求的不同回應。在使用 requests 或其他 HTTP 客戶端進行網絡請求時,正確理解這些狀態碼對於處理不同的回應非常重要。

回應內容

  1. 文本內容
  • 用於獲取伺服器返回的文本內容,如 HTML 或純文本。
text_content = response.text
  1. 二進制內容
  • 用於獲取非文本(如圖片或文件)的原始二進制數據。
binary_content = response.content
  1. JSON 數據
  • 如果回應的內容是 JSON 格式,可以直接解析成 Python 的字典。
json_data = response.json()

回應頭部

  • 回應頭部包含了伺服器對於請求的元數據,如內容類型、伺服器信息等。
headers = response.headers

編碼

  • 獲取或設置編碼,可以查看或手動設置回應的字符編碼。
encoding = response.encoding
response.encoding = 'utf-8'

Cookies

  • 獲取回應中的 Cookies:
cookies = response.cookies

重定向和歷史

  • 如果請求經過重定向,可以查看整個重定向的歷史。
history = response.history

通過以上方法,您可以根據需要從 requests 的回應中提取和處理各種數據。在實際的應用中,根據伺服器回應的特點和需求選擇合適的解析方式非常重要。

注意事項

  • 異常處理:使用 requests 時應注意處理可能出現的異常,如 ConnectionErrorTimeout 等。
  • 資源管理:建議使用 with 語句管理回應對象,以確保釋放網絡資源。
  • 安全與合規性:在使用 requests 進行網路爬蟲時,應尊重目標網站的 robots.txt 規則,並確保符合相關法律法規。

requests 的功能強大且使用方便,是 Python 網路程式設計和網路爬蟲的重要工具之一。

HTTPBin 線上服務

HTTPBin 是一個線上服務,用於測試 HTTP 請求和回應。它提供了一系列端點,每個端點都展示了特定類型的行為,使得開發者可以測試和理解 HTTP 協議的不同方面。HTTPBin 對於學習 HTTP 協議、調試和測試客戶端(如網頁瀏覽器和 HTTP 客戶端庫)非常有用。

主要特點

  1. 多樣的測試端點:HTTPBin 提供了多種測試端點,包括用於測試 GET、POST、PUT、DELETE 請求的端點。
  2. 支持自定義請求:你可以發送帶有自定義頭部、cookies 和數據的請求,HTTPBin 將返回一個描述這些請求的回應。
  3. 查看返回信息:HTTPBin 返回的信息包括客戶端 IP 地址、請求頭部、請求數據、cookies 等,有助於理解 HTTP 請求和回應的結構。
  4. JSON 回應:HTTPBin 的大多數端點都返回 JSON 格式的數據,方便解析和處理。

常用端點

  • /ip:返回請求者的 IP 地址。
  • /user-agent:返回請求者的 User-Agent 信息。
  • /headers:返回請求的 HTTP 頭部信息。
  • /get:返回 GET 請求數據。
  • /post:返回 POST 請求數據。
  • /status/:code:返回一個特定的 HTTP 狀態碼。
  • /response-headers:返回自定義的回應頭部。
  • /redirect/:n:重定向到一個新的 URL,次數為 n
  • /cookies:返回請求中的 cookies。
  • /delay/:n:在回應之前等待 n 秒。

應用場景

  1. 學習和教育:HTTPBin 是一個非常好的學習工具,用於教育和理解 HTTP 請求和回應。
  2. 客戶端測試:開發者可以使用 HTTPBin 來測試和調試 HTTP 客戶端和庫,驗證它們是否按預期發送請求。
  3. API 交互實驗:HTTPBin 可以用於實驗性地構建和測試 API 交互,特別是對於理解不同 HTTP 方法和狀態碼的行為。

總之,HTTPBin 是一個實用的工具,無論是對於學習 HTTP 協議的新手還是需要測試和調試 HTTP 請求的經驗豐富的開發者。

範例: 抓取 Yahoo 股市網頁資訊

使用瀏覽器,在網頁上直接查看 原始碼

Yahoo 股市 查看網頁原始碼
原始碼內容

透過 Python Requests 程式 抓取網頁資訊

import requests
response = requests.get('https://tw.stock.yahoo.com/')
print(response.text[0:1000]) # 印出前1000個字
requests 取得網頁資訊

結語

在開始使用 requests 模組之前,建議先對 HTTP 傳輸協定有一定的了解和認識。實際上,requests 模組是一個建立在 HTTP 協定之上的工具,它的主要功能是協助我們通過網絡請求來獲取資料,無論是 HTML 頁面內容還是 JSON 格式的數據。因此,對 HTTP 協定的基本原理和操作有所熟悉,將有助於您更有效地使用 requests 模組,並能更好地理解網路請求和響應的過程。這包括瞭解不同的 HTTP 方法、狀態碼、請求頭部以及如何處理響應數據等。掌握這些基礎知識,將為您在網絡程式開發領域的進一步學習和實踐打下堅實的基礎。

Python基礎系列文章

[Python教學]開發工具介紹
[開發工具] Google Colab 介紹
[Python教學] 資料型態
[Python教學] if判斷式
[Python教學] List 清單 和 Tuple元組
[Python教學] for 和 while 迴圈
[Python教學] Dictionary 字典 和 Set 集合
[Python教學] Dictionary 字典 和 Set 集合
[Python教學] Function 函示
[Python教學] Class 類別
[Python教學] 例外處理
[Python教學] 檔案存取
[Python教學] 實作密碼產生器
[Python教學] 日期時間
[Python教學] 日期時間
[Python教學] 套件管理

Python 爬蟲系列文章

[Python爬蟲] 網路爬蟲
[Python爬蟲] 分析網站

Scroll to Top