爬蟲攻防-初學篇1
爬蟲是模擬人的瀏覽訪問行為,進行資料的批量抓取。當抓取資料量逐漸增大時,會被訪問的伺服器造成很大的壓力,甚至有可能會崩潰。換句話說,伺服器不喜歡有人抓取自己的資料,那麼網站方面就會針對這些爬蟲者,採取一些反爬策略。
伺服器第一種識別爬蟲的方式就是通過檢查連線的useragent來識別到底是瀏覽器訪問,還是程式碼訪問。如果是程式碼訪問的話,訪問量增大時,伺服器就會直接封掉來訪IP。
那麼應對這種初級的反爬機制,我們應該採取何種措施?
在進行訪問時,我們在開發者環境下不僅可以找到URL、Form Data、還可以在request headers中構造瀏覽器的請求頭,封裝自己。伺服器識別瀏覽器的訪問方式就是判斷keywor是否為Request headers 下的User-Agent。我們只需要構造這個請求頭的引數。建立請求頭部資訊即可,程式碼如下:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'AppleWebKit/537.36 (KHTML,like Gecko) Chrome/43.0.2357.124 Safari/537.36'}
response =requests.get(url,headers=headers)
很多人會認為修改User-Agent太簡單,確實很簡單,但正常人一秒看一個圖,而爬蟲一秒可以看幾百張圖,那麼伺服器的壓力必然增大。就是說,如果在一個IP下批量訪問下載圖片,這個行為不符合正常人類的行為,肯定要被封IP。其原理也很簡單,就是統計每個IP的訪問頻率,此頻率超過閥值,就會返回一個驗證碼,如果真的是使用者訪問的話,使用者就會填寫,然後繼續訪問,如果是程式碼訪問的話,就會被封IP。
這個問題的解決方法有兩個,第一個就是常用的增設延時,每三秒抓取一次,程式碼如下:
import time
time.sleep(3)
其實,還有一個更重要的方法,那就是從本質解決問題。
不管如何訪問,伺服器的目的就是查出哪些為程式碼訪問,然後封鎖IP。解決辦法:為避免被封鎖IP,在資料採集之前經常會使用代理。當然requests也有相應的proxies屬性。
首先構建自己的代理IP池,將其以字典的形式賦值給proxies,然後傳輸給requests,程式碼如下:
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10.1080",
}
response = requests.get(url, proxies=proxies)