與 Web 伺服器互動時,無論是 Web 抓取還是 API 工作,Python 請求標頭都是一個強大但經常被忽視的工具。這些標頭以靜默方式進行通信,告訴伺服器誰在調用、為什麼調用以及應以什麼格式返回資料。
在本指南中,我們將介紹使用 Python 的請求庫設定標頭所需了解的所有資訊、為什麼標頭順序很重要,以及了解標頭如何提高 Web 互動的成功率。
對於該程式庫的新手,您可以透過使用 pip install requests 來安裝它並按照本指南進行操作。
在 HTTP 中,標頭是伴隨每個請求和回應的鍵值對,指導伺服器如何處理請求。標頭指定期望、格式和權限,在伺服器-客戶端通訊中發揮關鍵作用。例如,標頭可以告訴伺服器發送請求的裝置類型,或者客戶端是否期望 JSON 回應。
每個請求都會啟動客戶端(如瀏覽器或應用程式)和伺服器之間的對話,其中標頭充當指令。最常見的標頭包括:
可以使用 Python 的請求庫輕鬆管理標頭,讓您可以從回應中取得標頭或設定自訂標頭來自訂每個請求。
範例:使用 Python 請求取得標頭
在Python中,取得標頭的請求可以透過response.headers來完成。
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
輸出顯示伺服器發回的標頭,其中包含諸如
之類的詳細信息範例:設定自訂標頭
自訂標頭,例如添加用於設備模擬的用戶代理,可以使請求顯得更加真實:
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
此設定有助於確保每個請求都像瀏覽器一樣顯示,從而減少觸發反機器人措施的機會。在 Python 請求中,設定標頭可以讓您精確控制與伺服器的互動。
使用 Python 請求標頭時的一個常見問題是標頭名稱是否區分大小寫。
根據 HTTP/1.1 規範,標頭名稱不區分大小寫,這表示 Content-Type、content-type 和 CONTENT-TYPE 都是等效的。但是,堅持使用 Content-Type 等標準命名約定而不是替代大小寫是一個很好的做法。標準化格式有助於防止混淆,特別是在與可能以不同方式解釋標頭的第三方 API 或系統整合時。
當 Web 伺服器評估請求時,諸如不一致的標頭大小寫之類的微妙細節可以揭示客戶端的本質。許多合法的瀏覽器和應用程式都遵循特定的大小寫約定,例如大寫 Content-Type。然而,機器人或腳本可能不會統一遵循這些約定。透過使用非常規大小寫分析請求,伺服器可以標記或阻止潛在的機器人。
實際上,當使用 python requests set headers 等函數時,Python 的 requests 函式庫會自動處理 header 的大小寫規範化。這意味著無論您如何編寫標頭名稱,程式庫都會將其轉換為標準化格式,以確保與伺服器的兼容性。但是,請注意,雖然標頭名稱本身不區分大小寫,但標頭值(例如 Content-Type 中的“application/json”)仍可能按字面解釋,並且應準確格式化。
在 Python 的 requests 庫中,您可以在任何情況下設定標頭,並且程式庫將正確解釋它們:
headers = {'User-Agent': 'my-app/0.0.1'} response = requests.get('https://httpbin.dev/headers', headers=headers) print(response.json()) { "headers": { "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Host": ["httpbin.dev"], "User-Agent": ["my-app/0.0.1"], "X-Forwarded-For": ["45.242.24.152"], "X-Forwarded-Host": ["httpbin.dev"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], "X-Forwarded-Server": ["traefik-2kvlz"], "X-Real-Ip": ["45.242.24.152"] }}
如上所示,請求會自動將 content-type 轉換為標準 Content-Type。這表示 Python 的 requests 庫將為您規範標頭名稱,從而保持與 Web 伺服器的兼容性,無論原始程式碼中使用的大小寫如何。
在大多數標準 API 互動中,使用 Python 請求標頭呼叫傳送的標頭順序不會影響功能,因為 HTTP 規範不要求標頭的特定順序。然而,在處理高階反機器人和反抓取系統時,標頭順序在決定請求是否被接受或阻止方面可以發揮意想不到的重要作用。
反機器人系統,例如 Cloudflare、DataDome 和 PerimeterX,通常超越簡單的標頭驗證並分析請求的「指紋」。這包括發送標頭的順序。人類用戶(透過瀏覽器)通常以一致的順序發送標頭。例如,瀏覽器請求通常可能遵循 User-Agent、Accept、Accept-Language、Referer 等順序。相反,自動化庫或抓取工具可能會以不同的順序發送標頭或添加非標準標頭,這可能會成為檢測演算法的危險信號。
範例:瀏覽器標頭與 Python 請求標頭
在瀏覽器中,您可能會依照以下順序觀察標題:
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
使用 Python 的 requests 函式庫,標頭可能看起來略有不同:
headers = {'User-Agent': 'my-app/0.0.1'} response = requests.get('https://httpbin.dev/headers', headers=headers) print(response.json()) { "headers": { "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Host": ["httpbin.dev"], "User-Agent": ["my-app/0.0.1"], "X-Forwarded-For": ["45.242.24.152"], "X-Forwarded-Host": ["httpbin.dev"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], "X-Forwarded-Server": ["traefik-2kvlz"], "X-Real-Ip": ["45.242.24.152"] }}
標頭排序中的這種細微差異可能會向反機器人系統暗示該請求可能是自動化的,特別是與其他訊號(例如用戶代理格式或缺少標頭)結合使用時。
透過分析此順序,進階檢測系統可以識別通常與自動化腳本或機器人相關的模式。當請求與通常的順序不匹配時,伺服器可能會假設它來自機器人,從而可能導致請求被阻止或驗證碼挑戰。
設定 Python 請求標頭來模擬瀏覽器請求時,了解哪些標頭在大多數 Web 瀏覽器中是標準標頭會很有幫助。這些標頭向伺服器通報客戶端的功能和偏好,使請求顯得更合法。
標準標頭模仿瀏覽器行為,提高請求的成功率。關鍵標頭包括:
為了確保請求模仿真實的瀏覽器:
瀏覽器開發者工具 :
代理工具 :
範例:在 Python 中模仿標頭
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
此請求使用類似瀏覽器的標頭以使互動顯得更加自然。透過觀察瀏覽器工具中的標頭和標頭順序,您可以在 Python 中自訂這些,使您的請求盡可能接近真實的瀏覽器請求。
用戶代理字串在伺服器如何回應請求方面起著至關重要的作用。它識別發出請求的應用程式、作業系統和設備,從而允許伺服器相應地調整其回應。
用戶代理字串通常由瀏覽器本身生成,並且可能因瀏覽器版本、作業系統甚至硬體配置而異。
您可以在我們的專題文章中了解有關如何有效使用使用者代理進行網頁抓取的更多資訊:
(https://scrapfly.io/blog/user-agent-header-in-web-scraping/)
當使用帶有 POST 請求的 Python 請求標頭時,標頭在伺服器如何解釋客戶端發送的資料方面發揮著至關重要的作用。 POST 請求通常用於將資料傳送到伺服器以建立、更新或修改資源,通常需要額外的標頭來闡明資料的結構、格式和用途。
Content-Type :表示資料格式,例如 JSON 資料為 application/json,表單提交為 application/x-www-form-urlencoded,或 multipart/form-data檔案。正確設定可確保伺服器按預期解析您的資料。
User-Agent :標識客戶端應用程序,這有助於 API 存取和速率限制策略。
授權:安全端點需要對請求進行身份驗證,通常使用令牌或憑證。
Accept :指定所需的回應格式(例如 application/json),有助於一致的資料處理和錯誤處理。
POST 請求標頭的使用範例
要以 JSON 格式傳送數據,通常將 Content-Type 標頭設為 application/json 並將資料作為 JSON 傳遞。以下是使用 python 請求 post 標頭發送 JSON 有效負載的範例:
headers = {'User-Agent': 'my-app/0.0.1'} response = requests.get('https://httpbin.dev/headers', headers=headers) print(response.json()) { "headers": { "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Host": ["httpbin.dev"], "User-Agent": ["my-app/0.0.1"], "X-Forwarded-For": ["45.242.24.152"], "X-Forwarded-Host": ["httpbin.dev"], "X-Forwarded-Port": ["443"], "X-Forwarded-Proto": ["https"], "X-Forwarded-Server": ["traefik-2kvlz"], "X-Real-Ip": ["45.242.24.152"] }}
以這種方式使用 python 請求發布標頭可確保伺服器正確處理您的數據,並可能防止請求被阻止。
當伺服器期望來自真實使用者的流量時,它可能會檢查某些特定於瀏覽器的標頭,這些標頭通常僅由實際的 Web 瀏覽器發送。這些標頭有助於識別和區分瀏覽器與自動腳本,這在某些網站上的反機器人保護中導航時尤其重要。透過配置 Python 請求標頭來模仿這些特定於瀏覽器的模式,您可以使您的請求看起來更人性化,通常會增加請求成功的機會。
DNT(Do Not Track):通知伺服器使用者的追蹤首選項(1 表示「不追蹤」),使請求更像瀏覽器。
Sec-Fetch-Site :顯示來源關係,具有同源性、跨站點和無等值,有助於模仿真實的導航上下文。
Sec-Fetch-Mode :定義請求目的,例如導航頁面加載,使其可用於複製典型的瀏覽器行為。
Sec-Fetch-Dest :指示內容類型(文件、圖像、腳本),可用來模仿特定資源請求。
Python 請求中特定於瀏覽器的標頭範例:
使用 Python 中的 requests 庫發出請求時設定瀏覽器特定的標頭。
import requests response = requests.get('https://httpbin.dev') print(response.headers) { "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "frame-ancestors 'self' *.httpbin.dev; font-src 'self' *.httpbin.dev; default-src 'self' *.httpbin.dev; img-src 'self' *.httpbin.dev https://cdn.scrapfly.io; media-src 'self' *.httpbin.dev; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.httpbin.dev; style-src 'self' 'unsafe-inline' *.httpbin.dev https://unpkg.com; frame-src 'self' *.httpbin.dev; worker-src 'self' *.httpbin.dev; connect-src 'self' *.httpbin.dev", "Content-Type": "text/html; charset=utf-8", "Date": "Fri, 25 Oct 2024 14:14:02 GMT", "Permissions-Policy": "fullscreen=(self), autoplay=*, geolocation=(), camera=()", "Referrer-Policy": "strict-origin-when-cross-origin", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "X-Content-Type-Options": "nosniff", "X-Xss-Protection": "1; mode=block", "Transfer-Encoding": "chunked" }
透過包含這些標頭,您可以讓您的要求看起來更接近瀏覽器通常發送的請求,從而降低被標記為機器人或遇到存取限制的可能性。
反機器人偵測:瀏覽器特定的標頭幫助請求類似於常規使用者流量,使反機器人系統更難標記它們。
增強相容性:某些網站為類似瀏覽器的請求提供不同的回應,使這些標頭對於限制非瀏覽器流量的網站非常有用。
請求真實性:使用這些標頭模仿瀏覽器行為可以透過減少阻塞的機會來提高請求成功率。
使用 Python 請求標頭時,必須使用有效且格式正確的標頭。許多伺服器主動監視傳入標頭以偵測異常或不完整的請求。標頭無效或缺少的請求(例如缺少使用者代理、內容類型設定不正確或標頭相互矛盾)是自動或可疑流量的常見訊號,可能會導致立即阻塞。
例如,矛盾的標頭,例如將Accept: text/html 與Content-Type: application/json 混合在一起,可能會導致伺服器拒絕您的請求,因為這種組合與典型的瀏覽器行為不符。
此外,一些網站使用人工智慧驅動的反機器人工具來檢查標題並找出類似機器人的不一致之處。測試標頭是否有潛在問題最好在受控平台上進行。
這些設定標頭的實用技巧,例如使用 User-Agent、匹配 Content-Type 以及避免過多的標頭,有助於減少偵測並最大程度地減少請求阻塞。
設定標頭時採取這些預防措施可以顯著提高請求的成功率,並幫助您有效繞過潛在的阻塞。
雖然 requests 是一個強大的 HTTP 用戶端程式庫,但它並不是一個很好的抓取工具,因為它難以擴展且易於識別和阻止。
ScrapFly 提供網頁抓取、螢幕截圖和提取 API,用於大規模資料收集。
為了總結本指南,以下是 python 請求標頭的一些常見問題的解答。
標頭在每個請求中傳達附加訊息,例如預期資料類型、客戶端資訊和授權詳細資訊。它們對於傳達偏好並確保伺服器正確處理請求至關重要。
標頭可以幫助繞過反機器人偵測、驗證請求並確保回應中的資料格式正確。自訂標頭以類似於真實的瀏覽器請求對於抓取和存取受限 API 特別有幫助。
使用瀏覽器開發人員工具,您可以檢查每個請求發送到網站的標頭。將這些標頭複製到您的 Python 請求中可以幫助您的請求模擬瀏覽器流量。
使用 Python 請求標頭對於 Web 抓取和 API 互動都至關重要。了解如何設定、取得和操作標頭可以幫助您建立更有效、更可靠的請求。無論您是處理 GET 或 POST 請求、模仿瀏覽器標頭還是試圖避免檢測,處理標頭的方式都可能決定抓取的成功與否。
透過遵循最佳實踐,例如使用標準標頭、為 POST 請求設定適當的值以及確保標頭順序,您的請求將能夠更好地導航現代 Web 服務的複雜環境。
以上是Python 請求標頭指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!