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)
|