moodle重定向_用最简单的pythonGUI库PysimpleGUI 设计一款中丹学院Moodle课件下载器。...
非程序背景出身研究生,自學python寫的下載器。學了4天爬蟲,花了一星期寫的代碼。初衷是為了下載課件節省時間和練習網絡爬蟲。
我想除了中丹學院的學生很少有人會用到這個的,國內幾乎沒有用Moodle的,寫這篇帖子主要是為了給想寫網絡爬蟲和設計極簡GUI一點參考。下面看下成品效果吧。
Moddle-Slide-Downloader1.特性:寫的程序比較邪門,快的時候很快,慢的時候有點慢,但是優點是全自動化。
l 不用打開瀏覽器
l 不用解壓文件,不用建文件夾
l 除了第一步輸入課程鏈接和賬號密碼啥的,以后都是鼠標點三下自動同步文件)干別的時候掛在就行了,估計也節省不了很多時間2.用法:
3.打開軟件
不要關閉電腦cmd,cmd是作為軟件輸出的信息的。(本來想用PySimpleGUI作為輸出信息的,比cmd好看多了,無奈太卡,只能cmd了)4.輸入
賬號密碼
課程儲存路徑
課程鏈接地址:復制鏈接粘到軟件5.第一次使用點擊SaveSettings
會在軟件同目錄保存一個配置文件用來保存用戶賬號、密碼、路徑、課程URL等
(盡量不要把軟件放在桌面,尤其是開啟桌面清理的情況下,軟件容易無法建立配置文件,可以放在其他盤,然后建立快捷方式)
你原先建的課程文件夾及下面包含的文件夾一定要和Moddle的一樣,不然就會重新下載文件。6. 再次打開先點擊loadsetting,再點擊 submit.7. 文件下載過程會把課件文件信息羅列一遍,并且在最后生產生產文件更新報告。
文件小于0.1M會出現進度條問題,設計到API底層問題,解決不了。
很多時候軟件不如手動下載快,我還很vegetable,不過全自動的掛在唄。 下面代碼奉上。初學爬蟲,性能不足,很多地方有待改進,歡迎高人指點。也歡迎萌新借鑒。
import time import requests from bs4 import BeautifulSoup import os import re # import dill import PySimpleGUI as sga = time.time() # dill.load_session('file_name.pkl') # dill.dump_session('file_name.pkl')#定義一個空集合用來保存更新的文件 update_slides = [] #獲取課程url信息def getHTML(url):try:r = sessions.get(url, timeout=60, headers=hd)r.raise_for_status() # 容錯機制,若請求訪問失敗則返回的不是200,則返回字符串空r.encoding = r.apparent_encoding # 設置編碼方式,用解析返回網頁源碼得出的編碼方式代替 UTF-8return r.textexcept:return ''#定義解析HTML函數 def soupanyl(course_url):text = getHTML(course_url) # 獲得課程主頁面storage,減少重復運算soup = BeautifulSoup(text, 'html.parser')return soup#定義文件保存函數 def save_files(file_url, local_path, course_title, section_name, first_folder_name, file_name):global update_slidesfile_path = local_path + '/' + course_title + '/' + section_name + '/' + first_folder_name + '/' + file_namestore_path = file_path.replace(file_path.split('/')[-1], '')new_file = course_title + '/' + section_name + '/' + first_folder_name + '/' + file_nameif not os.path.exists(store_path):os.makedirs(store_path)if not os.path.exists(file_path):try:print('新上了一個文件正在準備下載' + new_file)start = time.time()response = sessions.get(file_url,stream=True) # stream參數設置成True時,它不會立即開始下載,當你使用iter_content或iter_lines遍歷內容或訪問內容屬性時才開始下載chunk_size = 1024 # 每次塊大小為1024content_size = int(response.headers['content-length']) # 返回的response的headers中獲取文件大小信息size_data = str(round(float(content_size / chunk_size / 1024), 4))print(" 文件大小:" + size_data + "[MB]")print(' ', end='')with open(file_path, 'wb') as file:count = 0for data in response.iter_content(chunk_size=chunk_size): # 每次只獲取一個chunk_size大小file.write(data) # 每次只寫入data大小count += 1024proced = int(round(100 * count / content_size))print(('r 進度: {}%' + '█' * round(proced / 2) + '>' * (50 - round(proced / 2))).format(proced),end='') # 向終端輸出# [ r 加上文本 加 end = ''是單行刷新)end = time.time()print("n 該文件下載成功,總耗時:" + str(end - start) + "秒", end='n')print('', end='n')update_slides.append(new_file)except:print(' 網絡或其他原因,該文件下載失敗。download failed')else:print(' 該路徑下文件已經存在:' + new_file)#從HTML解析出文件名 def seg(url):before = re.findall(r'/0/.+?forcedownload', url)[0][3:-14].replace('%20', ' ')return before#一部分文件名存在課件下載url鏈接中,但是在重新定向的文件中,定義兩個函數重新定向獲取url里的文件名 def redirect_url_name(url):# 獲取pdf連接后名字的爬取redirect = sessions.get(url, timeout=60, headers=hd)# print(sessions.status_code) # 打印響應的狀態碼return redirect.url # 打印重定向后的網址def get_redi_name(url):redi_url = redirect_url_name(url)name = re.findall(r'/content/./.+', redi_url)[0][10:].replace('%20', ' ')return name#解析的文件夾名中刪除那些建立文件夾不合法的特殊字符 def ex_odd(txt):for ch in "/:*?''<> |":txt = txt.replace(ch, " ")return txt#獲得課程標題 def getitle(url):try:soup = soupanyl(url)title = soup.h1.stringif title[0] == ' ':title = title[1:]return titleelse:title = titlereturn titleexcept:return 'unknow'#定義下載某一課程的所有課件 def get_course_all_slides(course_url, local_path):soup = soupanyl(course_url)materials = soup('li', id=re.compile('section')) # get section htmlcourse_title = getitle(course_url)for section in materials:try:infos = section('a')section_name = section.span.stringsection_name = ex_odd(section_name)for info in infos:try:url1 = info.get('href')if 'resource/' in url1:file1_name = get_redi_name(url1)first_folder_name = ''save_files(url1, local_path, course_title, section_name, first_folder_name, file1_name)elif 'download' in url1:first_folder_name = ''file2_name = seg(url1)save_files(url1, local_path, course_title, section_name, first_folder_name, file2_name)elif '/folder/' in url1:file_or_folder_name = info.span.contents[0]soup2 = soupanyl(url1)materials2 = soup2('div', role='main')msgs = materials2[0]('a')for msg in msgs:try:url2 = msg.get('href')file3_name = seg(url2)save_files(url2, local_path, course_title, section_name, file_or_folder_name,file3_name)except:continueelse:continueexcept:continueexcept:continue #開始訪問并登錄網站,session用來保存網站的cookie信息,換句話說就是記中賬號密碼,如果不是這樣,后邊的url解析都是未登錄狀態。 sessions = requests.session() hd = {'user-agent': 'chorme/10'} #定義瀏覽器標頭,防止爬蟲禁止的條令 def login(UserName,PassWord):print(' 準備進入Moodle....(這個網站會卡,正常的,別擔心,等等就好,如果一直進不去的話的話打開瀏覽器看看卡不卡,要是也卡的話就不是我的鍋了,我是robot,和你手動下載一樣的,不用你點點點了),Preparing for entering Moodle.......')loginurl = 'https://sdc-moodle.samf.aau.dk/login/index.php'data = {'username': UserName, 'password':PassWord}request = sessions.post(url=loginurl, data=data, headers=hd)new_lo = request.urlreturn new_lo == loginurl #返回是否登錄成功的信息,True代表未成功,False是成功的,如果登錄成功url會改變。##下面是url設計 PysimpleGUI是一種很簡單的GUI庫,可以在很短的周期學會,很適合沒有時間學習第三方GUI庫的初學者甚至熟練的程序猿。sg.ChangeLookAndFeel('TanBlue') #GUI主題# Design pattern 1 - First window does not remain active #設計GUI布局 layout = [[sg.Text('Moodle-Slides-Downloader for SDC students',font=("Reds", 25),size=(45, 1))],[sg.Text('賬號(UserName):',font=(15)),sg.Input(key = '_USER_',size=(30, 1))],[sg.Text('密碼(Password):',font=(15)),sg.Input(password_char='*', key='_PWD_',size=(30, 1)),],[sg.Text('路徑(Filepath):',font=(15)),sg.InputText('Select your curricula storage path',key = '_PATH_'), sg.FolderBrowse()],[sg.Checkbox('',default= True,key = 'cs1'),sg.Text('課程1(Course1):', font=(15)), sg.InputText('Please input your course URL', size=(60, 1),key = 'course1')],[sg.Checkbox('',default = True,key = 'cs2'),sg.Text('課程2(Course2):', font=(15)), sg.InputText('Please input your course URL', size=(60, 1),key = 'course2')],[sg.Checkbox('',default = True,key = 'cs3'),sg.Text('課程3(Course3):', font=(15)), sg.InputText('Please input your course URL', size=(60, 1),key = 'course3')],[sg.Checkbox('',default = True,key = 'cs4'),sg.Text('課程4(Course4):', font=(15)), sg.InputText('Please input your course URL', size=(60, 1),key = 'course4')],[sg.Btn('SaveSettings'),sg.Button('LoadSettings'),sg.Btn('Submit')], ]#設計GUI頁眉 win = sg.Window('中丹學院(Sino-Danish Center) @Jinglu Han version1.0', layout) #設置主事件循環,保持窗口一致打開,供用戶輸入信息while True:ev, vals = win.Read()filename = 'Moodle_downloader_save.sav'if ev == 'SaveSettings':try:win.SaveToDisk(filename) #PySimpleGUI里面的保存設置按鈕,找了很久的API,供大家參考sg.popup('sucessfully saved')except:sg.popup('Please select your storage path')elif ev == 'LoadSettings':win.LoadFromDisk(filename)# load(form)if ev is None:breakif ev == 'Submit':judge = login(vals['_USER_'],vals['_PWD_'])if judge:sg.popup('login failed,please check your account or password')else:sg.popup('sucessfully login in,start downloading')print(' 成功進入Moodle,sucessfully login in Moodle')for i in range(4):try:T = vals['cs' + str(i+1)]if T:course_url = vals['course' + str(i+1)]local_path = vals['_PATH_']get_course_all_slides(course_url, local_path)else:continueexcept:continueb = time.time()print('程序運行時間:{:.2f}秒'.format(b - a))print('程序運行時間:{:.2f}分'.format((b - a) / 60))print('更新以下文件:(Below files have been downloaded)')for update in update_slides:print(update + '已下載(has been downloaded)')如果有中丹學院的學弟學妹們,歡迎使用這個小軟件。如果bug,歡迎留言反饋,反正我也不會改的(滑稽)。 有問題的話歡迎留言,看到都會回復的,加油,奧力給!
資源鏈接:鏈接:https://pan.baidu.com/s/1ZTd3_aW6cMLVBDRHGk_98A
提取碼:lha0
復制這段內容后打開百度網盤手機App,操作更方便哦
總結
以上是生活随笔為你收集整理的moodle重定向_用最简单的pythonGUI库PysimpleGUI 设计一款中丹学院Moodle课件下载器。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纯静态网站模板封装header和foot
- 下一篇: Python爬虫自学之第(零)篇——爬虫