IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Guangzhou共享课程批量下载文件---python -> 正文阅读

[Python知识库]Guangzhou共享课程批量下载文件---python

0本文仅作交流学习讨论,谢谢。

1.原因:由于女朋友工作的需要,要批量下载广州共享课堂里面的资源(包括视频,课程设计,课件,课后答疑)。

2.苦于技术有限,走了很多弯路,干活。

????????2.1打开网址分析:广州共享课堂---点击--识字1.天地人?共1课

? ? ? ? F12,刷新查看---说实话能力有限,反正一个个看一遍,才找到。。。。????????

?可以看到里面包括了,本节课的全部信息(答疑视频,课程视频,教学设计。课件件)。。。。? ?

?????????2.2打开另外一课---识字2.金木水火土(第一课时)?

?????????2.3.分析,比对两个链接:

识字1.天地人? ? ? 的链接:

https://gzclass.gztv.com/hcEdu/pc/getLessons?courseId=3a616f2f5345ac43c9f0a303a0792528

识字2.金木水火土? ?的链接:

https://gzclass.gztv.com/hcEdu/pc/getLessons?courseId=327eef447453db31405118ea22e3702d

只有后面的courseId的值不同,也就是只要取得每个课程的courseId,那么,game over!

????????2.4打开广州共享课堂--继续打开F12 ,查看---又是一个个排查。。。。。。。。。

?????????2.5新的问题来啦!

不用找下一个链接都可以猜到,肯定是topColumnId的值会不同!!!!

刚刚在2.4一个个翻的时候,可以看到这个。。。也是uuid!!!!!!!!!

????????把这个链接复制下来,模拟一次请求,看看效果。

代码如下:

#!/user/bin/python3.8
# -*- coding:utf-8 -*-
# @Time    :21:23
# @Author  :By--Yyang
# @PS      :新手娱乐,代码冗长,见笑了。。。。。。
import re
import requests

def get_uuid1():
    '''
    获取课程的uuid
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getGrade'
    res=requests.get(url=url)
    print(res.text)

if __name__ == '__main__':
    get_uuid1()

?ok,headers都省了。。。。。。

?3.分析结束,干活啦。。。。

实现思路:第一步:获取topColumnId? ? -------uuid1

? ? ? ? ? ? ? ? ? 第二步:获取courseId? ?-------------uuid2

? ? ? ? ? ? ? ? ? 第三步:获取课程资源并下载。

????????3.1获取uuid1---ok(看上图)---利用正则获取下数据(技术浅薄,只会正则)--上代码。

#!/user/bin/python3.8
# -*- coding:utf-8 -*-
# @Time    :21:23
# @Author  :By--Yyang
# @PS      :新手娱乐,代码冗长,见笑了。。。。。。
import re
import requests

def get_uuid1():
    '''
    获取课程的uuid
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getGrade'
    res=requests.get(url=url)
    #print(res.text)
    all_uuid=re.findall('{"uuid":(.*?),',res.text)
    print(all_uuid)

if __name__ == '__main__':
    get_uuid1()

结果如下:

????3.2获取uuid2----在上一个uuid1的基础上,获取uuid2,遍历uuid1,拼接出新的链接。

这里为了测试只拿列表中第一个进行获取结果。。。

def get_uuid2():
    '''
    获取课程的uuid2
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getGradeData?topColumnId={}'.format(951)
    res=requests.get(url=url)
    print(res.text)

结果太多哟,只展示部分:

?继续清晰下数据。。。。。。。

def get_uuid2():
    '''
    获取课程的uuid2
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getGradeData?topColumnId={}'.format(951)
    res=requests.get(url=url)
    #print(res.text)
    all_uuid2=re.findall('"uuid":"(.*?)",',res.text)
    print(all_uuid2)
    return all_uuid2

if __name__ == '__main__':
    #all_uuid1=get_uuid1()
    get_uuid2()

运行结果:

?????????3.3获取课程资源链接,为了测试取第一个。。。

