前言html
隨着大數據時代的到來,爬蟲已經成了獲取數據的必不可少的方式,作過爬蟲的想必都深有體會,爬取的時候莫名其妙 IP 就被網站封掉了,畢竟各大網站也不想本身的數據被輕易地爬走。api
對於爬蟲來講,爲了解決封禁 IP 的問題,一個有效的方式就是使用代理,使用代理以後可讓爬蟲假裝本身的真實 IP,若是使用大量的隨機的代理進行爬取,那麼網站就不知道是咱們的爬蟲一直在爬取了,這樣就有效地解決了反爬的問題。安全
那麼問題來了,使用什麼代理好呢?這裏指的代理通常是 HTTP 代理,主要用於數據爬取。如今打開搜索引擎一搜 HTTP 代理,免費的、付費的太多太多品牌,咱們該如何選擇呢?看完這一篇文章,想必你心中就有了答案。服務器
對於免費代理,其實想都不用想了,可用率能超過 10% 就已是謝天謝地了。真正靠譜的代理仍是須要花錢買的,那這麼多家到底哪家可用率高?哪家響應速度快?哪家比較穩定?哪家性價比比較高?爲此,我對市面上比較流行的多家付費代理針對可用率、爬取速度、爬取穩定性、價格、安全性、請求限制等作了詳細的評測,讓咱們來一塊兒看一下到底哪家更強!網絡
測評範圍app
免費代理測試
在這裏我主要測試的是付費代理,免費代理可用率過低,幾乎不會超過 10%,但爲了做爲對比,我選取了西刺免費代理進行了測試。大數據
付費代理網站
付費代理我選取了站大爺、芝麻 HTTP 代理、太陽 HTTP 代理、訊代理、快代理、蘑菇代理、阿布雲代理、全網代理、雲代理、大象代理進行了對比評測,購買了他們的各個不一樣級別的套餐使用一樣的網絡環境進行了測評,詳情以下:ui
注:其中蘑菇代理、太陽 HTTP 代理、芝麻 HTTP 代理的默認版表示此網站只有這一種代理,不一樣套餐僅是時長區別,代理質量沒有差異。
嗯,我把上面的套餐所有買了一遍,以供下面的評測使用。
測評目標
本次測評主要分析代理的可用率、響應速度、穩定性、價格、安全性、使用頻率等因素,下面咱們來一一進行說明。
可用率
可用率就是提取的這些代理中能夠正常使用的比率。假如咱們沒法使用這個代理請求某個網站或者訪問超時,那麼就表明這個代理不可用,在這裏個人測試樣本大小爲 500,即提取 500 個代理,看看裏面可用的比率多少。
響應速度
響應速度能夠用耗費時間來衡量,即計算使用這個代理請求網站一直到獲得響應所耗費的時間。時間越短,證實代理的響應速度越快,這裏一樣是 500 個樣本,計算時只對正常可用的代理作統計,計算耗費時間的平均值。
穩定性
因爲爬蟲時咱們須要使用大量代理,若是一個代理響應速度特別快,很快就能獲得響應,而下一次請求使用的代理響應速度特別慢,等了三十秒才獲得響應,那勢必會影響爬取效率,因此咱們須要看下商家提供的這些代理穩定性怎樣,總不能這一個特別快,下一個又慢的不行。因此這裏咱們須要統計一下耗費時間的方差,方差越大,證實穩定性越差。
價格
價格,這個固然是須要考慮的內容,若是一個代理不管是響應速度仍是穩定性都特別不錯,可是價格很是很是高,這也是不可接受的。
安全性
這的確也是須要考慮的因素,好比一旦不當心把代理提取的 API 泄露出去了,別人就肆意使用咱們的 API 提取代理使用,而一直耗費的是咱們的套餐。另一旦別人經過某些手段獲取了咱們的代理列表,而這些代理是沒有安全驗證的,這也會致使別人偷偷使用咱們的代理。在生產環境上,這方面尤爲須要注意。
使用頻率
有些代理套餐在 API 調用提取代理時有頻率限制,有的代理套餐則會限制請求頻率,這些因素都會或多或少影響爬蟲的效率,這部分因素咱們也須要考慮進來。
測評標準
要作標準的測評,那就必須在標準的測評環境下進行,且儘量排除一些雜項的干擾,如網絡波動、傳輸延遲等一系列的影響。
主機選取
因爲個人我的筆記本是使用 WiFi 上網的,因此可能會有網絡波動,並且實際帶寬其實並不太好把控,所以它並不適合來作標準評測使用。評測須要在一個網絡穩定的條件下進行,並且多個代理的評測環境必須相同,在此我選擇了一臺騰訊雲主機做爲測試,主機配置以下:
這樣咱們就能夠保證一個標準統一的測試環境了。
現取現測
另外在評測時還須要遵循一個原則,那就是現取現測,即取一個測一個。如今不少付費代理網站都提供了 API 接口,咱們能夠一次性提取多個代理,可是這樣會致使一個問題,每一個代理在提取出來的時候,商家是會盡可能保證它的可用性的,但過一段時間,這個代理可能就很差用了,因此假如咱們一次性提取出來了 100 個代理,可是這 100 個代理並無同時參與測試,後面的代理就會經歷一個的等待期,過一段時間再測這些代理的話,確定會影響後半部分代理的有效性,因此這裏咱們將提取的數量統一設置成 1,即請求一次接口獲取一個代理,而後當即進行測試,這樣能夠保證測試的公平性,排除了不一樣代理有效期的干擾。
時間計算
因爲咱們有一項是測試代理的響應速度,因此咱們須要計算程序請求以前和獲得響應以後的時間差,這裏咱們使用的測試 Python 庫是 requests,因此咱們就計算髮起請求和獲得響應之間的時間差便可,時間計算方法以下所示:
start_time = time.time() requests.get(test_url, timeout=timeout, proxies=proxies) end_time = time.time() used_time = end_time - start_time
這裏 used_time 就是使用代理請求的耗時,這樣測試的就僅僅是發起請求到獲得響應的時間。
測試連接
測試時咱們也須要使用一個穩定的且沒有反爬蟲的連接,這樣能夠排除服務器的干擾,這裏咱們使用百度來做爲測試目標。
超時限制
在測試時免不了的會遇到代理請求超時的問題,因此這裏咱們也須要統一一個超時時間,這裏設置爲 60 秒,若是使用代理請求百度,60 秒尚未獲得響應,那就視爲該代理無效。
測試數量
要作測評,那麼樣本不能過小,如只有十幾回測試是不能輕易下結論的,這裏我選取了一個適中的測評數量 500,即每一個套餐獲取 500 個代理進行測試。
測評過程
嗯,測評過程這邊主要說一下測評的代碼邏輯,首先測的時候是取一個測一個的,因此這裏定義了一個 test_proxy() 方法:
test_url = 'https://www.baidu.com/' timeout = 60 def test_proxy(proxy): try: proxies = { 'https': 'http://' + proxy } start_time = time.time() requests.get(test_url, timeout=timeout, proxies=proxies) end_time = time.time() used_time = end_time - start_time print('Proxy Valid', 'Used Time:', used_time) return True, used_time except (ProxyError, ConnectTimeout, SSLError, ReadTimeout, ConnectionError): print('Proxy Invalid:', proxy) return False, None
這裏須要傳入一個參數 proxy,表明一個代理,即 IP 加端口組成的代理,而後這裏使用了 requests 的 proxies 參數傳遞給 get() 方法。對於代理無效的檢測,這裏判斷了 ProxyError, ConnectTimeout, SSLError, ReadTimeout, ConnectionError 這幾種異常,若是發生了這些異常通通視爲代理無效,返回錯誤。若是在 timeout 60 秒內獲得了響應,那麼就計算其耗費時間並返回。
在主程序裏,就是獲取 API 而後統計結果了,代碼以下:
max = 500 def main(): print('Testing') used_time_list = [] valid_count = 0 total_count = 0 while True: flag, result = get_page(api_url) if flag: proxy = result.strip() if is_proxy(proxy): total_count += 1 print('Testing proxy', proxy) test_flag, test_result = test_proxy(proxy=proxy) if test_flag: valid_count += 1 used_time_list.append(test_result) stats_result(used_time_list, valid_count, total_count) time.sleep(wait) if total_count == max: break
這裏加了一些判斷,如 is_proxy() 方法判斷了獲取的是否是符合有效的代理規則,即判斷它是否是 IP 加端口的形式,這樣能夠排除 API 返回一些錯誤信息的干擾。另外這裏設置了 total_count 和 valid_count 變量,只有符合代理規則的代理參與了測試,這樣纔算一次有效測試,total_count 加一,若是測試可用,那麼 valid_count 加一併記錄耗費時間。最後調用了 stats_results 方法進行了統計:
import numpy as np def stats_result(used_time_list, valid_count, total_count): if not used_time_list or not total_count: return used_time_array = np.asarray(used_time_list, np.float32) print('Total Count:', total_count, 'Valid Count:', valid_count, 'Valid Percent: %.2f%%' % (valid_count * 100.0 / total_count), 'Used Time Mean:', used_time_array.mean(), 'Used Time Var', used_time_array.var())
這裏使用了 Numpy 來統計了耗費時間的均值和方差,分別反映代理的響應速度和穩定性。
嗯,就這樣,利用這個方法我對各個不一樣的代理套餐逐一進行了測試。
注:
表中的響應時間方差越大,表明穩定性越低。
阿布雲代理經典版方差較小是由於它是長時間鎖定了同一個 IP,所以極其穩定,但每秒最大請求默認 5 次。
測評分析
下面咱們將從各個方面分析一下各個套餐的優劣。
可用率
經過可用率統計,咱們能夠發現可用率較高的代理套餐有:
響應速度
經過平均響應速度判別,咱們能夠發現響應速度較快的代理套餐有:
穩定性
經過平均響應速度方差分析,咱們能夠發現穩定性較高的代理套餐有:
價格
咱們能夠先看一下各個套餐的價格:
按照包月的價格,咱們能夠統一對好比下:
安全性
對於安全性,此處主要考慮提取 API 是否有訪問驗證,使用代理時是否有訪問驗證,便可以經過設置白名單來控制哪些可使用。
其中只有芝麻 HTTP 代理、太陽 HTTP 代理默認使用了白名單限制,即只有將使用 IP 添加到白名單纔可使用,能夠有效控制使用權限。
另外阿布雲代理提供了隧道代理驗證,只有成功配置了用戶名和密碼才能夠正常使用。
因此在此概括以下:
調取頻率
不一樣的接口具備不一樣的 API 調用頻率限制,概括以下:
在此能夠簡單總結以下:
特點功能
除了常規的測試以外,我這邊還選取了某些套餐的不同凡響之處進行說明,這些特色有的算是缺點,有的算是優勢,現列舉以下:
測評綜合
分項瞭解了各個代理套餐的可用率、響應速度、穩定性、性價比、安全性等內容以後,最後作一下總結:
因此在綜合來看比較推薦的有:芝麻代理、訊代理、阿布雲代理三家,詳細的對比結果能夠參照表格。
以上即是各家代理的詳細對比測評狀況,但願此文可以在你們選購代理的時候有所幫助。