運用phantomjs無頭瀏覽器破解四種反爬蟲技術
在與反爬蟲的對抗中,我們爬蟲的大招有兩個,其一是多種ip跟換方式(例如adsl|代理|tor等請參看之前的文章)。其二是無頭瀏覽器,使用自動化的技術來進行自動數據抓取,模擬滑鼠與鍵盤事件,可以用於破解驗證碼,js解析,詭異的模糊數據這類型的反爬蟲技術..文中源代碼存放在github開源項目中 歡迎star https://github.com/luyishisi/Anti-Anti-Spider
0 目錄:
- phantomjs原理說明
- 牛刀小試
- 破解基礎的js解析能力限制
- 破解採用nodisplay來隨機化網頁源碼
- 破解簡單的圖片文字相互替代
- 破解拖動驗證碼
1 phantomjs原理說明:
無頭瀏覽器不是什麼鬧鬼的東西,他也稱為無界面瀏覽器,他本身是用來做自動化測試的,不過似乎更適合用來搞爬蟲。他的官方網址是:http://phantomjs.org/quick-start.html 如果想看他的中文api的話我整理了一份資料在:https://www.urlteam.org/2016/08/phantomjs-api-%E4%B8%AD%E6%96%87%E7%89%88-%E6%97%A0%E7%95%8C%E9%9D%A2%E6%B5%8F%E8%A7%88%E5%99%A8-js%E5%A4%84%E7%90%86%E7%9A%84%E7%88%AC%E8%99%AB/
下載之後會得到個一個exe文件,linux下也一樣。在命令行則是在該文件的目錄下輸入 phantomjs 就算是用該瀏覽器啟動你的爬蟲代碼。
2 牛刀小試
下列js代碼就是需要運行phantomg
保存為request.js文件。然後在當前目錄下命令行運行:就會返回整個網頁的源碼,然後爬蟲你懂得的小解析一下就可以抽取出xici代理的免費ip了。
phantomjs request.js http://www.xicidaili.com//***********************************code:javascriptsystem:win || linuxauther: mail : **@qq.comgithub: blog: https://www.urlteam.orgdate:2016.9.12邏輯說明:使用phantomjs無界面瀏覽器作為操作平台,破解對方針對js解析的反爬蟲辨別************************************/var page = require(webpage).create(), system = require(system), address;address = system.args[1]; //init and settingspage.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錯誤(後查明需要做好足夠的請求頭偽造也可以但是phantomjs本身自帶有所以可以及)。如下:
但是如果你使用上面牛刀小試的代碼,在python中用系統指令調用這行命令,則相當於用phantomjs來執行請求操作,源代碼就會直接返回。可以用python用下列
common = c://phantomjs/phantomjs + requests.js + temp_urlstr_body = str(os.popen(common).read())print str_body
之後就是字元串處理,很簡單不廢話了。
4 破解採用display:none來隨機化網頁源碼
總所周知,我們在爬蟲中想要選出某個需要的數據,可以使用xpath或者正則這類字元串的操作,然而必然需要對方的網站有一定規律,才能合理的抽出數據,因此也有使用nodisplay這個屬性,讓顯示的後台代碼十分混亂,但是前台呈現給用戶的數據並不會混亂比如:http://proxy.goubanjia.com/
如圖,我使用chrome來檢測這ip部分的源代碼的時候就會出現後台亂七八糟的顯示情況,有網站還會隨機類的名字,讓更加不好捕捉。
然後破解方式也曲線救國。
破解思路:(避免查水表不發布源代碼)
使用phantomjs的截圖功能。(具體查官方api。並不困難,其樣例代碼中rasterize.js 這一篇也是實現截圖的功能)例如:
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%+
識別的源代碼可以看github : https://github.com/luyishisi/Anti-Anti-Spider/tree/master/1.%E9%AA%8C%E8%AF%81%E7%A0%81
這方面給三個傳送門自行學習:
- 簡單數字去噪二值化識別: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瀏覽器然後阻止,能實現這個的網站也不多。另外還有困難的就是複雜的驗證碼破解的,只有機器學習一條路了。
本文僅作技術分享,不公布破解源代碼,希望讀者可以互相學習,增長技藝。
原創文章,轉載請註明: 轉載自URl-team
本文鏈接地址:運用phantomjs無頭瀏覽器破解四種反爬蟲技術
文中源代碼存放在github開源項目中 歡迎star https://github.com/luyishisi/Anti-Anti-Spider
推薦閱讀:
※極驗滑動驗證碼破解分析
※12306 的圖形驗證碼是否更難破解?
※刷票軟體或者秒殺軟體是如何破解驗證碼的?
※簡訊驗證碼被亂髮怎麼辦?