日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对中国大学MOOC课程视频批量下载的探索

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对中国大学MOOC课程视频批量下载的探索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

聲明:請尊重各大高校對慕課內(nèi)容的版權(quán),下載慕課視頻僅為方便自己學(xué)習(xí)使用,請勿肆意傳播或用于商業(yè)用途。一切因濫用下載所得慕課內(nèi)容所產(chǎn)生的法律問題本人概不負(fù)責(zé)。

中國大學(xué)MOOC是一個公益性質(zhì)的免費慕課平臺,由各大高校共享自己的課程內(nèi)容。雖然在這些慕課中有相當(dāng)大一部分是全程念ppt的敷衍之作,但是也不乏一些制作精良、講解用心的精品慕課。然而網(wǎng)易的這個HTML5播放器做得實在太爛,經(jīng)常會出現(xiàn)兩重聲音,倍速錯亂等各種bug,快進(jìn)快退也很不方便,非常影響觀看體驗。IDM自帶的流媒體探測功能雖然可以直接下載播放頁面中的慕課視頻,但是一集一集地下載費時費力,還需要為每一個下載的文件重命名,于是我萌生了批量下載課程視頻的想法。

首先檢查播放頁面中的HTML5播放器元素,發(fā)現(xiàn)了視頻資源的URL。



但是查看網(wǎng)頁源代碼的時候卻并沒有發(fā)現(xiàn)與HTML5播放器有關(guān)的內(nèi)容,看來這是一個由js即時生成網(wǎng)頁內(nèi)容的動態(tài)網(wǎng)頁。我技術(shù)有限,暫時還不會從動態(tài)網(wǎng)頁上抓取內(nèi)容的操作。而且若要通過獲取視頻播放頁面中視頻的URL來實現(xiàn)批量下載的話,需要遍歷該課程的所有播放頁面,非常繁瑣。

直接從Web頁面抓取下載鏈接的方法過于繁瑣,于是我將目光投向了手機客戶端。




為了效率,手機客戶端與服務(wù)器間一般以簡單易懂的json等方式進(jìn)行通訊,我希望能從手機客戶端與服務(wù)器的報文中獲取有價值的信息。手機抓包的方法有很多,出于個人習(xí)慣,這里我選擇了在PC上使用Fiddler 4進(jìn)行抓包。在手機客戶端登陸賬號,打開對應(yīng)課程,Fiddler中立刻出現(xiàn)了客戶端與服務(wù)器通訊的報文。




經(jīng)過仔細(xì)查看,終于在目的為www.icourse163.org/mob/course/courseLearn/v1的POST方法的response內(nèi)容中發(fā)現(xiàn)了有用信息。

將這一報文復(fù)制出來,發(fā)現(xiàn)這是一份包含該課程的所有信息以及各個視頻的源文件URL的json。將這份json格式化之后,我們可以清晰地看到它的層次結(jié)構(gòu)。



“results”下的”courseDto”包含了當(dāng)前課程的名稱、學(xué)校名稱、簡介等各種信息,”termDto”包含了章節(jié)(”chapters”)課時(”lessons”)課的分節(jié)(”units”)這樣的分層結(jié)構(gòu),在”units”下的”resourceInfo”中,就包含了這節(jié)課的標(biāo)清、高清、超清資源分別對應(yīng)的源文件URL。得到了這份json后,我們就可以根據(jù)其結(jié)構(gòu)編寫代碼來批量下載它們,這里我使用Python。

