在與反爬蟲的對抗中,我們爬蟲的大招有兩個,其一是多種ip跟換方式(例如adsl|代理|tor等請參看之前的文章)。其二是無頭瀏覽器,使用自動化的技術來進行自動資料抓取,模擬滑鼠與鍵盤事件,可以用於破解驗證碼,js解析,詭異的模糊資料這型別的反爬蟲技術。
1 phantomjs原理說明:
無頭瀏覽器不是什麼鬧鬼的東西,他也稱為無介面瀏覽器,他本身是用來做自動化測試的,不過似乎更適合用來搞爬蟲。他的官方網址是:http://phantomjs.org/quick-start.html 如果想看他的中文api的話我整理了一份資料在:這裡。
下載之後會得到個一個exe檔案,linux下也一樣。在命令列則是在該檔案的目錄下輸入 phantomjs 就算是用該瀏覽器啟動你的爬蟲程式碼。
2 牛刀小試
下列js程式碼就是需要執行phantomg
儲存為request.js檔案。然後在當前目錄下命令列執行:就會返回整個網頁的原始碼,然後爬蟲你懂得的小解析一下就可以抽取出xici代理的免費ip了。
1 |
phantomjs request.js http://www.xicidaili.com/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/*********************************** code:javascript system:win || linux auther: luyi mail : 543429245@qq.com github: luyishisi blog: https://www.urlteam.org date:2016.9.12 邏輯說明:使用phantomjs無介面瀏覽器作為操作平臺,破解對方針對js解析的反爬蟲辨別 ************************************/ var page = require('webpage').create(), system = require('system'), address; address = system.args[1]; //init and settings page.settings.resourceTimeout = 30000 ; page.settings.XSSAuditingEnabled = true ; //page.viewportSize = { width: 1000, height: 1000 }; page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'; page.customHeaders = { "Connection" : "keep-alive", "Cache-Control" : "max-age=0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6", }; page.open(address, function() { console.log(address); console.log('begin'); }); //載入頁面完畢執行 page.onLoadFinished = function(status) { console.log('Status: ' + status); console.log(page.content); phantom.exit(); }; |
3 破解基礎的js解析能力限制
遇到過兩種其一是該網站故意用js做了延遲返回真實資料,先返回一部分,之後再進行幾秒的js能力驗證後載入。另外一種則檢測是無js處理能力當即就給出拒絕碼,這型別就是xici代理的方式,如果你用python直接傳送請求,無論是scrapy還是requests,都會返回500錯誤。如下:
但是如果你使用上面牛刀小試的程式碼,在python中用系統指令呼叫這行命令,則相當於用phantomjs來執行請求操作,原始碼就會直接返回。可以用python用下列
1 2 3 |
common = 'c://phantomjs/phantomjs' + ' requests.js '+ temp_url str_body = str(os.popen(common).read()) print str_body |
之後就是字串處理,很簡單不廢話了。
4 破解採用display:none來隨機化網頁原始碼
總所周知,我們在爬蟲中想要選出某個需要的資料,可以使用xpath或者正則這類字串的操作,然而必然需要對方的網站有一定規律,才能合理的抽出資料,因此也有使用nodisplay這個屬性,讓顯示的後臺程式碼十分混亂,但是前臺呈現給使用者的資料並不會混亂比如:http://proxy.goubanjia.com/
如圖,我使用chrome來檢測這ip部分的原始碼的時候就會出現後臺亂七八糟的顯示情況,有網站還會隨機類的名字,讓更加不好捕捉。
然後破解方式也曲線救國。
破解思路:(避免查水錶不釋出原始碼)
使用phantomjs的截圖功能。(具體查官方api。並不困難,其樣例程式碼中rasterize.js 這一篇也是實現截圖的功能)例如:
1 2 |
page.evaluate(function() { document.body.bgColor = 'white';});//背景色設定為白。方便二值化處理 page.clipRect = { top: 441, left: 364, width: 300, height: 210 };//指定截圖區域。座標使用第四象限 |
然後單獨取出ip和port部分的圖片。使用python進行圖文轉換。大致如下:
- 安裝PIL中image庫
- 遍歷每一個畫素點,做一個銳化加強對比去除雜色和二值化,儲存改良過的圖片。
- 呼叫pytesseract 執行函式:print pytesseract.image_to_string(Image.open(‘end.png’))
- 如果你的影象處理的比較清晰就可以輕鬆識別出圖文。
注意好切割圖片,不要整個圖片一次性的識別,最好能單獨切出一個ip。然後進行識別,準確性高。主要的難度其實是安裝環境和圖片優化比較麻煩。
5 破解簡單的圖片文字相互替代
這部分和上個問題也相當重合:相當於是對方把一些資料變成圖片,而我們則是下載這些圖片然後進行圖片優化,然後解析比如:http://ip.zdaye.com/
當抓取他的頁面的時候,ip好抓,但是埠號是圖片的。下載圖片之後還是需要做好上訴轉換。識別起來準確性也是95%+
這方面給三個傳送門自行學習:
- 簡單數字去噪二值化識別:http://www.verydemo.com/demo_c122_i2907.html
- 驗證碼破解原理:http://udn.yyuap.com/doc/ae/920457.html
- 機器學習式破解:https://www.91ri.org/13043.html
6 破解拖動驗證碼
破解只是興趣而已,總不能砸別人飯碗。只是提一下思路:
- 擷取觸發前後的驗證碼圖片。運用變化點作為二值化可以得出需要偏移的畫素點
- phantomjs控制滑鼠進行拖動
- 唯一困難的就是拖動的軌跡不能是太機器化,否則你的驗證碼會被吃掉。
- 還有別人使用ajax等跳過請求,也是一種方式不過也挺難的。
- 請勿私信問程式碼。沒留。
7 總結:
與反爬蟲進行鬥爭,如果你能熟練使用上訴的技巧就基本無往而不利了。
使用adsl | tor | 代理 | 可以讓對方無法針對ip封禁,使用header的欄位偽造,算是入門防止對方識別並返回假資料。使用phantoms則基本對方不能阻止你的訪問。畢竟是真實的瀏覽器發起的請求。現在還能存在的漏洞就是可以通過一些特性檢測識別出你使用的是phantoms瀏覽器然後阻止,能實現這個的網站也不多。另外還有困難的就是複雜的驗證碼破解的,只有機器學習一條路了。
本文僅作技術分享,不公佈破解原始碼,希望讀者可以互相學習,增長技藝。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!