Python爬取鬼吹燈2(周建龍)(PyV8解析js)


Python爬取鬼吹燈2有聲小說(PyV8解析js)


偶然在一個網站http://www.ting56.com/ 上面看到有鬼吹燈2的周建龍老師的作品,又不想在電腦上面聽,於是就想用python爬下來傳到手機上面聽。

此篇博客僅供學習交流

版本:python2.7.9,win7,用python3的稍微修改下語法吧


首先,找到鬼吹燈2頁面http://www.ting56.com/mp3/4704.html

這里寫圖片描述

查看頁面源碼
這里寫圖片描述
然后利用re正則表達式提取每集的播放頁面的url

這里寫圖片描述
提取結果:

這里寫圖片描述

現在已經得到每集的播放頁面了,在瀏覽器打開網址http://www.ting56.com/vedio/4704-0-0.html就可以進入播放頁面了,按下鍵盤上的F12鍵,查看頁面的dom樹,可以看到播放器的位置對應的dom樹中的位置如下:

這里寫圖片描述
可以看到,播放器位於dom中的結構層次如下:
<body><div class=”play”><div class=”left”><div class=”bofangqi”><audio>

點開<audio>可以看到每集資源的網址:

這里寫圖片描述

可以看到第一集的網址:
http://audio.xmcdn.com/group16/M03/74/E7/wKgDbFX-nrvhs94WAJNpjNPBR1I503.m4a
對比下前三集的網址
第一集:
http://audio.xmcdn.com/group16/M03/74/E7/wKgDbFX-nrvhs94WAJNpjNPBR1I503.m4a
第二集:
http://audio.xmcdn.com/group12/M03/74/02/wKgDW1X-nyLxOoezAKXvanlGCbQ423.m4a
第三集:
http://audio.xmcdn.com/group11/M09/81/1E/wKgDbVX-nzvgLCC1AKPQpN1m-dg284.m4a
對比可以發現這三個url都沒有規律,那么就只有在每集的html中的解析出來
現在查看每集播放頁面的html源碼

這里寫圖片描述
仔細觀察就會發現,並沒有找到audio標簽,說明audio標簽是在html文檔加載完成之后創建的,或者是在文檔的加載過程當中由javascript創建的。於是在html頁面尋找和audio有關的script標簽,發現沒有找到,於是尋找和player有關的標簽:

這里寫圖片描述
點擊上面的js地址,瀏覽器自動打開:

這里寫圖片描述

現在回到dom樹:

這里寫圖片描述

可以發現在audio標簽的上面有一個script標簽,標簽里的內容是:
var param=getAspParas(‘.html’);viewplay()
現在在剛剛打開的js頁面中搜索getAspParas,viewplay這兩個函數

這里寫圖片描述
這里寫圖片描述

在viewplay函數中使用了ShowPlay,於是搜索ShowPlay,又發現了m4a,再看看我們的資源的url:
http://audio.xmcdn.com/group16/M03/74/E7/wKgDbFX-nrvhs94WAJNpjNPBR1I503.m4a
發現格式也是m4a,查看ShowPlay函數,可以看到case “m4a”下面使用了Player_Html5(a,b,c);
於是繼續搜索Player_Html5函數

這里寫圖片描述

仔細看看上面圖片的內容中的Htmls,可以看到這個Htmls字符串的內容就是dom樹中的<audio>標簽,這里的資源的url就是Player_Html中的url變量,然后在ShowPlay函數中發現資源url變量是b,再網上層函數viewplay尋找資源url,發現viewplay中是datas[0],但是viewplay函數中並沒有傳遞datas參數,那么datas應該是全局變量,於是在js頁面中查看定義的全局變量:

這里寫圖片描述

發現並沒有找到datas變量,既然在js文件中沒有定義,那么應該在html頁面中的<script>標簽里有定義,於是在html頁面里搜索datas:

這里寫圖片描述

果然發現了datas變量,但是這個變量不是直接定義的,而是用FonHen_JieMa函數生成的,於是在js頁面里搜索FonHen_JieMa函數:

這里寫圖片描述
找到了!看來要想獲得資源url,就是要生成datas變量,資源url就是datas[0],所以就在於函數FonHen_JieMa,但是這是javascript函數,直接用python實現還是太麻煩,而PyV8就可以執行javascript函數:

先利用PyV8生成執行javascript腳本:

import PyV8
def get_js_fun():
ctxt = PyV8.JSContext()
ctxt.enter()
ctxt.eval("""
function FonHen_JieMa(u){
var tArr = u.split("*");
var n = tArr.length;
var x = '';
for(i=1;i<n;i++){
x += String.fromCharCode(tArr[i]);
}
return x;
}
// get url
function get_url(u){
x = FonHen_JieMa(u)
url = x.split('&')[0]
return url
}
"""
)
return ctxt.locals.get_url

返回的get_url就可以直接在python中調用了:

這里寫圖片描述
現在已經可以播放頁面的html中解析資源url了,現在利用urllib. urlretrieve下載每集的文件了!

這里寫圖片描述
程序爬取結果:

這里寫圖片描述


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com