1. 程式人生 > >爬蟲攻防-初學篇1

爬蟲攻防-初學篇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)