python网站开发实例视频_Python实战-让在职教育类网站的视频全自动播放
閱讀本文需要 5.8 分鐘。文章同步發于微信公眾號 somenzz,歡迎訂閱,使用Python打造效率工具。
時間是公平的,因為每個人的一分鐘都是 60 秒;時間又是最不公平的,有人一年的收獲頂得上別人十年,這取決于如何利用時間。
成年人的世界,一個字忙,忙得沒有時間學習,沒有時間健身,沒有時間陪家人。其實解決忙這個問題很簡單,那就是做減法,減去不必要的應酬、會議,減去不重要的事項,只保留那些重要的,有意義的,所謂永遠只做那些重要不緊急的事情。另外節省時間的方法就是借助工具,提高效率。
這些年流行網絡課程學習,在職人士尤其如此,有些課程,需要你花錢去用心學;有些課程,別人花了錢你也得學,什么學習積分,學習報表,積累學時等等,還與績效、職稱掛勾。后者大概率不許快進,這樣就要花費時間點擊播放,再點擊再播放,直到看完完成任務。
如果你知道 Python,其實應對一些不得不看的在線課程,非常簡單,可以寫代碼讓它全部自動播放,最近就有個朋友讓我幫助開發一個可以自動播放網課的工具,來緩解大量線上學習的壓力,感覺這一過程應該有不少人需要,特些記錄下來,可以幫助有同樣需求的朋友。
如果對技術無感,想直接使用現成的工具,請穩步:https://t.zsxq.com/7yzF23R 如果手擼代碼,請繼續。
網站風格如下:
第一步:登陸。
登陸前,先打開開發者工具(Chrome瀏覽器的快捷鍵是F12),然后登陸,查看接口返回數據:
點擊這個login的接口,查看詳細信息如下:
這點重點記錄四個信息:
1、請求的接口地址,即圖中的 Request URL 及請求的方法。 2、Cookie 中的信息,這里是 JSESSIONID。 3、傳遞的參數和返回的接口數據。
根據這些信息,使用 requests 庫自帶的 session 功能很容易寫出登陸的代碼,并且可以獲取此處的 JSESSIONID,可以大致推測出后續的請求也是使用該 JSESSIONID。
import requests
session = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
def login():
params = {
'account': your_username,
'password': your_password,
}
r = session.post("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/user/loginByAccount.do", params=params,headers = headers)
jsessionid = session.cookies.get('JSESSIONID')
return jsessionid
第二步:獲取信息。
登陸后, 獲取到了 JSESSIONID。接下來,我們看到登陸后,還有一個接口,返回的是視頻課程的列表,此接口使用的 JSESSIONID 和登陸是一致的,可以推斷出 JSESSIONID 是后續接口請求的憑證,不過這個憑證是記錄在 cookie 中的,requests 的 session 功能可以自帶 cookie 請求,因此不需要單獨處理。這里就是著重要分析的地方:
我們可以從這里獲取課程的名稱,持續時間,學習進度,編號等信息,有了這些信息,就可以為后續接口的請求提供參數了。方法有很多,正則表達式,BeautifulSoup,Selenium 喜歡哪個就用哪個吧,我這里使用 BeautifulSoup。參考代碼如下:
def get_play_list_info():
video_list = []
for i in range(4):
params = {
'pageNum': i + 1,
'url': '/zgProject/front/learncenter/list'
}
r = session.get("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/DatumFrontController/infolist.do", params, headers )
soup = BeautifulSoup(r, "html.parser")
for el in soup.findAll("div", {'onclick': re.compile("skip(.*)")}):
video_name = el.find("div", {'class': 'clearfix'}).get('title')
function_name = el.get('onclick')
video_id = function_name.split(",")[0].split('(')[1].strip()
progress = el.find("span", {'class': 'baif'}).get_text()
durationTime = el.find("span", {'class': 'durationTime'}).get_text()
if progress != '已完成':
video_list.append({'video_name': video_name, 'video_id': video_id, 'progress': progress,
'durationTime': int(durationTime)})
logger.info(f"共 {len(video_list)} 個待播放的課程,將依次播放:")
for video in video_list:
logger.info(f"{video['video_name']},總時長:{video['durationTime']}秒")
return video_list
第三步:分析視頻播放進度保存邏輯。
以上步驟,可以獲取所有未完成的課程列表,包括名稱、ID,持續時長,當前進度等信息。接下來,我們點擊一個視頻播放,然后看看接口處有什么信息:
這里我們發現請求的參數中有兩個,一個是 time,值是 110,一個是 zgcid,可以猜測,time 是秒數,zgcid 是對應的是視頻課程的編號。過一會時間,發現又發送了請求:
此時 time 為 226,發現間隔了約 120 秒鐘,繼續觀察:
接口名稱叫 saveplayrecord,很容易猜測到,每隔 120 秒發送向服務器一次這樣的請求,就代表向服務匯報,我當前已經觀看到了這個位置,當 time 為視頻的總持續時長時,視頻播放的狀態會顯示為已完成。
def play_video(video):
logger.info(f"{video['video_name']} 開始播放..." )
params = {
'url': '/zgProject/front/learncenter/videocast2',
'zgcid': video['video_id']
}
session.get("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/DatumFrontController/detail.do", params, headers)
percent = float(video['progress'].replace("已觀看","").replace("%","").strip())
cnt = int(video['durationTime']*percent/100)
logger.info(f"當前進度:{percent:0.2f}%")
while cnt < video['durationTime']:
time.sleep(120)
cnt += 120
if cnt > video['durationTime']:
cnt = video['durationTime']
params = {'time':cnt, 'zgcid':video['video_id'] }
r = session.post("http://jxjy.jxt.zj.gov.cn/iext/zg/webfront/DatumFrontController/saveplayrecord.do", params,headers)
if r.json()['success'] == 1:
logger.info(f"播放進度為: {cnt*100/video['durationTime']:0.2f}%")
logger.info(f"{video['video_name']} 播放完成。" )
到這里,我們發現播放視頻的過程中,每隔兩分鐘,網站會向服務器發送一次請求,保存當前視頻的播放進度。此時已經豁然開朗。接下來就是組裝代碼的事情了。
用代碼小結
login()
videos = get_play_list_info()
for video in videos:
play_video(video)
print("視頻播放完畢")
爬蟲的本質在于獲取信息,獲取信息的前提是知道信息發送和接收的方式,因此如果本文看不太懂的朋友,建義先花費 1 - 2 個小時看下 HTTP 協議,再學習下非常適合人類使用的 Python 第三方庫 requests,之后再看此文,就十分簡單。
(完)
總結
以上是生活随笔為你收集整理的python网站开发实例视频_Python实战-让在职教育类网站的视频全自动播放的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java图书馆管理系统_六天写出来的基于
- 下一篇: vue子组件获取父组件数据_在vue.j