def get_lesson():
    '''
    获取课程资源
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getLessons?courseId={}'.format('66b2bc081ef8f8ae324d79cb2e84a0b8')
    res=requests.get(url=url)
    print(res.text)

if __name__ == '__main__':
    #all_uuid1=get_uuid1()
    #get_uuid2()
    get_lesson()

运行结果:

清晰数据,获取信息---正则上场。

def get_lesson():
    '''
    获取课程资源
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getLessons?courseId={}'.format('66b2bc081ef8f8ae324d79cb2e84a0b8')
    res=requests.get(url=url)
    #print(res.text)
    lessonlink=re.findall('"lessonLink":"(.*?)"',res.text)#上课链接
    pdflink=re.findall('"pdfLink":"(.*?)"',res.text)#课件pdf
    pptlink=re.findall('"pptLink":"(.*?)"',res.text)#课件ppt
    filelink=re.findall('"fileLink":"(.*?)"',res.text)#设计
    descriptionlink=re.findall('"videoLink":"(.*?)"',res.text)#课后答疑
    print('上课视频:', lessonlink)
    print('课件pdf:', pdflink)
    print('课件ppt:', pptlink)
    print('教学设计:', filelink)
    print('课后答疑:', descriptionlink)

if __name__ == '__main__':
    #all_uuid1=get_uuid1()
    #get_uuid2()
    get_lesson()

运行结果:

链接得到了,下再即可。。。。。。。。

至此,分析结束。。。。。。。。。。。。

暂不提供最终代码,谢谢。。。。。。。

#!/user/bin/python3.8
# -*- coding:utf-8 -*-
# @Time    :21:23
# @Author  :By--Yyang
# @PS      :新手娱乐,代码冗长,见笑了。。。。。。
import os
import re
import requests

def get_uuid1():
    '''
    获取课程的uuid1
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getGrade'
    headers = {'Host': 'gzclass.gztv.com',
               'userId': 'null',
               'Accept-Language': 'zh-cn',
               'Accept-Encoding': 'gzip, deflate, br',
               # 'Cookie': '',
               'Connection': 'keep-alive',
               'Accept': '*/*',
               'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/13.0 Safari/604.1',
               'Referer': 'https://gzclass.gztv.com/gksubjecpc/index2.html?columnName=%E4%B8%80%E5%B9%B4%E7%BA%A7&uuid=1029&Gradeindex=0',
               'token': 'null',
               'X-Requested-With': 'XMLHttpRequest'}
    res=requests.get(url=url,headers=headers)
    #print(res.text)
    all_uuid=re.findall('{"uuid":(.*?),',res.text)
    #print(all_uuid)
    return all_uuid

def get_uuid2(a):
    '''
    获取课程的uuid2
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getGradeData?topColumnId={}'.format(a)
    headers = {'Host': 'gzclass.gztv.com',
               'userId': 'null',
               'Accept-Language': 'zh-cn',
               'Accept-Encoding': 'gzip, deflate, br',
               # 'Cookie': '',
               'Connection': 'keep-alive',
               'Accept': '*/*',
               'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/13.0 Safari/604.1',
               'Referer': 'https://gzclass.gztv.com/gksubjecpc/index2.html?columnName=%E4%B8%80%E5%B9%B4%E7%BA%A7&uuid=1029&Gradeindex=0',
               'token': 'null',
               'X-Requested-With': 'XMLHttpRequest'}
    res=requests.get(url=url,headers=headers)
    #print(res.text)
    all_uuid2=re.findall('"uuid":"(.*?)",',res.text)
    #print(all_uuid2)
    return all_uuid2


