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

非同步程式設計之美發表於2020-06-26

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

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

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


第一種處理請求頭

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

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端的網頁版難以尋找到突破口的時候,可以嘗試使用網頁版的手機端網站,進行獲取資料(前提:存在手機端的網頁版)。

相關文章