环境配置:

安装selenium、requests

安装Chrome或Firefox驱动

源码:

# coding: utf-8from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import *
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
requests.adapters.DEFAULT_RETRIES = 5
import time
import os
import redriver = webdriver.Chrome()
#driver = webdriver.FireFox()
wait = WebDriverWait(driver, 10)def download(url, file_name):headers = {'Host': 'hubble.netease.com','Origin': 'https://www.icourse163.org','Referer': url.split("#")[0],'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'}if not os.path.exists(file_name) or os.path.getsize(file_name)<=10:with open(file_name, "wb") as f:r = requests.get(url, headers=headers, verify=False)f.write(r.content)f.close()print("\t下载成功:{}".format(file_name))else:print("\t文件已存在:{}".format(file_name))# 课件地址  存储路径  范围[a, b](第a章到第b章,默认[0, 0]表示全部)
def get_courseware(courseware_url, path, c_range=[0,0]):t = 0while t < 2:try:driver.get(courseware_url)h3 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#g-body > div.m-learnhead > div > div > div > a.f-fl > h4")))school_name =  re.findall(r'/([a-zA-Z]+)-', courseware_url)[0]title = h3.textpath_1 = os.path.join(path, title+"_"+school_name)if not os.path.exists(path_1):os.makedirs(path_1)path =os.path.join(path_1, "courseware")if not os.path.exists(path):os.makedirs(path)#总章节数h3_count = len(driver.find_elements_by_css_selector("div > div.m-learnChapterList> div.m-learnChapterNormal > div.titleBox > h3"))if c_range[1] == 0:c_range2 = h3_countelse:c_range2 = c_range[1]for index in range(3+c_range[0], 3+c_range2):driver.refresh()h3 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div > div.m-learnChapterList> div.m-learnChapterNormal:nth-child(3) > div.titleBox > h3")))h3.click()h3 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div > div.m-learnChapterList> div.m-learnChapterNormal:nth-child({}) > div.titleBox > h3".format(index))))h3_text = h3.textprint("{}:".format(h3_text), end = "\t")patten = re.compile('.*?第(.{1,3})(周|章).*?')match = re.match(patten, h3_text)if match:week = match.group(0)else:week = h3_texth3.click()time.sleep(3)
#                 file_count = len(driver.find_elements_by_xpath('//div[@class="f-icon lsicon f-fl "]/span[@class="u-icon-doc"]'))file_count = len(driver.find_elements_by_xpath('//div[@class="sourceList"]/*[@title="文档讲稿"]'))print(file_count)h4_count = len(driver.find_elements_by_css_selector('div.u-learnLesson > h4'))for h4_index in range(1, h4_count+1):h4 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.u-learnLesson:nth-of-type({}) > h4.j-name'.format(h4_index))))# 标题4h4str = h4.textfile_count = len(driver.find_elements_by_css_selector(f'div.u-learnLesson:nth-of-type({h4_index}) > div.sourceList > div[title^="文档"]'))for f_index in range(1,file_count+1):title = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, f'div.u-learnLesson:nth-of-type({h4_index}) > div.sourceList > div[title^="文档"]')))titlestr = title.get_attribute("title")title.click()time.sleep(0.2)download_btn = wait.until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, '文档下载')))download_url = download_btn.get_attribute("href")week = week.replace(":", "-").replace("/", " ").replace("\\", " ").replace("课件:", " ").replace(":", " ")titlestr = f'{h4str} {titlestr}'title = titlestr.replace(":", "-").replace("/", " ").replace("\\", " ").replace("课件:", " ").replace(":", " ").replace("/", " ")print(week, "   ", title)file_name = path + "\\" + week + " " + "".join(title.split()).replace(":", " ") + "." + download_url.split(".")[-1].split('&')[0]print(file_name)download(download_url, file_name)driver.back()time.sleep(1)h3 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div > div.m-learnChapterList> div.m-learnChapterNormal:nth-child(3) > div.titleBox > h3")))h3.click()h3 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div > div.m-learnChapterList> div.m-learnChapterNormal:nth-child({}) > div.titleBox > h3".format(index))))h3.click()t = 5except FileNotFoundError:print("FileNotFoundError: [Errno 2] No such file or directory: ")t += 1def main():courseware_url = 'https://www.icourse163.org/learn/NJU-1449346162?tid=1449772442#/learn/content'path = r"E:\C&C++"# 课件地址  存储路径  范围[a, b](第a章到第b章,默认[0, 0]表示全部)get_courseware(courseware_url, path, [0,0])driver.quit() #退出浏览器if __name__ == '__main__':main()

代码运行:

找到课件页面的url,如https://www.icourse163.org/learn/NJU-1449346162?tid=1449772442#/learn/content

替换courseware_url,path的值,运行即可

jupyter notebook 文件下载: MOOC_courseware2.ipynb

(访问密码:5719)