[python] view plain copy print?
  • #?-*-?coding:?utf-8?-*-??
  • import?json??
  • import?os??
  • import?urllib.request??
  • jsonFile=open(’json.txt’).read()#事先將抓包所得的json保存為同目錄下的文本文件??
  • jsonObj=json.loads(jsonFile)??
  • def?Schedule(a,b,c):#下載進(jìn)度指示??
  • ????””’?
  • ????a:已經(jīng)下載的數(shù)據(jù)塊?
  • ????b:數(shù)據(jù)塊的大小?
  • ????c:遠(yuǎn)程文件的大小?
  • ???”’??
  • ????per?=?100.0?*?a?*?b?/?c??
  • ????if?per?>?100?:??
  • ????????per?=?100??
  • ????print(‘%.2f%%’?%?per)??
  • def?getMOOCLessons(jsonObj):??
  • ????courseName=jsonObj[’results’][‘courseDto’][‘name’]+“?”+jsonObj[‘results’][‘courseDto’][‘schoolName’]??
  • ????os.mkdir(courseName)#創(chuàng)建名稱為“課程名+校名”的根目錄??
  • ????chapters=jsonObj[’results’][‘termDto’][‘chapters’]#讀取所有章節(jié)的信息為一個列表??
  • ????for?i?in?range(len(chapters)):#遍歷所有章節(jié)??
  • ????????os.mkdir(courseName?+?’\\’?+?chapters[i][‘name’])#每一個章節(jié)建立一個文件夾??
  • ????????print(chapters[i][‘name’])??
  • ????????lessons=chapters[i][’lessons’]#讀取當(dāng)前章節(jié)下所有課時的信息為一個列表??
  • ????????for?j?in?range(len(lessons)):#遍歷所有課時??
  • ????????????units=lessons[j][’units’]#讀取當(dāng)前課時下所有小節(jié)的信息為一個列表??
  • ????????????for?k?in?range(len(units)):#遍歷所有小節(jié)??
  • ????????????????aunit=units[k]??
  • ????????????????if?(aunit[“contentType”]==1):#判斷該小節(jié)是否為視頻內(nèi)容??
  • ????????????????????print(“Downloading?”+aunit[‘name’])??
  • ????????????????????urllib.request.urlretrieve(aunit[”resourceInfo”][“videoHDUrl”],?courseName?+?‘\\’?+?chapters[i][‘name‘]+’\\‘+aunit[‘name’]+“.mp4”,?Schedule)#下載文件,這里下載的是高清資源??
  • getMOOCLessons(jsonObj)??
  • # -*- coding: utf-8 -*- import json import os import urllib.request jsonFile=open('json.txt').read()#事先將抓包所得的json保存為同目錄下的文本文件 jsonObj=json.loads(jsonFile) def Schedule(a,b,c):#下載進(jìn)度指示'''''a:已經(jīng)下載的數(shù)據(jù)塊b:數(shù)據(jù)塊的大小c:遠(yuǎn)程文件的大小'''per = 100.0 * a * b / cif per > 100 :per = 100print('%.2f%%' % per) def getMOOCLessons(jsonObj):courseName=jsonObj['results']['courseDto']['name']+" "+jsonObj['results']['courseDto']['schoolName']os.mkdir(courseName)#創(chuàng)建名稱為“課程名+校名”的根目錄chapters=jsonObj['results']['termDto']['chapters']#讀取所有章節(jié)的信息為一個列表for i in range(len(chapters)):#遍歷所有章節(jié)os.mkdir(courseName + '\\' + chapters[i]['name'])#每一個章節(jié)建立一個文件夾print(chapters[i]['name'])lessons=chapters[i]['lessons']#讀取當(dāng)前章節(jié)下所有課時的信息為一個列表for j in range(len(lessons)):#遍歷所有課時units=lessons[j]['units']#讀取當(dāng)前課時下所有小節(jié)的信息為一個列表for k in range(len(units)):#遍歷所有小節(jié)aunit=units[k]if (aunit["contentType"]==1):#判斷該小節(jié)是否為視頻內(nèi)容print("Downloading "+aunit['name'])urllib.request.urlretrieve(aunit["resourceInfo"]["videoHDUrl"], courseName + '\\' + chapters[i]['name']+'\\'+aunit['name']+".mp4", Schedule)#下載文件,這里下載的是高清資源 getMOOCLessons(jsonObj)


    執(zhí)行這段Python程序即可自動批量下載慕課視頻,因為下載耗時很長,我在這里將它丟到了樹莓派上執(zhí)行,最終按照預(yù)想生成了對應(yīng)的目錄結(jié)構(gòu)并成功下載課程全部視頻。




    這里只是簡單地實現(xiàn)了功能,如果想提高效率可以進(jìn)一步將程序改為多線程執(zhí)行。

    http://blog.csdn.net/wxyedward/article/details/79080246

    總結(jié)

    以上是生活随笔為你收集整理的对中国大学MOOC课程视频批量下载的探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲网av | 在线麻豆视频 | 手机av在线播放 | 亚洲91网站| 日韩日日日 | 爆乳熟妇一区二区三区霸乳 | 98自拍视频 | 亚洲一区视频在线播放 | 俄罗斯美女一级爱片 | 亚洲综合一区二区 | 麻豆影音先锋 | 国产suv精品一区二区三区 | 超碰牛牛 | 亚洲欧美综合网 | 日本黄色网页 | 亚洲第一av网 | 欧美亚洲国产日韩 | 黄页嫩草 | 粉嫩av国产一区二区三区 | 西川结衣在线观看 | 一级久久久久久久 | 日韩色图片 | 久久激情片 | 国产精品免费看久久久无码 | 国产精品黄视频 | 欧美xxxxhd| 美女福利视频在线观看 | 国产在线拍揄自揄拍无码视频 | 夜夜嗨影院 | 欧美爱爱网站 | 欧美精品一级二级 | 久久福利网 | 欧美三级视频在线观看 | 久久久久夜夜夜精品国产 | 午夜啪啪网站 | 国产精品一区二区毛片 | 亚洲偷偷自拍 | 久久影院一区 | 国产中文字幕免费 | 狠狠撸在线视频 | 婷婷狠狠干| 欧美脚交 | 中文一区在线观看 | 欧美日韩欧美 | 高清一区二区三区 | 欧美疯狂做受xxxxx高潮 | 激情综合激情 | 五月天综合激情网 | 国产成人在线看 | 亚洲天堂男人天堂 | 欧美午夜精品理论片 | 看黄网站在线 | 国产精品一区二区三区久久久 | 水果视频污 | 久久国产精品无码一区二区 | 亚洲va韩国va欧美va | 黄视频在线免费 | 五月天小说网 | 色婷婷av一区二区三区之红樱桃 | 91一级片| 美女丝袜合集 | 一区二区三区91 | 国产精品一区不卡 | 性涩av | 影音先锋黄色资源 | 午夜精品福利一区二区三区蜜桃 | www.com亚洲 | 波多野吉衣一二三区乱码 | 亚洲在线第一页 | 久久久久九九 | 欧美特黄视频 | 91精品国产电影 | 海角社区在线视频播放观看 | 观看av | 国产激情无码一区二区 | 色97色 | 麻豆视频官网 | 国内自拍xxxx18| 欧美在线一区视频 | 三八激情网 | 黄色片久久久 | 亚洲精品天堂成人片av在线播放 | 色香蕉av| 成人免费看片'在线观看 | 熟妇人妻无乱码中文字幕真矢织江 | 女同一区 | 欧美色啪 | 领导揉我胸亲奶揉下面 | 黄色永久视频 | 国产精品美女久久久久 | 伊人av一区 | 亚洲图片小说视频 | 欧美在线一区视频 | 韩国美女啪啪 | 男女互操在线观看 | 色猫咪av在线 | 日韩成人一区 | 天堂成人在线观看 | 一本色道久久综合亚洲二区三区 |