python爬蟲學習筆記 3 (動態HTML處理和機器圖像識別)

python爬蟲學習筆記 3 (動態HTML處理和機器圖像識別)

python爬蟲學習筆記 1.1(通用爬蟲和聚焦爬蟲)
python爬蟲學習筆記 1.2 ( HTTP和HTTPS )
python爬蟲學習筆記 1.3 str和bytes的區別
python爬蟲學習筆記 1.4 (Request簡單使用)request安裝
python爬蟲學習筆記 1.5 (Requests深入)
python爬蟲學習筆記 1.6 (HTTP/HTTPS抓包工具-Fiddler)
python爬蟲學習筆記 1.7 (urllib模塊的基本使用)
python爬蟲學習筆記 1.8 (urllib:get請求和post請求)
python爬蟲學習筆記 1.9 (Handler處理器 和 自定義Opener)
python爬蟲學習筆記 2 (非結構化數據和結構化數據提取)
python爬蟲學習筆記 2.1 (正則表達式re模塊)
python爬蟲學習筆記 2.2 (使用正則表達式得爬蟲得簡單案例)
python爬蟲學習筆記 2.3 (XPath與lxml類庫)
python爬蟲學習筆記 2.4 (使用Xpath得案例)
python爬蟲學習筆記 2.5 (json與JsonPath)
python爬蟲學習筆記 2.6 (糗事百科案例)
python爬蟲學習筆記 2.7 (多線程爬蟲案例(初步瞭解))
python爬蟲學習筆記 2.8 (beautifulsoup4)
python爬蟲學習筆記 2.9 (使用bs4得案例)
python爬蟲學習筆記 3 (動態HTML處理和機器圖像識別)
python爬蟲學習筆記 3.1 (動態HTML介紹)
python爬蟲學習筆記 3.2 (Selenium與PhantomJS)
python爬蟲學習筆記 3.#(番外) (selenium和chromedriver使用中得問題)

爬蟲(Spider),反爬蟲(Anti-Spider),反反爬蟲(Anti-Anti-Spider) 之間恢宏壯闊的鬥爭…

Day 1
小莫想要某站上所有的電影,寫了標準的爬蟲(基於HttpClient庫),不斷地遍歷某站的電影列表頁面,根據 Html 分析電影名字存進自己的數據庫。

這個站點的運維小黎發現某個時間段請求量陡增,分析日誌發現都是 IP(xxx.xxx.xxx.xxx)這個用戶,並且 user-agent 還是 Python-urllib/2.7 ,基於這兩點判斷非人類後直接在服務器上封殺。

Day 2
小莫電影只爬了一半,於是也針對性的變換了下策略:1. user-agent 模仿百度(“Baiduspider…”),2. IP每爬半個小時就換一個IP代理。

小黎也發現了對應的變化,於是在服務器上設置了一個頻率限制,每分鐘超過120次請求的再屏蔽IP。 同時考慮到百度家的爬蟲有可能會被誤傷,想想市場部門每月幾十萬的投放,於是寫了個腳本,通過 hostname 檢查下這個 ip 是不是真的百度家的,對這些 ip 設置一個白名單。

Day 3
小莫發現了新的限制後,想着我也不急着要這些數據,留給服務器慢慢爬吧,於是修改了代碼,隨機1-3秒爬一次,爬10次休息10秒,每天只在8-12,18-20點爬,隔幾天還休息一下。

小黎看着新的日誌頭都大了,再設定規則不小心會誤傷真實用戶,於是準備換了一個思路,當3個小時的總請求超過50次的時候彈出一個驗證碼彈框,沒有準確正確輸入的話就把 IP 記錄進黑名單。

Day 4
小莫看到驗證碼有些傻臉了,不過也不是沒有辦法,先去學習了圖像識別(關鍵詞 PIL,tesseract),再對驗證碼進行了二值化,分詞,模式訓練之後,總之最後識別了小黎的驗證碼(關於驗證碼,驗證碼的識別,驗證碼的反識別也是一個恢弘壯麗的鬥爭史…),之後爬蟲又跑了起來。

小黎是個不折不撓的好同學,看到驗證碼被攻破後,和開發同學商量了變化下開發模式,數據並不再直接渲染,而是由前端同學異步獲取,並且通過 JavaScript 的加密庫生成動態的 token,同時加密庫再進行混淆(比較重要的步驟的確有網站這樣做,參見淘寶和微博的登陸流程)。

Day 5
混淆過的加密庫就沒有辦法了麼?當然不是,可以慢慢調試,找到加密原理,不過小莫不準備用這麼耗時耗力的方法,他放棄了基於 HttpClient的爬蟲,選擇了內置瀏覽器引擎的爬蟲(關鍵詞:PhantomJS,Selenium),在瀏覽器引擎運行頁面,直接獲取了正確的結果,又一次拿到了對方的數據。

小黎:…

爬蟲與發爬蟲的鬥爭還在繼續…
通常情況下,在爬蟲與反爬蟲的對弈中,爬蟲一定會勝利。

換言之,只要人類能夠正常訪問的網頁,爬蟲在具備同等資源的情況下就一定可以抓取到。

關於爬蟲部分一些建議:
儘量減少請求次數,能抓列表頁就不抓詳情頁,減輕服務器壓力,程序員都是混口飯吃不容易。

不要只看 Web 網站,還有手機 App 和 H5,這樣的反爬蟲措施一般比較少。

實際應用時候,一般防守方做到根據 IP 限制頻次就結束了,除非很核心的數據,不會再進行更多的驗證,畢竟成本的問題會考慮到。

如果真的對性能要求很高,可以考慮多線程(一些成熟的框架如 Scrapy都已支持),甚至分佈式…

關於反爬蟲部分的一些建議:
這篇文章就夠了:攜程技術中心 - 攜程酒店研發部研發經理崔廣宇 <爬蟲與反爬蟲> 技術分享

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章