「極客猴」每週堅持分享 Python 原創乾貨的公衆號。包括基礎入門,進階技巧,網絡爬蟲,數據分析, Web 應用開發等,歡迎關注。html
在爬取某些網站時,咱們常常會設置代理 IP 來避免爬蟲程序被封。咱們獲取代理 IP 地址方式一般提取國內的知名 IP 代理商(如西刺代理,快代理,無憂代理等)的免費代理。這些代理商通常都會提供透明代理,匿名代理,高匿代理。那麼這幾種代理的區別是什麼?咱們該如何選擇呢?本文的主要內容是講解各類代理 IP 背後的原理。web
代理類型一共能分爲四種。除了前面提到的透明代理,匿名代理,高匿代理,還有混淆代理。從安全程度來講,這四種代理類型的排序是 高匿 > 混淆 > 匿名 > 透明。瀏覽器
代理類型主要取決於代理服務器端的配置。不一樣配置會造成不一樣的代理類型。在配置中,這三個變量 REMOTE_ADDR,HTTP_VIA,HTTP_X_FORWARDED_FOR 是決定性因素。安全
1) REMOTE_ADDR REMOTE_ADDR 表示客戶端的 IP,可是它的值不是由客戶端提供的,而是服務器根據客戶端的 IP 指定的。bash
若是使用瀏覽器直接訪問某個網站,那麼網站的 web 服務器(Nginx、Apache等)就會把 REMOTE_ADDR 設爲客戶端的 IP 地址。服務器
若是咱們給瀏覽器設置代理,咱們訪問目標網站的請求會先通過代理服務器,而後由代理服務器將請求轉化到目標網站。那麼網站的 web 服務器就會把 REMOTE_ADDR 設爲代理服務器的 IP。微信
2)X-Forwarded-For(XFF) X-Forwarded-For 是一個 HTTP 擴展頭部,用來表示 HTTP 請求端真實 IP。當客戶端使用了代理時,web 服務器就不知道客戶端的真實 IP 地址。爲了不這個狀況,代理服務器一般會增長一個 X-Forwarded-For 的頭信息,把客戶端的 IP 添加到頭信息裏面。網絡
X-Forwarded-For 請求頭格式以下:dom
X-Forwarded-For: client, proxy1, proxy2
複製代碼
client 表示客戶端的 IP 地址;proxy1 是離服務端最遠的設備 IP; proxy2 是次級代理設備的 IP;從格式中,能夠看出從 client 到 server 是能夠有多層代理的。post
若是一個 HTTP 請求到達服務器以前,通過了三個代理 Proxy一、Proxy二、Proxy3,IP 分別爲 IP一、IP二、IP3,用戶真實 IP 爲 IP0,那麼按照 XFF 標準,服務端最終會收到如下信息:
X-Forwarded-For: IP0, IP1, IP2
複製代碼
Proxy3 直連服務器,它會給 XFF 追加 IP2,表示它是在幫 Proxy2 轉發請求。列表中並無 IP3,IP3 能夠在服務端經過 Remote Address 字段得到。咱們知道 HTTP 鏈接基於 TCP 鏈接,HTTP 協議中沒有 IP 的概念,Remote Address 來自 TCP 鏈接,表示與服務端創建 TCP 鏈接的設備 IP,在這個例子裏就是 IP3。
3)HTTP_VIA via 是 HTTP 協議裏面的一個header,記錄了一次 HTTP 請求所通過的代理和網關,通過1個代理服務器,就添加一個代理服務器的信息,通過2個就添加2個。
1) 透明代理(Transparent Proxy) 代理服務器的配置以下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
複製代碼
透明代理雖然能夠直接「隱藏」客戶端的 IP 地址,可是仍是能夠從HTTP_X_FORWARDED_FOR
來查到客戶端的 IP 地址。
2) 匿名代理(Anonymous Proxy) 代理服務器的配置以下:
REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
複製代碼
匿名代理能提供隱藏客戶端 IP 地址的功能。使用匿名代理,服務器能知道客戶端使用用了代理,當沒法知道客戶端真實 IP 地址。
3) 混淆代理(Distorting Proxy) 代理服務器的配置以下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Random IP address
複製代碼
與匿名代理的原理類似,可是會假裝得更逼真。若是客戶端使用了混淆代理,服務器仍是能知道客戶端在使用代理,可是會獲得一個假的客戶端 IP 地址。
2) 高匿代理(Elite Proxy 或 High Anonymity Proxy) 代理服務器的配置以下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
複製代碼
高匿代理既能讓服務器不清楚客戶端是否在使用代理,也能保證服務器獲取不到客戶端的真實 IP 地址。
普通匿名代理能隱藏客戶機的真實 IP,但會改變咱們的請求信息,服務器端有可能會認爲咱們使用了代理。不過使用此種代理時,雖然被訪問的網站不能知道客戶端的 IP 地址,但仍然能夠知道你在使用代理,固然某些可以偵測 IP 的網頁仍然能夠查到客戶端的 IP。
而高度匿名代理不改變客戶機的請求,這樣在服務器看來就像有個真正的客戶瀏覽器在訪問它,這時客戶的真實IP是隱藏的,服務器端不會認爲咱們使用了代理。
所以,爬蟲程序須要使用到代理 IP 時,儘可能選擇普通匿名代理和高匿名代理。另外,若是要保證數據不被代理服務器知道,推薦使用 HTTPS 協議的代理。
文章參考:
本文首發於微信公衆號,原文地址是 。隨時歡迎轉載文章, 轉載請聯繫號主開通白名單,尊重做者的原創。本人微信公衆號「極客猴」,每週分享 Python 原創乾貨。涉及網絡爬蟲、數據分析、web 開發等方向。