Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

數據頭User-Agent反爬蟲機制解析:

當我們使用瀏覽器訪問網站的時候,瀏覽器會發送一小段信息給網站,我們稱為Request Headers,在這個頭部信息裡面包含了本次訪問的一些信息,例如編碼方式,當前地址,將要訪問的地址等等。這些信息一般來說是不必要的,但是現在很多網站會把這些信息利用起來。其中最常被用到的一個信息,叫做“User-Agent”。網站可以通過User-Agent來判斷用戶是使用什麼瀏覽器訪問。不同瀏覽器的User-Agent是不一樣的,但都有遵循一定的規則。

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

例如,我們在windows上面的Chrome瀏覽器,它的User-Agent是:

但是如果我們使用Python的Requests直接訪問網站,除了網址不提供其他的信息,那麼網站收到的User-Agent是空。這個時候網站就知道我們不是使用瀏覽器訪問的,於是它就可以拒絕我們的訪問。

例如

沒有User-Agent的情況

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

有User-Agent的情況

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

如何獲取網站的 User-Agent 呢?請打開 Chrome,任意打開一個網站,然後右鍵,“檢查” 打開開發者工具,定位到 “Network” 選項卡,並刷新網頁,如下圖所示:

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

在左下角會出現當前網頁加載的所有元素。隨便點一個元素,於是在右下角會出現對當前元素的請求信息。在裡面找到Request Headers這一項,裡面的內容即為我們需要的內容。

不同的網站,Request Headers 是不同的

提示:requests的 get方法,post方法,Session模塊的get方法,post方法,都支持自定義Headers,參數名為headers, 它可以接收字典作為參數。

我們可以通過字典來設定Headers,例如:

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

在 requests 中,使用如下代碼來提交 Headers:

或者Session模塊:

檢查User-Agent是一種最簡單的反爬蟲機制,而通過設定Request Headers中的User-Agent,可以突破這種機制。

訪問頻率限制

我們訪問一些網站,由於一些網站的訪問時間設置,我們是不能快速進入下一頁的,這個時候,我們需要修改他的訪問時間,在它訪問下一頁的時候,通過 POST 方式,修改 read_time,正常訪問的話,這個值一般會大於10如果我們修改成 60。於是輕輕鬆鬆的通過了它的反爬蟲策略。

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

上面這種情況我們現在已經極少會遇到了,因為這種辦法根本沒有任何的防禦能力。猜測這個策略可能是某個新人寫的。

修改訪問頻率:

大多數情況下,我們遇到的是訪問頻率限制。如果你訪問太快了,網站就會認為你不是一個人。這種情況下需要設定好頻率的閾值,否則有可能誤傷。如果大家考過託福,或者在12306上面買過火車票,你應該會有這樣的體會,有時候即便你是真的用手在操作頁面,但是因為你鼠標點得太快了,它都會提示你: “操作頻率太快...”。

遇到這種網頁,最直接的辦法是限制訪問時間。例如每隔5秒鐘訪問一次頁面。但是如果遇到聰明一點的網站,它檢測到你的訪問時間,這個人訪問了幾十個頁面,但是每次訪問都剛好5秒鐘,人怎麼可能做到這麼準確的時間間隔?肯定是爬蟲,被封也是理所當然的!所以訪問時間間隔你可以設定為一個隨機值,例如0到10之間的隨機秒數。

當然,如果遇到限制訪問頻率的網站,我們使用Selenium來訪問就顯得比較有優勢了,因為Selenium這個東西打開一個頁面本身就需要一定的時間,所以我們因禍得福,它的效率低下反而讓我們繞過了頻率檢查的反爬蟲機制。而且Selenium還可以幫我們渲染網頁的JavaScript,省去了人工分析JavaScript源代碼的麻煩,可謂一舉兩得。

代理IP或者分佈式爬蟲:

如果對頁的爬蟲的效率有要求,那就不能通過設定訪問時間間隔的方法來繞過頻率檢查了。

代理IP訪問可以解決這個問題。如果用100個代理IP訪問100個頁面,可以給網站造成一種有100個人,每個人訪問了1頁的錯覺。這樣自然而然就不會限制你的訪問了。

代理IP經常會出現不穩定的情況。你隨便搜一個“免費代理”,會出現很多網站,每個網站也會給你很多的代理IP,但實際上,真正可用的代理IP並不多。你需要維護一個可用的代理IP池,但是一個免費的代理IP,也許在你測試的時候是可以使用的,但是幾分鐘以後就失效了。使用免費代理IP是已經費時費力,而且很考驗你運氣的事情。

大家可以使用http://icanhazip.com/ 這個網站來檢測你的代理IP是否設定成功。當你直接使用瀏覽器訪問這個網站的時候,它會返回你的IP地址。如下圖所示:

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

通過requests,我們可以設置代理訪問網站,在requests的get方法中,有一個proxies參數,它接收的數據是一個字典,在這個字典中我們可以設置代理。

大家可以在requests的官方中文文檔中看到關於設置代理的更多信息:http://docs.python-requests.org/zh_CN/latest/user/advanced.html#proxies

我選擇第一個HTTP類型的代理來給大家做測試,運行效果如下圖所示:

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

從上圖可以看出,我們成功通過了代理IP來訪問網站。

我們還可以使用分佈式爬蟲。分佈式爬蟲會部署在多臺服務器上,每個服務器上的爬蟲統一從一個地方拿網址。這樣平均下來每個服務器訪問網站的頻率也就降低了。由於服務器是掌握在我們手上的,因此實現的爬蟲會更加的穩定和高效。這也是我們這個課程最後要實現的目標。

蜜罐技術

蜜罐這個詞,最早是來自於網絡攻防中。一方會故意設置一個或者幾個服務器,故意留下漏洞,讓另一方輕易的入侵進來。這些被故意設置的服務器,就叫做蜜罐。裡面可能安裝了監控軟件,用來監控入侵者。同時,蜜罐還可以拖延入侵者的時間。

在反爬蟲的機制中,也有一種蜜罐技術。網頁上會故意留下一些人類看不到或者絕對不會點擊的鏈接。由於爬蟲會從源代碼中獲取內容,所以爬蟲可能會訪問這樣的鏈接。這個時候,只要網站發現了有IP訪問這個鏈接,立刻永久封禁該IP + User-Agent + Mac地址等等可以用於識別訪問者身份的所有信息。這個時候,訪問者即便是把IP換了,也沒有辦法訪問這個網站了。給爬蟲造成了非常大的訪問障礙。

不過幸運的是,定向爬蟲的爬行軌跡是由我們來決定的,爬蟲會訪問哪些網址我們都是知道的。因此即使網站有蜜罐,定向爬蟲也不一定會中招。

Python知識點:Python爬蟲常見的反爬機制,與對應解決方案

其他反爬蟲機制

有一些網站,他們每個相同類型的頁面的源代碼格式都不一樣,我們必需要針對每一個頁面寫XPath或者正則表達式,這種情況就比較棘手了。如果我們需要的內容只是文本,那還好說,直接把所有HTML標籤去掉就可以了。可是如果我們還需要裡面的鏈接等等內容,那就只有做苦力一頁一頁的去看了。

這種網站很少,因為如果每個頁面的源代碼格式都不一樣,要不就用戶體驗查,要不就做網頁的內容會被累個半死。

在這裡小編為大家推薦高淇老師的Python400集視頻資料

本套視頻一共400集,本套視頻共分3季:

第一季【基礎篇】Python基礎(115集)

第二季【提高篇】Python深入和擴展(100集)

第三季【擴展篇】網絡編程、多線程、擴展庫(85集)

第四季 【高手篇】算法、Python源碼、函數式編程、手工實現神經網絡(100集)

如果你想要這套教程,那就來找小編吧

獲取方式

1.關注小編,並轉發此文(記得轉發哦~)

2.私信小編關鍵字“教程”

相關推薦

推薦中...