Python爬取視頻指南

前言

前兩天爾羽說讓我爬一下菜鳥窩的教程視頻,這次就跟大家來說說Python爬取視頻的經(jīng)驗(yàn)

正文

https://www.cniao5.com/

菜鳥窩上有很多教程視頻贡耽,但是這些視頻好像沒有直接的下載地址要门,而且有些教程視頻還是有期限的,那么問題就產(chǎn)生了
我看的速度比較慢而且視頻又很多,沒等我看完視頻就到期了怎么辦港庄?這時(shí)候?qū)懸粋€(gè)爬蟲將這些教程視頻下載下來就很好地解決了這個(gè)問題

當(dāng)然,對(duì)于某些視頻網(wǎng)站的VIP電影恕曲、視頻之類的鹏氧,一般情況下是無法在沒有開通VIP的情況下用爬蟲下載的,因?yàn)樯婕暗嚼鎲栴}佩谣,同時(shí)數(shù)據(jù)傳輸也是加密的把还;想要看的話還是得開通會(huì)員再進(jìn)行爬取

回到這次的目標(biāo)上來,我們要爬取的是

https://www.cniao5.com/course/lessons/10153

上面的24章茸俭,共計(jì)202個(gè)教程視頻


接下來我們來看看我們應(yīng)該如何獲取這些視頻
首先我們看一下這個(gè)界面的源代碼中沒有關(guān)于課程視頻的信息吊履,那么我們點(diǎn)進(jìn)去一個(gè)視頻看看

通過開發(fā)者工具我們可以看到左側(cè)都是這次加載視頻是動(dòng)態(tài)加載的信息,我們一個(gè)個(gè)來看
首先是url调鬓,我們可以看到這個(gè)鏈接是 Post 方式請(qǐng)求的(然鵝實(shí)際上再通過postman測(cè)試可以知道艇炎,并不用帶上什么參數(shù)請(qǐng)求,嚇唬人呢...)



這就是url返回的數(shù)據(jù)腾窝,其中 hd 缀踪、shd 代表高清居砖、超清的視頻類型,而當(dāng)你訪問這個(gè)鏈接后會(huì)自動(dòng)下載一個(gè) m3u8 文件驴娃,這介紹一下

m3u8 文件是指UTF-8編碼格式的M3U文件奏候。M3U文件是記錄了一個(gè)索引純文本文件,打開它時(shí)播放軟件并不是播放它托慨,而是根據(jù)它的索引找到對(duì)應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線播放

而我們下載視頻的方式就是通過向m3u8文件中的這些 .ts 的鏈接發(fā)送請(qǐng)求而下載一個(gè)個(gè) ts視頻流 (暫時(shí)這么稱呼)

下一個(gè)就是 chapters 鼻由,這里呢則是包含了所有24章視頻的一些基本信息

注意這里的 vid 參數(shù),之后我們會(huì)用到


這個(gè)就是網(wǎng)頁(yè)上加載的m3u8 文件

十一

這看似亂碼的ts文件下載下來后就是一個(gè)幾秒鐘的視頻了

十二

而我們最后要做的就是將這些 ts 文件合成為一個(gè) mp4 文件

十三
十四

那么如何來操作呢厚棵?

思路

通過請(qǐng)求 chapters 的鏈接獲取每一個(gè)章節(jié)中每一個(gè)lesson的播放 url 地址(就是返回中帶有 hd 蕉世、shd的),取出并請(qǐng)求 hd 的鏈接婆硬,下載m3u8文件狠轻,匹配m3u8文件中的每一個(gè) ts ,請(qǐng)求 ts 文件對(duì)應(yīng)的鏈接并下載到本地彬犯,最后合成為一個(gè)mp4視頻

來跟著代碼看一下
首先小編是在本地先用代碼創(chuàng)建好最終合成視頻的存放的空文件夾以便訪問


十五
十六
def mkd():
    for i in range(1, 25):
        finalpath = 'D:\\Python\\PycharmProject\\FinalCniao5\\{}'.format(i)
        # 判斷路徑文件是否存在向楼,不存在則創(chuàng)建
        f = os.path.exists(finalpath)
        if not f:
            os.makedirs(finalpath)
            print('make file success...')
        else:
            print('file already exists...')

