今天給你們帶來的是一個論壇網站,牛仔俱樂部-努比亞社區,html
網址爲:https://bbs.nubia.cn/
python
若是你想要獲取這個網站的源代碼的話,必需要先獲取一個 cookie,其字段名爲:acw_sc__v2,你是否是不相信?爬取網站還須要獲取 cookie 值才能夠?說實話,我剛開始爬的時候我也不相信,直到我運行請求代碼,一看,給我返回這個:git
這是什麼啊,一段 JavaScript 代碼,很容易地就能夠看到下面有個 setCookie 的方法,這不就是我剛纔說的須要獲取的 cookie 的字段嗎?若是你看到這,留下了沒技術的眼淚的話?別怕,我勸你擦乾眼淚,繼續看下去,你會發現新大陸!github
咱們首先在 chrome 看看這裏網站的請求先,打開 chrome,打開開發者工具,輸入網址:https://bbs.nubia.cn/(須要先清除cookie),你能夠看到下面這個東西:chrome
是否是呆住了?這是debug,明明什麼都沒按啊,若是你按跳出這個函數的話,能夠暫時跳出,不過等到運行多幾行代碼的話,他會運行到一個無限執行 debug 的函數,讓你永無翻身之日,一直在 debug 轉動。瀏覽器
那怎麼辦?莫慌,其實這裏運行代碼就是咱們在上面第一次請求這個網站給咱們返回的 JavaScript 代碼,那麼咱們能夠把剛纔響應回來的代碼複製出來,寫成 html 文件,使用 chrome 瀏覽器打開。cookie
若是你把 那段代碼展開的話,打開的時候就會無限進行刷新,直到瀏覽器崩潰。ide
這裏是代碼在執行過程當中使用正則檢測你把代碼展開了,因此就會無限進行刷新,這叫作內存爆破,是否是又 get 新知識?函數
因此咱們直接原樣複製進去,在打開 chrome 進行調試。工具
可是,當咱們一打開 開發者工具,仍是會馬上彈出 debug 頁面
這又是爲何呢?咱們根據右邊的調用棧看看是怎樣執行的,查看調用棧,能夠看到這個函數:
若是你是學習過 JavaScript 的話,很容易就知道 setInterval 是個設置每隔一段時間就執行相應操做的函數。因此他這裏每隔一段時間就會執行函數,用於檢測用戶有沒有打開開發者工具,這個太猛了,具體原理我如今還不知道,若是你知道的不防在下面留言分享給你們。
知道了,以後,咱們直接在原文件找到這個定時設置語句給刪除就能夠了。刪除了以後,仍是會執行這個 debug 語句,咱們繼續把這個執行給刪除。
如今就不會出現 debug 了,可是有一個新的問題,出現,頁面會不斷刷新,也是一個定時操做,這時該怎麼辦呢?由於是一個刷新操做,每次刷新必然會執行裏面的 JavaScript 代碼,因此不妨隨便打個斷點,看看調用棧,這裏我比較有經驗,因此就在這裏打了個斷點
由於這個 relaod 函數就是一個刷新頁面的函數,因此直接在這裏點擊,能夠確定這個函數會被執行,若是你打的斷點沒有被執行,能夠多打幾個斷點,總會被執行的,這個不須要擔憂。
當斷點被執行到時,你就能夠查看右邊的調用棧了,很容易就找到這個地方
這個 setTimeout 也是一個定時執行,不過他只執行一次,至關於定時炸彈。又由於每次都會 reload,因此這個炸彈在每次刷新的時候就會繼續新的炸彈,纔會有剛纔的不斷刷新,瞭解了原理以後,那麼咱們就把這個 setTimeout 給刪除便可。
這時候,再次刷新網頁,就什麼阻力都沒有了,是否是感受來到這一步不容易?哈哈,爬蟲就是這樣,與反爬死坑到底,不服就幹,看誰更有耐心。
這時候終於能夠開始咱們的調試之旅了,由於知道這個 JavaScript 執行以後會返回一個 cookie 值,因此接下來就是尋找生成的位置,若是你熟練的話,能夠利用二分法來找,具體怎樣找本身探索,由於我也不是很熟練。若是你不熟練的話,能夠學我同樣,由於代碼就幾百行,能夠直接從第一行開始找。
若是你認真找,不用多久,很快就能夠發現這個,這個 arg2 就是咱們須要找的 cookie 的值,因此接下來能夠在這裏打斷點,看看具體的執行步驟。
能夠看到,經過傳一參數,使用這個函數就能夠完成加密了,根據這個函數的函數名是 hexXor,能夠知道是一個 Xor 加密,想知道原理的能夠看看這篇文章:http://www.ruanyifeng.com/blog/2017/05/xor.html,咱們也能夠根據 JavaScript 代碼直接轉成 python 代碼也能夠,不難。
經過調試發現,這裏面須要兩個參數,一個是加密的信息,一個是key
加密的信息是在很容易就發現,是從這裏生成的
因此也能夠在這裏打斷點,再刷新一下,就能夠看到加密信息是由這個函數生成的。
這裏的 JavaScript 代碼也很容易,也能夠直接翻譯成 python 代碼。而其參數須要的是 arg1,這個變量在代碼第一行就聲明瞭,因此在獲取的時候,可使用正則獲取。
接着就是 key 的獲取了。直接搜索這個 key 的變量,很容易就找到這個
加密函數很長,可是也是能夠本身轉 python的,難度也不大。
在通過我屢次測試以後,發現這個 key 是固定的,因此無需本身實現這個函數,能夠直接取這個值便可。
如今大功告成,已經能夠得到所須要的 cookie 值了,是否是以爲很是難以想象,一路走過來都不容易。
不過這裏有個 bug,就是有時仍是獲取到 JavaScript 代碼,可是多運行幾回仍是能夠正常獲取到 html 源碼的,因爲本身只是獲取這個值而已,能成功便可,因此沒有研究下去,若是你知道緣由,也能夠在留言區告訴我。
最後總結下遇到各類挑戰:
代碼展開會無限刷新,內存爆破,若是你認真本身調試的話,會發現裏面有幾個正則,有些是用來匹配函數的,用於判斷有沒有展開代碼的,展開了就表明有人想搞代碼了,因此就會無限刷新。
設置定時與刷新網頁,使網頁無限刷新。這個對咱們來講調試問題不大,畢竟每次刷新咱們均可以斷點調試代碼
設置定時檢測有沒有打開開發者工具,這個纔是最厲害的,檢測到的話就胡無限 debug。
最後就沒有啦,若是你須要源碼的話,能夠在個人 GitHub 上獲取,地址爲:https://github.com/SergioJune/Spider-Crack-JS/tree/master/nubiya_bbs
若是對你有用的話,還請給個star,我會一直更新下去,你有什麼須要破解的網站也能夠提issue。
目前還更新了拼多多的搜索參數 anti_content 和另外一個更加厲害的 cookie 反爬,也是屬於這個 Incapsula-CDN 的,難度比今天這個難上很多,因爲我的問題,暫時只能每週講解一個,請諒解。
原創不易,但願能給個贊,給個star,支持下繼續寫下去。
本文僅用於交流學習,請勿用於非法用途,後果自負!
我的首發地址:請求網頁時,怎麼給我返回了一段 JavaScript 代碼