6.1 為什麼需要代理伺服器?
現在這個時代,每個國家都有自己的互聯網。 現在被封鎖的不是個別使用者,而是整個網站、網域、應用程式,甚至國家。 這不是很好。但是如果你是程式設計師,那就沒問題了—— 網路上有很多代理伺服器......
代理伺服器(或簡稱代理)是 一種中介伺服器,扮演著 中間商的角色,在客戶端(例如你的 電腦)和你嘗試訪問的伺服器之間。 代理伺服器接收來自客戶端的請求,將它們轉發到目標 伺服器,獲取回應並將其發送回客戶端。
每個大型產品至少都有幾個 代理伺服器,執行各種有用的功能。 例如,如下功能:
- 匿名化:代理伺服器可以隱藏 客戶端的真實 IP 地址,提供匿名訪問 網路資源。IP 地址是網路中設備的唯一識別 碼,隱藏它有助於保護使用者的隱私。
- 緩存:代理伺服器可以緩存 經常請求的資源,加快訪問速度並 減少網路負載。例如,如果很多使用者 請求同一個網頁,代理伺服器可以保存其副本, 直接提供,而不需每次請求來源伺服器。
- 內容過濾:代理伺服器可以 阻止訪問某些網站或內容類型, 提供控制和安全性。
- 繞過訪問限制:代理伺服器可以 幫助繞過地區性內容訪問限制, 提供對某些地理區域被封鎖 資源的訪問。
- 記錄與監控:代理伺服器可以 記錄所有的請求與回應,這使得追蹤 和分析網路流量成為可能。
代理伺服器的工作原理
- 客戶端發送請求:客戶端設備 (例如,電腦或智慧型手機)向代理伺服器 發送請求。
- 代理伺服器處理請求: 代理伺服器接收請求,可能修改它(例如, 添加或刪除標頭)並將其轉發到目標 伺服器。
- 目標伺服器回應:目標伺服器 處理請求並將回應發送到代理伺服器。
- 代理伺服器將回應返回給客戶端: 代理伺服器從目標伺服器接收回應,並可能 緩存它以供以後使用,並將其轉發給 客戶端。
使用代理伺服器的優勢
- 增強安全性:代理伺服器可以 將內部網路隱藏於外界,減少攻擊風險。
- 加快訪問速度:緩存經常 請求的資源可以減少訪問時間。
- 控制訪問:代理伺服器可以 限制訪問某些網站或內容類型, 提供網路使用的控制。
- 減少網路負載:透過緩存和過濾流量, 代理伺服器可以減少總數據傳輸量和網路負載。
許多伺服器程序為了安全不提供直接的 網際網路訪問。相反,這些程序透過代理進行訪問, 而代理已經擁有允許的網站和資源的列表。因此, 你的程序也應該能夠處理代理。
儘管有這些優勢,使用代理伺服器也可能有缺點。 例如,這可能會導致連接速度下降,因為請求要經過 額外的環節。此外,某些網站可能會阻止來自已知代理伺服器的訪問。
6.2 代理與 requests
模組
requests
庫支持通過參數 proxies
使用代理伺服器。
HTTP(超文本傳輸協定)和 HTTPS(安全超文本傳輸協定)是互聯網上 的資料傳輸協定。HTTPS 是 HTTP 的安全版本。由於 HTTPS 的加密特性, 它們可能需要不同的代理伺服器進行不同的處理。
HTTP 代理的示例
一般會提供不只一個代理,而是一整個列表。 如果某些代理被封鎖或不可用,這樣會非常方便。
使用 requests.get()
來通過 proxy 發送請求的示例。
import requests
# 執行請求的 URL 地址
url = 'http://httpbin.org/ip'
# 代理伺服器設置
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
# 通過代理發送 GET 請求
response = requests.get(url, proxies=proxies)
print(response.json())
http 請求將通過第一個代理伺服器,而 https 將 透過第二個。
使用帶身份驗證的代理的示例
許多代理伺服器首先要求進行身份驗證,然後才 允許使用它們。我們可以利用一個有趣的技巧......
當 URL 剛被發明時,標準 URL 就包含了一個 可以直接在其中傳遞登錄和密碼給資源的功能。它看起來是這樣的:
http://user:password@domain/path
所以,如果代理伺服器要求身份驗證,可以把 賬戶資料包含在 URL 中。
示例:
import requests
# 執行請求的 URL 地址
url = 'http://httpbin.org/ip'
# 帶身份驗證的代理伺服器配置
proxies = {
'http': 'http://user:password@10.10.1.10:3128',
'https': 'http://user:password@10.10.1.10:1080',
}
# 通過代理發送 GET 請求
response = requests.get(url, proxies=proxies)
print(response.json())
我沒有見過在實際中使用它,但如果你要設置自己的測試代理伺服器, 那麼為什麼不呢。
但值得注意的是,將登錄名和密碼傳遞在 URL 中可能不安全, 因為 URL 可能會被保存到瀏覽器歷史中或伺服器日誌中。在 真實應用中應使用更安全的身份驗證方法。
在實際應用中,務必要記住安全地存儲代理伺服器的憑證。 不要在代碼或配置文件中明文存儲密碼。 取而代之,應使用環境變量或安全的秘密存儲庫。
6.3 代理與 http.client
在 http.client
模組中使用代理伺服器時需要手動設置連接和請求標頭。
你只需在創建連接時指定 host
和
port。
示例:
# 代理伺服器配置
proxy_host = '10.10.1.10'
proxy_port = 3128
# 與代理伺服器創建連接
conn = http.client.HTTPConnection(proxy_host, proxy_port)
然後需要先與代理伺服器建立隧道,然後再 向它發送請求:
dest_url = 'httpbin.org'
dest_path = '/ip'
# 構建並發送請求
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
為了檢查代理伺服器是否正確工作,可以比較在使用代理前後的 IP 地址。 為此可以使用一些服務來顯示你當前的 IP 地址,例如 httpbin.org/ip。
非常「簡單」。完整的使用 HTTP 代理和
http.client
的示例如下:
import http.client
# 代理伺服器配置
proxy_host = '10.10.1.10'
proxy_port = 3128
dest_url = 'httpbin.org'
dest_path = '/ip'
# 與代理伺服器創建連接
conn = http.client.HTTPConnection(proxy_host, proxy_port)
# 構建並發送請求
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
# 獲取回應
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode('utf-8'))
# 關閉連接
conn.close()
怎麼說呢?使用 requests
模組當然會簡單一些。
但是!許多模組和框架在底層使用的是
低階的 http.client
。你需要了解如何使用它,
以便能夠正確配置它們的工作。
儘管有這些優勢,使用代理伺服器也可能有缺點。 例如,這可能會導致連接速度下降,因為請求要經過 額外的環節。此外,某些網站可能會阻止來自已知代理伺服器的訪問。 因此,在使用代理時,始終需要考慮其優勢, 以及潛在的限制。
GO TO FULL VERSION