接著創(chuàng)建對(duì)應(yīng)章節(jié)的文件夾

# 防止 requests 開得太多
s = requests.session()
r_chapters = s.get('https://www.cniao5.com/api/v1/course/10153/chapters')
json_chapters = r_chapters.json()
# print(json_chapters)
for chapter in json_chapters:
    # 每一個(gè)章節(jié)
    chapter_name = chapter['bsort']
    print(chapter_name)
    # 根據(jù)課程數(shù)創(chuàng)建對(duì)應(yīng)的課程文件夾
    path1 = self.file_path1.format(chapter_name)  
    f = os.path.exists(path1)
    if not f:
        os.makedirs(path1)
        print('make file success...')
    else:
        print('file already exists...')

對(duì)章節(jié)中的每一個(gè)課程,獲取其 id谐区、key湖蜕、file_id 創(chuàng)建對(duì)應(yīng)的課程文件夾(用來保存ts文件)

for lessons in chapter['lessons']:
    # 章節(jié)下的每一個(gè)課程
    lessons_name = 'lessons' + str(lessons['bsort'])
    # 獲取其id
    video_id = lessons['video_info']['vid']
    # 獲取 key
    key = lessons['key']
    # 后面用到
    file_id = lessons['video_info']['file_id']
    print(lessons_name, video_id)
    # 每個(gè)視頻創(chuàng)建一個(gè)視頻id的文件夾
    path = 'D:\\Python\\PycharmProject\\Cniao5\\{}\\{}'.format(chapter_name, lessons_name)
    f = os.path.exists(path)
    # 基于中斷后,創(chuàng)建文件時(shí)判斷宋列,若存在該文件夾則跳過對(duì)該視頻的下載昭抒,若不存在則繼續(xù)

對(duì)于之后則需要分為兩種情況,我不知道菜鳥窩是怎么想的炼杖,你可以看到對(duì)于有的視頻 vid 有具體的數(shù)值灭返,有的則是 0


2019-01-02_225429.png
2019-01-02_225453.png
2019-01-02_225509.png

也就是說對(duì)于 vid 有值的我們可以很容易構(gòu)造 url 鏈接從而獲取 m3u8 文件進(jìn)而下載 ts 視頻;但是對(duì)于沒有的來說就麻煩了坤邪,我們不能直接構(gòu)造這個(gè) url 鏈接
而對(duì)于這一類視頻則是這樣的


2019-01-02_225808.png
2019-01-02_225827.png
2019-01-02_225904.png

這類視頻不是通過 m3u8 來處理視頻的而是直接給了一個(gè) mp4 的地址熙含,那么也就是說對(duì)于 vid 為0的視頻我們需要訪問

https://playvideo.qcloud.com/getplayinfo/v2/1255567694/5285890782726972640

才可以拿到這個(gè)視頻,那么這個(gè) url 中后面的兩個(gè)參數(shù)是什么呢
這個(gè) 5285890782726972640 我們?cè)谏蠄D中可以發(fā)現(xiàn)就是之前提到的 file_id 這也是我們?yōu)槭裁匆@取的原因艇纺;而前面的1255567694你多看幾個(gè)就知道這個(gè)是不變的

而當(dāng)你去訪問這個(gè) MP4 的鏈接時(shí)菜鳥窩會(huì)告訴你怎静,你沒有權(quán)限請(qǐng)求這個(gè)鏈接,what黔衡?
而這時(shí)候你要知道所謂爬蟲就是模擬人對(duì)瀏覽器進(jìn)行的操作而獲取一定的結(jié)果消约,那么我們可以帶上請(qǐng)求頭來試試,小編是在用 fiddler 抓包后肯定了這一點(diǎn)员帮,最后測(cè)試發(fā)現(xiàn)只要帶上 header 中的 referer 就可以訪問

2019-01-02_230702.png
2019-01-02_231030.png