Python批量下载中国大学MOOC课件相关推荐

  1. python大学课程-Python 爬取中国大学 MOOC 课程

    中国大学 MOOC 是网易旗下一款慕课视频教育网站.实话说,这是网易几款教育类产品中,我最喜欢的一个.自己也使用了一年多,观看视频都是需要联网的,但部分 MOOC 课程存在有效期,设定的学期结束即无法 ...

  2. python资源管理器 计算机项目下的_高级语言程序设计(Python)_中国大学MOOC(慕课)_题库及答案...

    高级语言程序设计(Python)_中国大学MOOC(慕课)_题库及答案 来源:未知 编辑:admin 时间:2020-06-30 更多相关问题 以下选项中能正确调用fun函数的语句是charfun(c ...

  3. Python爬取中国大学MOOC课程信息

    问题:获取中国大学MOOC平台的课程信息,包括开课学校.课程类别(标签).课程名称.课程评分.评价人数和已参加课程人数. 思路: 1.进入中国大学MOOC首页,点击"学校",进入学 ...

  4. Python 爬取中国大学 MOOC 课程

    MOOC 课程存在有效期,设定的学期结束即无法观看. Course Crawler 这个爬虫工具的出现,则提供了极大的便利. 准备 第一步:安装 Python 3 环境 进入 Python 3 官网( ...

  5. python 视频下载中国大学慕课_下载视频

    1楼 赵明 发表于2017年07月01日 以前可以用谷歌浏览器下载,但现在好像不行了 赵明 发表于2017年07月01日 飞龙在天mooc22 2017年07月01日 0 | 举报 哦,好吧,谢谢老师 ...

  6. python是高级程序语言_高级语言程序设计(Python)_中国大学MOOC(慕课)

    课程概述 "高级语言程序设计"类课程面向无编程基础的学生,培养其运用编程语言解决实际问题的编程能力,使学生掌握一门编程语言的基本语法.语句.控制结构以及结构化程序设计的基本思想和方 ...

  7. 中国大学mooc慕课python答案_中国大学MOOC(慕课)Python编程基础题目答案

    管理活动的主体是() 推动无线电和计算机创新的是() 有利于加强各部门之间的协作和信息交流的组织形式是() 推动无线电和计算机创新的是() 平地机的刮刀能完成的动作有侧伸.倾斜.铲土角变化.升降和() ...

  8. python 音速_中国大学MOOC的APP(慕课)2021用Python玩转数据章节答案

    在高技术战争件下,信息的获取相当于人的感觉器官,信息的传输相当于人的神经网络,信息的处理相当于人的大脑,( )则将它们联系为一个整体,构成了作战的神经系统. 车身可拆卸的连接有螺纹连接.卡口链接.铰链 ...

  9. 中国大学mooc慕课python答案_中国大学MOOC慕课Python编程基础答案公众号

    锁胸筋膜位于______.______和______之间,穿过此筋膜的结构有淋巴管.______.______和______. 发动机气缸间隙过小会引起发动机怠速不稳. IPSec是IETE以RFC形 ...

  10. 中国大学mooc慕课python答案_中国大学MOOC慕课Python编程基础课后答案

    [判断题]在既定的国民收入下,国民收入的支出结构在不同承担主体间发生变动时,会使得增量资源在国民部门间分配的比例发生改变. [判断题]引入外资的优惠政策应该按产业来划分 [单选题]"食不厌精 ...

最新文章

  1. django权限系统实现步骤_Django密码系统实现过程详解
  2. Pytorch nn.Transformer的mask理解
  3. JS中 let 和var的区别
  4. luncene 查询字符串的解析—QueryParser类
  5. CSS文字或元素的水平垂直居中多种方式(简单明了)
  6. 解决ZF2_PATH environment
  7. 精准 iOS 内存泄露检测工具
  8. 搭建VMware6.5+Win2003 MSCS群集实验环境
  9. 各种学习资料库,非常好的收藏汇总!!!!!
  10. 云计算机什么意思啊,什么叫云计算,云计算是什么,最通俗的解释是这样的
  11. 缓解焦虑,经营自己,如何管理自己的人生(12节课)
  12. vscode 设置关键字高亮显示
  13. 案例二——网页倒计时(秒杀)
  14. Scrapy--下载器中间件(Downloader Middleware)
  15. REID计算机网络,什么是行人重识别(ReID)?为什么要ReID?
  16. 最全java面试题整理(持续更新)
  17. 前端面试之html+css【一】
  18. 数据资产价值评估常用方法及对比
  19. 读书笔记--电气图连接线的表示方法
  20. python文件整理程序_Python实现自动整理文件的脚本

热门文章

  1. win2008php一键,WIN2008 一键安装PHP环境PHP5.3+FastCGI
  2. 2008r2 php mysql_Win2008R2IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程_MySQL
  3. 使用“网吧卫士”实现网吧带宽完美管理(转)
  4. Multisim 14.0安装包+详细安装步骤
  5. 关闭Windows10 易升
  6. std::deque的使用
  7. CNVD和CNNVD披露漏洞教程(个人申报)
  8. linux如何打开elf文件格式,linux ELF文件格式
  9. Java学生管理系统(数组版)
  10. [工具] Mac下一键APK逆向环境