天天看點

python爬蟲總是爬不到資料,你需要解決反爬蟲了

爬蟲最讨厭的就是反爬蟲,但是如果沒有反爬蟲的存在的,那麼大家都可以随随便便就進行網絡爬蟲,那麼伺服器又怎麼支撐得起來呢?那麼又怎麼彰顯我們的能力呢?

是以說反爬蟲是一個門檻,跨過這一個門檻就可以輕松掌握爬蟲的技術了,跨不過那麼你就一直都在起點而已。

目前常見的反爬蟲無非也就是那幾種(檢查爬蟲的請求頭、檢查發起請求的頻率、添加驗證碼……)

第一種處理請求頭

對于請求頭進行處理就是一個非常簡單的事情了,可以直接使用浏覽器的請求頭;

headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
# 直接從浏覽器擷取一個請求頭放置在程式中調用即可           

複制

也可以使用python中的第三方庫fake-useragent 進行設定,使用python中的第三方庫還有一個好處就是:該子產品中已經內建了所有的浏覽器的請求頭,可以直接進行導入,同時還可以随意切換請求頭資訊。

from fake_useragent import UserAgent

ua = UserAgent()        # 擷取所有整合之後的浏覽器請求頭資訊

headers = {'User-Agent':ua.random}       # 随機擷取一個請求頭           

複制

第二種請求頻率的處理

對于伺服器對IP位址進行請求次數的限制,當同一個IP在一定的時間内請求的次數過快的時候,就會采取一定的措施進行限制,甚至于會封了該IP位址。

對于這種情況呢?最簡單直接的就是添加延時函數,使得請求的頻率下降,但同時也會減低了爬蟲的效率,這就不是我們想要的效果了。

另外一個辦法就是更換代理IP位址,使用代理IP位址,每發起一定次數的請求之後就更換一個IP位址,這樣子就是一個非常完美的爬蟲了。對于如何更換代理IP以及建立一個屬于自己的代理IP池,在我的上幾個文章已經有了詳細的介紹了,這裡就不加以講解了。

介紹幾個免費高匿代理網站:(西祠代理、快代理、雲代理……)

第三種驗證碼的處理

對于驗證碼如今網絡上存在着多種不同的形式的驗證碼,首先介紹幾種簡單的驗證碼形式吧。

字元驗證碼:在圖檔上随機産生數字、英文字母或者漢字,一般是4位或者6位的驗證碼字元。

圖形驗證碼:這類驗證碼大多是計算機随機産生一個字元串,在把字元串增加噪點、幹擾線、變形、重疊、不同顔色、扭曲組成一張圖檔來增加識别難度。

(上面兩類驗證碼的解決方法:使用orc子產品進行二值化圖檔,提取圖檔驗證碼)

如今網絡上添加到圖檔中噪點技術已經相當的成熟,一般使用簡單的orc子產品進行處理,已經難以識别出驗證碼内容了。一般都需要結合到機器學習,使用訓練好的模型進行識别圖檔,擷取圖檔驗證碼内容;或者把圖檔上傳到一些打碼平台,使用打碼平台的傳回結果進行操作。

滑動驗證碼:也叫行為驗證碼,比較流行的一種驗證碼,通過使用者的操作行為來完成驗證,其中最出名的就是極驗。

(解決方案:通過開發者工具,擷取原圖檔以及需要滑動的圖檔,使用程式對比兩張圖檔的RGB,得出需要活動的距離,之後使用自動化工具(selenium)進行滑動登入,注意滑動的使用需要添加一定的延時或者加速度,使得滑動過程沒有那麼的平滑,模拟人的行為)

滑動驗證碼的原理就是使用機器學習中的深度學習技術,根據一些特征來區分是否為正常使用者。通過記錄使用者的滑動速度,還有每一小段時間的瞬時速度,使用者滑鼠點選情況,以及滑動後的比對程度來識别。而且,不是說滑動到正确位置就是驗證通過,而是根據特征識别來區分是否為真使用者,滑到正确位置隻是一個必要條件。

點觸驗證碼:點選類驗證碼都是給出一張包含文字的圖檔,通過文字提醒使用者點選圖中相同字的位置進行驗證。(解決方案:擷取驗證碼圖檔,以及需要點選的驗證字的順序,之後對圖檔進行識别,擷取每個驗證字的内容,之後組成正确的順序,擷取每個驗證字的位置,使用自動化工具進行點選對應的位置)

這種相對于上面的幾種驗證碼而言才是最難解決的。

第四種JavaScript前端渲染資料,對網頁進行渲染

1、嘗試在開發者工具中查找資料的來源,找到資料的接口,使用資料接口進行調用,擷取資料,簡單直接;如果使用開發者工具無法抓到資料包,可以使用第三方的抓包軟體進行抓包(fiddler等等)。

2、對于一些複雜的網頁,在找不到資料接口的情況下,可以使用selenium子產品,使用内置浏覽器模拟網頁正常打開,擷取源代碼資料,但是效率不高。

3.對于一些大型的網站,在PC端的網頁版難以尋找到突破口的時候,可以嘗試使用網頁版的手機端網站,進行擷取資料(前提:存在手機端的網頁版)。

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/115142.html原文連結:https://javaforall.cn