而這個(gè) referer 也是有講究的或粮,這個(gè)后面跟的奇怪的參數(shù)正是上述中你們都快忘了的 key ,這個(gè)是每個(gè) lesson 中都有的

所以對(duì)于這種情況捞高,之后只要把請(qǐng)求 MP4 鏈接后的內(nèi)容以二進(jìn)制方式保存就行

此外還要注意對(duì)于 ts 文件氯材,在請(qǐng)求時(shí)的前綴是
https://vodi97egsxf.vod.126.net/vodi97egsxf/

2019-01-02_231639.png

而在合并 ts 文件時(shí)渣锦,我用的是通過Python調(diào)用 windows 自帶的合成的命令來合成,但是需要注意合成時(shí)候的文件名一定按 001氢哮,002袋毙,...,010冗尤,...听盖,099,100...如此排列裂七;而如果按 1皆看,2,3背零,...腰吟,10,11徙瓶,...毛雇,99,100 則合并不會(huì)成功

所以在保存時(shí)就應(yīng)該注意指定文件的名稱即可

好了看到這里相信你應(yīng)該有了一個(gè)基本的認(rèn)識(shí)了侦镇,需要完整源碼的也可以聯(lián)系小編

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灵疮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壳繁,更是在濱河造成了極大的恐慌震捣,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮趋,死亡現(xiàn)場(chǎng)離奇詭異伍派,居然都是意外死亡江耀,警方通過查閱死者的電腦和手機(jī)剩胁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祥国,“玉大人昵观,你說我怎么就攤上這事∩嘞。” “怎么了啊犬?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)壁查。 經(jīng)常有香客問我觉至,道長(zhǎng),這世上最難降的妖魔是什么睡腿? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任语御,我火速辦了婚禮峻贮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘应闯。我一直安慰自己纤控,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布碉纺。 她就那樣靜靜地躺著船万,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骨田。 梳的紋絲不亂的頭發(fā)上耿导,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音盛撑,去河邊找鬼碎节。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抵卫,可吹牛的內(nèi)容都是我干的狮荔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼介粘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼殖氏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姻采,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤雅采,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后慨亲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婚瓜,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年刑棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巴刻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛉签,死狀恐怖胡陪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碍舍,我是刑警寧澤柠座,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站片橡,受9級(jí)特大地震影響妈经,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一吹泡、第九天 我趴在偏房一處隱蔽的房頂上張望录煤。 院中可真熱鬧,春花似錦荞胡、人聲如沸妈踊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)廊营。三九已至,卻和暖如春萝勤,著一層夾襖步出監(jiān)牢的瞬間露筒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工敌卓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慎式,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓趟径,卻偏偏與公主長(zhǎng)得像瘪吏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜗巧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 接一位微信好友所托叫爬取騰訊視頻的原地址掌眠,以此可以去掉煩人的廣告。雖有一些插件可以支持幕屹,但代碼擼出來帶勁點(diǎn)吧蓝丙。。望拖。...
    FengZai8閱讀 4,224評(píng)論 3 4
  • 《裕語言》速成開發(fā)手冊(cè)3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 26,626評(píng)論 5 19
  • 轉(zhuǎn)發(fā)自 2016-10-27李智文騰訊Bugly 概要 分享內(nèi)容: 互聯(lián)網(wǎng)內(nèi)容載體變遷歷程渺尘,文字——圖片/聲音——...
    樹懶啊樹懶閱讀 11,984評(píng)論 3 123
  • 不知道從什么時(shí)候開始,有點(diǎn)喜歡禪繞畫说敏。它們都是由簡(jiǎn)簡(jiǎn)單單的元素隨心堆積起來鸥跟,形成的一幅看似復(fù)雜的表達(dá)心情的圖案。這...
    花開錯(cuò)季閱讀 374評(píng)論 1 2
  • 一直持續(xù)霧霾好幾天了像云,今天霧霾加小雪锌雀,天空終于有些放亮了蚂夕。但然這雪能把空氣凈化干凈迅诬。
    花間香茶閱讀 277評(píng)論 0 0