Guangzhou共享课程批量下载文件---python

发布于:2022-12-22 ⋅ 阅读:(816) ⋅ 点赞:(0)

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)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到