def get_content(url):
    '''
    本来打算一个个下载的,发现太笨了,,,,,不会线程,进程,异步。。。。。。。。。。
    下下次吧,。。。。。。。
    :return:
    '''
    url = url
    path = url.split('com')
    #print(path)
    headers = {'authority': 'lessons.gztv.com',
               'method': 'GET',
               'path': path[1],
               'scheme': 'https',
               'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
               'accept-encoding': 'gzip, deflate, br',
               'accept-language': 'zh-CN,zh;q=0.9',
               'cache-control': 'max-age=0',
               # 'if-modified-since': 'Mon, 06 Sep 2021 19:35:13 GMT',
               # 'if-none-match': '"D777175AEE428457D46BACE5E3C0C4BC-121"',
               # 'range': 'bytes=0-1048575',
               'sec-ch-ua': '"Chromium";v="21", " Not;A Brand";v="99"',
               'sec-ch-ua-mobile': '?0',
               'sec-ch-ua-platform': '"Windows"',
               'sec-fetch-dest': 'document',
               'sec-fetch-mode': 'navigate',
               'sec-fetch-site': 'none',
               'sec-fetch-user': '?1',
               'upgrade-insecure-requests': '1',
               'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
    res = requests.get(url=url, headers=headers)
    return res.content


def get_lesson(b,pathone):
    '''
    获取课程资源
    :return:
    '''
    url='https://gzclass.gztv.com/hcEdu/pc/getLessons?courseId={}'.format(b)
    headers = {'Host': 'gzclass.gztv.com',
               'userId': 'null',
               'Accept-Language': 'zh-cn',
               'Accept-Encoding': 'gzip, deflate, br',
               # 'Cookie': '',
               'Connection': 'keep-alive',
               'Accept': '*/*',
               'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/13.0 Safari/604.1',
               'Referer': 'https://gzclass.gztv.com/gksubjecpc/video.html?courseId=3a616f2f5345ac43c9f0a303a0792528&type=1&index=0',
               'token': 'null',
               'X-Requested-With': 'XMLHttpRequest'}
    res=requests.get(url=url,headers=headers)
    #print(res.text)
    gradesubject = re.findall('gradeSubject":"(.*?)".*?"unit":"(.*?)",', res.text)  # 课程名称
    lessonlink=re.findall('lessonName":"(.*?)","lessonLink":"(.*?)",',res.text)#上课链接
    pdflink=re.findall('"pdfLink":"(.*?)"',res.text)#课件pdf
    pptlink=re.findall('"pptLink":"(.*?)"',res.text)#课件ppt-----------有些课程没有ppt!!!!!!!
    filelink=re.findall('"fileLink":"(.*?)"',res.text)#设计
    descriptionlink=re.findall('"videoLink":"(.*?)"',res.text)#课后答疑
    print('课程名称:',gradesubject)
    print('上课视频:', lessonlink)
    print('课件pdf:', pdflink)
    print('课件ppt:', pptlink)
    print('教学设计:', filelink)
    print('课后答疑:', descriptionlink)
    try:
        #有些链接是空的---比如课程没有ppt,需要pass
        sp_content = get_content(lessonlink[0][1])
        kj_content = get_content(pdflink[0])
        sj_content = get_content(filelink[0])
        kh_content = get_content(descriptionlink[0])
        kj2_content = get_content(pptlink[0])
    except Exception as e:
        print(e)
        pass
    finally:
        #去掉课程名字里的特殊字符
        name=re.sub("[^\u4e00-\u9fa5]",'', lessonlink[0][0])
        print(name)
        #break
        lesson_path = pathone + '\\' + gradesubject[0][0] + gradesubject[0][1] + '_' +name
        print(lesson_path)
        if not os.path.exists(lesson_path):
            os.mkdir(lesson_path)
        else:
            pass

        os.chdir(lesson_path)

        sp_file = open(name + '.mp4', 'wb')
        sp_file.write(sp_content)
        sp_file.close()

        with open(name + '_课件.pdf', 'wb') as f:
            f.write(kj_content)

        sj_file = open(name + '_教学设计.pdf', 'wb')
        sj_file.write(sj_content)
        sj_file.close()

        kh_file = open(name + '课后答疑.mp4', 'wb')
        kh_file.write(kh_content)
        kh_file.close()

        if len(pptlink)==0:
            pass
        else:
            kj2_file = open(name + '.pptx', 'wb')
            kj2_file.write(kj2_content)
            kj2_file.close()
    #return gradesubject,lessonlink,pdflink,pptlink,filelink,descriptionlink







if __name__ == '__main__':
    pathone = os.getcwd()#获取当前目录
    all_uuid1=get_uuid1()
    for a in all_uuid1:
        all_uuid2=get_uuid2(a)
        #print(all_uuid2)
        for b in all_uuid2:
            get_lesson(b,pathone)

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:10:10  更:2022-09-13 11:10:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:38:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码