python3 爬蟲從學習強國下載慕課視頻

學習強國APP上有很多優質學習資源,沒有任何廣告。最近,我從慕課頻道系統學習了Python語言系列:《Python網絡爬蟲與信息提取》課程,接下來我就用它來練練手。

python3 爬蟲從學習強國下載慕課視頻

課程首頁很簡潔,但是查看源代碼沒有發現任何漢字內容。

python3 爬蟲從學習強國下載慕課視頻

F12查看開發人員工具,從一個命名和頁面html十分相像的js腳本里,可以找到所有頁面數據,它用一個javascript數據字典對象存儲。這個js的名稱就是在html頁面名稱的前面加了字符串“data”,數據內容可以用json進行解析,得到播放頁面的url。

python3 爬蟲從學習強國下載慕課視頻

同樣方法,找到實際視頻地址存放在javascript數據字典中。鍵為“ossUrl”,由於一個頁面可能有多個視頻,值域以列表形式存放。

python3 爬蟲從學習強國下載慕課視頻

瞭解清楚網頁結構,開始編寫程序。首先,導入requests、re、json、os庫,這裡因為數據都存儲在js腳本中,沒有用到BeautifulSoup庫。我們請求的頁面主要包括兩個js腳本和一個實際視頻頁面,請求頁面信息的函數,返回了一個Response對象“r”,根據需要調用r.text或r.content。

python3 爬蟲從學習強國下載慕課視頻

從上面分析可知,存放數據的js腳本命名和訪問的網頁html命名有一定的對應關係,所以定義一個獲取js腳本完整url的函數。

python3 爬蟲從學習強國下載慕課視頻

根據js腳本的實際地址,解析內容,將javascript字典對象處理成Python格式的json(或者字典)。

python3 爬蟲從學習強國下載慕課視頻

下載視頻函數,需要傳入3個參數,請求網頁返回的Response對象req,視頻存放路徑path(使用課程名稱和章節名稱自動創建),視頻名稱name。

python3 爬蟲從學習強國下載慕課視頻

使用正則表達式處理文件夾、文件命名中不允許存在的特殊符號,不然下載其他視頻會報錯。Windows操作系統共有(\\ / \\ | ? " < > : *)9個英文標點及特殊符號。

python3 爬蟲從學習強國下載慕課視頻

從課程入口處批量下載整個課程視頻,並根據課程名稱“course_name”、章節名稱“chapter_name”和視頻名稱“video_name”自動建立文件夾和命名文件。

python3 爬蟲從學習強國下載慕課視頻

主函數可以寫入課程首頁鏈接,也可以讓用戶自行輸入。

python3 爬蟲從學習強國下載慕課視頻

python3 爬蟲從學習強國下載慕課視頻

完整代碼如下:

<code># _*_ coding:utf-8 _*_

import requests
import re
import json
import os

# 獲取頁面信息
def getHtmlContent(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = 'utf-8'
return r
except Exception as e:

return ''

# 下載單個視頻
def downloadVideo(req, path,name):
if not os.path.exists(path):
os.makedirs(path)
with open(path+name,'wb') as f:
f.write(req.content)
f.flush()

# 獲取數據存放JS腳本鏈接
def getURL(url):
try:
pos = url.rfind('/')
pos_url = url[:pos+1]
data_url = 'data' + url[pos+1 : -4] + 'js'
return pos_url + data_url
except Exception as e:
return ''

# 解析存儲數據的JS腳本內容,返回JSON對象
def parse_content(url):
\tdata_url = getURL(url)
\tjs_data = getHtmlContent(data_url).text
\tdata = js_data.lstrip('globalCache = ').rstrip(';')
\tdic_data = json.loads(data)
\treturn dic_data

# 處理文件夾及名稱中的特殊符號
def clearSymbol(str):
rex = re.compile('[\\\\|\\/|\\||\\?|\"|\\|\\:|\\*]')
return re.sub(rex,' ',str)

# 執行批量下載
def run_Download(url):
data = parse_content(url)
course_name = data['sysQuery']['mooc']
for menu in data['fpe1ki18v228w00']:
chapter_name = clearSymbol(menu['mooc_class'])
video_name = clearSymbol(menu['frst_name'])
path = course_name + '/' + chapter_name + '/'
page_url = menu['static_page_url']

video_data = parse_content(page_url)
video_links = video_data['fp6ioapwuyb80001']['info']['ossUrl']

links = eval(video_links)

if len(links) <= 1:
req = getHtmlContent(links[0])
downloadVideo(req,path,video_name+'.mp4')
print('成功下載一個視頻!')
else:
i = 0
for i in range(len(links)):
req = getHtmlContent(links[i])
downloadVideo(req,path,video_name+ str(i+1) +'.mp4')
print('成功下載一個視頻!')
print('《'+course_name+'》' + '課程全部下載完成!')

# 主函數
if __name__ == '__main__':
url = input('請輸入學習強國慕課視頻首頁鏈接地址:')
# 《Python網絡爬蟲與信息提取》課程首頁鏈接地址
# url = 'https://www.xuexi.cn/d3c74c0dc03d6db012934c53bc33196f/9b0f04ec6509904be734f5f609a3604a.html'
run_Download(url)/<code>
python3 爬蟲從學習強國下載慕課視頻


分享到:


相關文章: