運用phantomjs無頭瀏覽器破解四種反爬蟲技術

在與反爬蟲的對抗中,我們爬蟲的大招有兩個,其一是多種ip跟換方式(例如adsl|代理|tor等請參看之前的文章)。其二是無頭瀏覽器,使用自動化的技術來進行自動數據抓取,模擬滑鼠與鍵盤事件,可以用於破解驗證碼,js解析,詭異的模糊數據這類型的反爬蟲技術..文中源代碼存放在github開源項目中 歡迎star github.com/luyishisi/An

0 目錄:

  1. phantomjs原理說明
  2. 牛刀小試
  3. 破解基礎的js解析能力限制
  4. 破解採用nodisplay來隨機化網頁源碼
  5. 破解簡單的圖片文字相互替代
  6. 破解拖動驗證碼

1 phantomjs原理說明:

無頭瀏覽器不是什麼鬧鬼的東西,他也稱為無界面瀏覽器,他本身是用來做自動化測試的,不過似乎更適合用來搞爬蟲。他的官方網址是:phantomjs.org/quick-sta 如果想看他的中文api的話我整理了一份資料在:urlteam.org/2016/08/pha

下載之後會得到個一個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這個屬性,讓顯示的後台代碼十分混亂,但是前台呈現給用戶的數據並不會混亂比如: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進行圖文轉換。大致如下:

  1. 安裝PIL中image庫
  2. 遍歷每一個像素點,做一個銳化加強對比去除雜色和二值化,保存改良過的圖片。
  3. 調用pytesseract 運行函數:print pytesseract.image_to_string(Image.open(『end.png』))
  4. 如果你的圖像處理的比較清晰就可以輕鬆識別出圖文。

注意好切割圖片,不要整個圖片一次性的識別,最好能單獨切出一個ip。然後進行識別,準確性高。主要的難度其實是安裝環境和圖片優化比較麻煩。

5 破解簡單的圖片文字相互替代

這部分和上個問題也相當重合:相當於是對方把一些數據變成圖片,而我們則是下載這些圖片然後進行圖片優化,然後解析比如:ip.zdaye.com/

當抓取他的頁面的時候,ip好抓,但是埠號是圖片的。下載圖片之後還是需要做好上訴轉換。識別起來準確性也是95%+

識別的源代碼可以看github : github.com/luyishisi/An

這方面給三個傳送門自行學習:

  • 簡單數字去噪二值化識別:verydemo.com/demo_c122_
  • 驗證碼破解原理:udn.yyuap.com/doc/ae/92
  • 機器學習式破解:91ri.org/13043.html

6 破解拖動驗證碼

破解只是興趣而已,總不能砸別人飯碗。只是提一下思路:

  1. 截取觸發前後的驗證碼圖片。運用變化點作為二值化可以得出需要偏移的像素點
  2. phantomjs控制滑鼠進行拖動
  3. 唯一困難的就是拖動的軌跡不能是太機器化,否則你的驗證碼會被吃掉。
  4. 還有別人使用ajax等跳過請求,也是一種方式不過也挺難的。
  5. 請勿私信問代碼。沒留。

7 總結:

與反爬蟲進行鬥爭,如果你能熟練使用上訴的技巧就基本無往而不利了。

使用adsl | tor | 代理 | 可以讓對方無法針對ip封禁,使用header的欄位偽造,算是入門防止對方識別並返回假數據。使用phantoms則基本對方不能阻止你的訪問。畢竟是真實的瀏覽器發起的請求。現在還能存在的漏洞就是可以通過一些特性檢測識別出你使用的是phantoms瀏覽器然後阻止,能實現這個的網站也不多。另外還有困難的就是複雜的驗證碼破解的,只有機器學習一條路了。

本文僅作技術分享,不公布破解源代碼,希望讀者可以互相學習,增長技藝。

原創文章,轉載請註明: 轉載自URl-team

本文鏈接地址:運用phantomjs無頭瀏覽器破解四種反爬蟲技術

文中源代碼存放在github開源項目中 歡迎star github.com/luyishisi/An


推薦閱讀:

極驗滑動驗證碼破解分析
12306 的圖形驗證碼是否更難破解?
刷票軟體或者秒殺軟體是如何破解驗證碼的?
簡訊驗證碼被亂髮怎麼辦?

TAG:Python | 爬虫 | 验证码 |