仅供学习!!拒绝侵权传播ppt!!
侵权立删!!
复习周没有发ppt,却想让打印下来,只能把学习通的ppt下载下来
写了有两个程序,一个基于selenium的全自动(推荐),一个基于自己找txt的半自动
一、全自动ppt下载(推荐)
准备:
1. 安装selenium库,不建议使用最新版本,会闪退,可以使用4.5.0版本:pip install selenium==4.5.0
2. 下载selenium使用的浏览器驱动chromedriver.exe
可以自行下载自己谷歌浏览器对应版本的chromedriver.exe,也可以用我的:
https://pan.quark.cn/s/a3dacb210695
3. 修改代码里面的四个内容
其中初始url是所选课程播放页面的url
# *******************************修改项***************************************
# chromedriver.exe驱动路径
driver_path='C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe'
# 初始url(即点开需要播放课程的任意一个任务页面的url,类似下面这个url)
url="https://mooc1.chaoxing.com/mycourse/studentstudy?chapterId=xxxxxx&courseId=xxxxxx&clazzid=xxxxxx&cpi=xxxxxx&enc=xxxxxx&mooc2=1&openc=xxxxxx"
username='xxx' #学习通账号
password='xxx' #学习通密码
#生成ppt的文件夹路径
#路径单独写出来需要四个"\",因为会经历两次转义
path_base="E:\\\\111"
# *******************************修改项***************************************
完整代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from lxml import etree
import time
import os
import requests
import pptx
from pptx.util import Inches
# *******************************注意以及使用***************************************
# 该程序实现自动登陆学习通并完成ppt下载
# 1.安装selenium库,不建议使用最新版本,会闪退,可以使用4.5.0版本:pip install selenium==4.5.0
# 2.修改下面的修改项
# *******************************注意以及使用***************************************
# *******************************修改项***************************************
# chromedriver.exe驱动路径
driver_path='C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe'
# 初始url(即点开需要播放课程的任意一个任务页面的url,类似下面这个url)
url="https://mooc1.chaoxing.com/mycourse/studentstudy?chapterId=xxxxxx&courseId=xxxxxx&clazzid=xxxxxx&cpi=xxxxxx&enc=xxxxxx&mooc2=1&openc=xxxxxx"
username='xxx' #学习通账号
password='xxx' #学习通密码
#生成ppt的文件夹路径
#路径单独写出来需要四个"\",因为会经历两次转义
path_base="E:\\\\111"
# *******************************修改项***************************************
headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}
def get_course(browser):
text = browser.page_source
html = etree.HTML(text)
lists = html.xpath('//div[@class="posCatalog_select"]')
l=html.xpath('//div[@class="posCatalog_select posCatalog_active"]')[0]
lists.insert(0,l)
for list in lists:
id = list.xpath('@id')[0] # id号
title = list.xpath('.//span[1]/@title')[0] # 小节标题
num = list.xpath('.//em/text()')[0] #小节序号
browser.refresh()
time.sleep(2)
b = browser.find_element(By.ID, id)
browser.execute_script("arguments[0].scrollIntoView();", b)
b.click()
time.sleep(1)
name=num.replace(".","-")+"-"+title
print("当前章节:"+name)
xiazai(browser,name)
def xiazai(browser,name):
for i in range(10):
a=0
try:
time.sleep(2)
browser.switch_to.default_content()
browser.switch_to.frame(0)
browser.switch_to.frame(i)
try:
browser.switch_to.frame(0)
a=a+1
if a>1:
name=name+"+1"
text = browser.page_source
html = etree.HTML(text)
list = html.xpath('//img/@src')
type='PPT'
except:
type="视频"
if type=='PPT':
print("ppt " + name + ' 图片开始下载')
path_tp = path_base + "\\\\" + name + '\\\\' # 图片下载文件夹
result=path_base + "\\\\" + 'result\\\\'
ppt_filename = path_base + "\\\\" + 'result\\\\' + name + '.pptx' # 下载的ppt文件,在result文件夹中
# 创建图片下载目录
if not os.path.exists(path_tp):
os.mkdir(path_tp)
if not os.path.exists(result):
os.mkdir(result)
# 下载图片
for i in range(len(list)):
url = list[i]
filename = path_tp + str(i + 1) + '.jpg'
r = requests.get(url, headers=headers)
f = open(filename, 'wb')
f.write(r.content)
f.close()
print(name + ":第" + str(i + 1) + "/" + str(len(list)) + "张图片已完成")
print("全部完成")
print("一共有" + str(len(list)) + "张")
# 将图片排序
def get_file_list(file_path):
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
# 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列
# os.path.getmtime() 函数是获取文件最后修改时间
# os.path.getctime() 函数是获取文件最后创建时间
dir_list = sorted(dir_list, key=lambda x: os.path.getmtime(os.path.join(file_path, x)))
# print(dir_list)
return dir_list
# 合成ppt
list = get_file_list(path_tp)
ppt_file = pptx.Presentation()
# 按图片编号顺序导入
for fn in sorted(list, key=lambda item: int(item[:item.rindex('.')])):
fn = path_tp + fn
slide = ppt_file.slides.add_slide(ppt_file.slide_layouts[1])
# 为PPTX文件当前幻灯片中第一个文本框设置文字,本文代码中可忽略
slide.shapes.placeholders[0].text = ' '
# 导入并为当前幻灯片添加图片,起始位置和尺寸可修改
slide.shapes.add_picture(fn, Inches(0), Inches(0), Inches(10), Inches(7.5))
ppt_file.save(ppt_filename)
print("ppt " + name + ' 下载已完成')
except:
print("本小节ppt下载完成,可前往 "+path_base+"\\\\result 查看")
print('-------------------------------------------------------------')
return
def main():
if not os.path.exists(path_base):
os.mkdir(path_base)
chrome_options = Options()
chrome_options.add_argument('--mute-audio') #设置静音
browser = webdriver.Chrome(driver_path,options=chrome_options)
browser.get(url)
user_input = browser.find_element(by=By.XPATH, value='//input[@type="text"]')
pw_input = browser.find_element(by=By.XPATH, value='//input[@type="password"]')
login_btn = browser.find_element(by=By.XPATH, value='//button')
time.sleep(1)
user_input.send_keys(username)
pw_input.send_keys(password)
time.sleep(1)
login_btn.click()
time.sleep(1)
print("登陆成功")
get_course(browser)
# bofang(browser)
browser.close()
print("下载全部完成")
main()
二、半自动ppt下载
在学习通中查看ppt的元素可以发现,网站中都是一个个图片拼接而成
步骤:
(1)摁F12(或者右键,检查)
定位到ppt的元素
(案例是网上随便找的一个课件)
(2)选择包含所有图片的标签
(3)进入一个空文件夹,创建一个txt文件,可以命名为想下载的课件名称(任意),将刚才复制的元素粘贴进去,一般为下面两种情况
——————————————————
(4)同理,可以创建多个txt文件,每个文件放入一个想下载的ppt的元素
(5)记好这个文件夹的路径,修改下面代码中的路径即可
代码如下(记得下载相关python包):
# 使用说明:
# (1)摁F12(或者右键,检查),定位到ppt的元素
# (2)选择包含所有图片的标签
# (3)进入一个空文件夹,创建一个txt文件,可以命名为想下载的课件名称(任意),将刚才复制的元素粘贴进去
# (4)同理,可以创建多个txt文件,每个文件放入一个想下载的ppt的元素
# (5)记好这个文件夹的路径,修改下面代码中的路径即可
# 根据上面步骤先将文件夹中的文件弄好,这个代码里面,主要就修改path_base一个,即保存的文件夹目录
# 注意:
# 路径单独写出来需要四个"\",因为会经历两次转义
# 最后生成的ppt结果在result文件夹中
from lxml import etree
import os
import requests
import pptx
from pptx.util import Inches
headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}
#主目录环境
#路径单独写出来需要四个"\",因为会经历两次转义
#(******************************修改项***************************************)
path_base='E:\\\\11\\\\'
#(******************************修改项***************************************)
l1='<!DOCTYPE html>\n'
l2='<html lang="en">\n'
l3='<head>\n'
l4=' <meta charset="UTF-8" \>\n'
l5=' <meta name="viewport" content="width=device-width, initial-scale=1.0" \>\n'
l6=' <title>Document</title>\n'
l7='</head>\n'
l8='<body>\n'
l9='\n'
l10='</body>\n'
l11='</html>\n'
#提取txt文件名
file_name = os.listdir(path_base)
a=0
filename={}
for i in range(len(file_name)):
ext = file_name[i][-3:].lower()
if ext=='txt':
filename[a]=file_name[i].split('.')[0]
a=a+1
file = list(filename.values())
#创建ppt下载目录
if not os.path.exists(path_base+'result\\\\'):
os.mkdir(path_base+'result\\\\')
print('一共检测到'+str(len(file))+'个任务,分别是:')
print(file)
#将每个文件分别提取下载
for name in file:
print('-------------------------------------------------------------')
#创建html文件
#txt变换格式并转换为html,用于etree.HTMLParser的识别
txt_name=path_base+name+".txt"
path_html= path_base +name+'.html'
file = open(txt_name, 'r',errors = 'ignore') #忽略中文乱码报警
content = file.read()
file.close()
content = content.replace("<br>", "<br />")
content = content.replace('png">', 'png" />')
content = content.replace('jpg">', 'jpg" />')
file_html = open(path_html, 'a')
file_html.writelines([l1, l2, l3, l4, l5, l6, l7, l8])
file_html.write(content)
file_html.writelines([l9, l10, l11])
file_html.close()
print("ppt " + name + ' 图片开始下载')
path_tp = path_base + name + '\\\\' #图片下载文件夹
ppt_filename = path_base+'result\\\\' + name + '.pptx' #下载的ppt文件,在result文件夹中
#提取图片下载地址
par = etree.HTMLParser(encoding="utf-8")
html = etree.parse(path_html,parser=par)
result = etree.tostring(html, pretty_print=True)
list = html.xpath('//img/@src')
#创建图片下载目录
if not os.path.exists(path_tp):
os.mkdir(path_tp)
#下载图片
for i in range(len(list)):
url=list[i]
filename = path_tp + str(i+1) + '.jpg'
r = requests.get(url, headers=headers)
f = open(filename, 'wb')
f.write(r.content)
f.close()
print(name+":第"+str(i+1)+"/"+str(len(list))+"张图片已完成")
print("全部完成")
print("一共有"+str(len(list))+"张")
#将图片排序
def get_file_list(file_path):
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
# 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列
# os.path.getmtime() 函数是获取文件最后修改时间
# os.path.getctime() 函数是获取文件最后创建时间
dir_list = sorted(dir_list,key=lambda x: os.path.getmtime(os.path.join(file_path, x)))
# print(dir_list)
return dir_list
#合成ppt
list= get_file_list(path_tp)
ppt_file = pptx.Presentation()
# 按图片编号顺序导入
for fn in sorted(list, key=lambda item: int(item[:item.rindex('.')])):
fn=path_tp+fn
slide = ppt_file.slides.add_slide(ppt_file.slide_layouts[1])
# 为PPTX文件当前幻灯片中第一个文本框设置文字,本文代码中可忽略
slide.shapes.placeholders[0].text = fn[:fn.rindex('.')]
# 导入并为当前幻灯片添加图片,起始位置和尺寸可修改
slide.shapes.add_picture(fn, Inches(0), Inches(0), Inches(10), Inches(7.5))
ppt_file.save(ppt_filename)
print("ppt "+name+' 下载已完成')
os.remove(path_html)
print('-------------------------------------------------------------')
print("下载全部完成")
运行结果展示: