為什么網(wǎng)站知道我的爬蟲使用了代理?
在公眾號粉絲群里面,經(jīng)常有同學(xué)問:為什么自己的爬蟲明明設(shè)置了代理,但一訪問網(wǎng)站就能被發(fā)現(xiàn)。我總結(jié)了幾種常見的情況。
實際上,網(wǎng)站要識別你是否使用了代理,并不一定非要什么高深的反爬蟲機制,也不需要使用AI識別用戶行為。下面這幾種情況,要識別代理簡直是易如反掌。
你根本沒有使用代理
有一些初學(xué)者在使用Requests請求網(wǎng)站的時候,是這樣寫的代碼:
import requests
resp = requests.get('https://httpbin.org/ip').text
print('不使用代理:', resp)
resp = requests.get('https://httpbin.org/ip', proxies={'http': 'http://IP:port'}).text
print('使用代理:', resp)
運行效果如下圖所示:
為什么使用了代理以后,IP沒有變呢?這是很多剛剛使用Requests的同學(xué)常常犯的錯誤。因為你根本沒有給https網(wǎng)站使用代理,你的代理只會對http網(wǎng)站生效。要對https網(wǎng)站生效,需要給它指定代理:
resp = requests.get('https://httpbin.org/ip', proxies={'http': 'http://IP:port', 'https': 'http://IP:port'}).text
P.S.: 注意看上面的代碼,給https網(wǎng)址設(shè)置代理的時候,key是https,但值依然是http://開頭。對一些代理供應(yīng)商來說,如果你把這里設(shè)置成了https://開頭,就會報錯。不過這個原理跟本文無關(guān),就暫時不講了。如果大家有興趣的話,我再寫一篇文章來講。
你的代理IP是服務(wù)器IP
有很多代理供應(yīng)商,他們批量采購云服務(wù)器來搭建代理服務(wù)。例如國內(nèi)的供應(yīng)商會采購阿里云、騰訊云、華為云的服務(wù)器來搭建代理。海外的供應(yīng)商會采購AWS或者Google云服務(wù)器。
如果你在云服務(wù)器上跑過不加代理的爬蟲,你會發(fā)現(xiàn),有時候一個爬蟲,不加代理,在自己電腦上跑一點問題都沒有,但是在云服務(wù)器上一跑就會被識別。這是因為云服務(wù)器的IP地址范圍跟家用寬帶是不一樣的。
像AWS和Google云,他們的云服務(wù)器IP范圍是公開的,只要網(wǎng)站提前把來自這個范圍的所有請求全部禁掉,那么從AWS、Google云服務(wù)器上面發(fā)起的請求直接就會被當(dāng)做爬蟲請求。因此搭建在上面的代理服務(wù)自然就不會生效了。
國內(nèi)的云服務(wù)供應(yīng)商的服務(wù)器IP地址是否公布過我不太清楚,但他們的IP范圍肯定是跟家用IP不一樣的。網(wǎng)址遇到來自這些可疑IP范圍的請求時,雖然不一定完全封禁,但是彈一個驗證碼出來測一測,還是可以擋住很多爬蟲。
遇到這種情況,爬蟲只有設(shè)法采購一些使用家用寬帶搭建代理服務(wù)的供應(yīng)商,才能解決問題。但這種代理價格肯定會翻好幾倍。
你的代理IP不是高匿代理
代理IP有三種常見的類型,透明代理,匿名代理和高匿代理:
- 使用透明代理的時候,網(wǎng)站可以同時看到代理IP和你的真實IP。用了等于白用。
- 使用匿名代理的時候,網(wǎng)站看不到你的真實IP,但是在請求里面有一個特征,可以告訴網(wǎng)站,你正在使用代理訪問。
- 而只有真正的高匿代理,才能把你的爬蟲請求隱藏起來。
有一些同學(xué)可能會從網(wǎng)上搜索免費的代理IP來使用。但這里面很多代理并不是高匿代理??隙〞话l(fā)現(xiàn)。
服務(wù)器供應(yīng)商的IP池被污染
有些人的爬蟲寫得非常垃圾,自以為有代理就無所畏懼,爬蟲請求漏掉百出,網(wǎng)站即使不檢查IP頻率,也可以從其它特征知道這是爬蟲請求,于是網(wǎng)站就會連帶著這個代理IP一起封掉。而偏偏這種垃圾爬蟲的請求速度又極快。哪怕代理供應(yīng)商的IP池中有幾百萬個IP,也會很快被這些垃圾爬蟲全部害死。
國內(nèi)頭部網(wǎng)站每天都會被數(shù)以千萬計的爬蟲請求訪問,而主流的代理供應(yīng)商就那么幾家。如果很多垃圾爬蟲都選中了同一家供應(yīng)商,而他們的代理池更新又不及時。那么你使用了這家供應(yīng)商的代理IP,自然一來就會被發(fā)現(xiàn)。
代理不支持HTTP/2
有一些網(wǎng)站需要使用HTTP/2請求。在Python里面,已經(jīng)有不少HTTP客戶端庫支持發(fā)起HTTP/2的請求了,例如httpx。但是,現(xiàn)在很少有代理供應(yīng)商能提供支持HTTP/2的代理,因為它搭建起來比較麻煩。于是,當(dāng)你使用了支持HTTP/2的客戶端,通過一個HTTP/1.1的代理IP訪問一個HTTP/2的網(wǎng)站的時候,網(wǎng)站并不能正常返回內(nèi)容。
總結(jié)
網(wǎng)站要檢測爬蟲有非常多的方法,要檢測一個請求是不是使用了代理來發(fā)起,也有很多種方法。而且這些方法并不需要什么高深的技術(shù),一個初級工程師都能寫出來。
那些自以為給爬蟲加了代理就可隨便爬網(wǎng)站的人,你們不僅害了自己,還害了別的爬蟲。