目标:爬取自己账号中购买的课程视频。
一、实现登录账号
这里采用的是手动输入验证码的方式,有能力的盆友也可以通过图像识别的方式自动填写验证码。登录后,采用session保持登录。
1.获取验证码地址
第一步:首先查看验证码对应的代码,可以从图中看到验证码图片的地址是:https://per.enetedu.com/Common/CreateImage"text-align: center">
第二步:找出登录时提交的表单内容和POST地址。
(1) 不填写用户名密码和验证码,直接点击登录,使用Chrome浏览器的Network检查,找到POST地址:https://per.enetedu.com/AdminIndex/LoginDo
(2) 继续向下看,找到提交的表单 Form Data。
因此带有验证码的登录代码如下:
import requests from PIL import Image #用户名-密码-验证码方式,登录 CaptchaUrl = "https://per.enetedu.com/Common/CreateImage" #获取验证码地址 PostUrl = "https://per.enetedu.com/AdminIndex/LoginDo" #post登录信息地址 client = requests.Session() username = '替换为自己的用户名' password = '替换为自己的密码' qr_code = client.get(CaptchaUrl) open('login.jpg', 'wb').write(qr_code.content) #将验证码图片保存至本地 img = Image.open('login.jpg') img.show() #打开图片 code = input("请输入验证码: \n") #输入验证码 postData = { #构造POST表单 'email': username, 'pwd': password, 'validateCode': code, 'x': '22', 'y': '19' } result = client.post(PostUrl,postData) #向PostUrl提交表单
二、实现ts碎片视频下载,并转换为mp4格式
1.分析视频下载地址
登录成功后,检查视频播放div对应的代码,企图找到视频地址直接保存至本地。结果,如下图所示,整个视频是被分割成一段一段的.ts文件,分段加载到页面中播放。GET每段视频的地址为右侧红框圈起来的部分。
百度后才知道,整个视频如何分段是由一个m3u8文件来决定的。m3u8文件中的内容如下所示,记录了每段视频start和end的编号。
#EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:10 #EXTINF:10.000000, start_0-end_765064-record.gv.ts #EXTINF:10.000000, start_765064-end_1769567-record.gv.ts #EXTINF:10.000000, start_1769567-end_2600798-record.gv.ts #EXTINF:10.000000, start_2600798-end_3593502-record.gv.ts #EXTINF:10.000000, start_3593502-end_4500784-record.gv.ts #EXTINF:10.000000, start_4500784-end_5399861-record.gv.ts #EXTINF:10.000000, start_5399861-end_6288622-record.gv.ts #EXTINF:10.000000, start_6288622-end_7044459-record.gv.ts #EXTINF:10.000000, start_7044459-end_7878487-record.gv.ts #EXTINF:10.000000, start_7878487-end_8811793-record.gv.ts #EXTINF:10.000000,
因此,下载视频的关键是获取m3u8文件,通过这个视频的m3u8文件来分段下载视频。
我是人工找出m3u8的下载地址,暂时还没研究出来怎么通过视频地址自动解析出m3u8地址。找的方法很简单,还是在Chrome的Network控制台找。打开Network控制台,刷新页面,就可以找到如图所示的m3u8文件。查看m3u8文件的相关信息,可以看到红框圈起来的地址就是这个视频的m3u8下载地址。
对比两个地址,可以发现文件名前的地址相同,视频下载地址即为"标红地址"+"m3u8文件中列出的视频段文件名":
https://bcdn.enetedu.com/conv/cdnfile/video/2016_06_27/1467034852884_f5821b/hi/record.m3u8
https://bcdn.enetedu.com/conv/cdnfile/video/2016_06_27/1467034852884_f5821b/hi/start_643887-end_1083181-record.gv.ts
因此可以将这部分地址设为:urlroot = https://bcdn.enetedu.com/conv/cdnfile/video/2016_06_27/1467034852884_f5821b/hi
为了方便下载其他视频时动态修改,改为动态截取:
url = input("请输入m3u8文件地址:") urlRoot=self.url[0:url.rindex('/')]
2.批量下载ts视频片段
这一步使用上一步拼接的地址循环下载ts视频即可。下载时,使用登录时创建的session下载。
session是会话的意思,它可以让服务器“认得”客户端。简单理解就是,把每一个客户端和服务器的互动当作一个“会话”。既然在同一个“会话”里,服务器自然就能知道这个客户端是否登录过。代码如下:
client = requests.Session() client.post(PostUrl,postData) #登录 resp = client.get(download_path) #下载
碎片拼接的方法:下载完第一个ts片段后,直接在该文件后面继续写第二个ts片段,以此类推。而不是新建一个文件写入。与验证码登录结合起来,完整代码如下:
import requests from PIL import Image import sys import m3u8 import time import os #用户名-密码-验证码方式,登录 CaptchaUrl = "https://per.enetedu.com/Common/CreateImage" #获取验证码地址 PostUrl = "https://per.enetedu.com/AdminIndex/LoginDo" #post登录信息地址 client = requests.Session() username = '526257482@qq.com' password = 'dashuju_9514' qr_code = client.get(CaptchaUrl) open('login.jpg', 'wb').write(qr_code.content) #将验证码图片保存至本地 img = Image.open('login.jpg') img.show() #打开图片 code = input("请输入验证码: \n") #输入验证码 postData = { #构造POST表单 'email': username, 'pwd': password, 'validateCode': code, 'x': '56', 'y': '19' } result = client.post(PostUrl,postData) #向PostUrl提交表单 #循环下载ts视频 class VideoCrawler(): def __init__(self,url): super(VideoCrawler, self).__init__() self.url=url self.final_path=r"D:\Download\Film" #下载并解析m3u8文件 def get_url_from_m3u8(self,readAdr): print("正在解析真实下载地址...") with open('temp.m3u8','wb') as file: file.write(requests.get(readAdr).content) m3u8Obj=m3u8.load('temp.m3u8') print("解析完成") return m3u8Obj.segments def run(self): print("Start!") start_time=time.time() realAdr = self.url #m3u8下载地址 urlList=self.get_url_from_m3u8(realAdr) #解析m3u8文件,获取下载地址 urlRoot=self.url[0:self.url.rindex('/')] i=1 outputfile=open(os.path.join(self.final_path,'%s.ts'%self.fileName),'wb')#初始创建一个ts文件,之后每次循环将ts片段的文件流写入此文件中从而不需要在去合并ts文件 for url in urlList: try: download_path = "%s/%s" % (urlRoot, url.uri) #拼接地址 resp = client.get(download_path) #使用拼接地址去爬取数据 progess = i/len(urlList)#记录当前的爬取进度 outputfile.write(resp.content) #将爬取到ts片段的文件流写入刚开始创建的ts文件中 sys.stdout.write('\r正在下载:{},进度:{:.2%}'.format(self.fileName,progess))#通过百分比显示下载进度 sys.stdout.flush()#通过此方法将上一行代码刷新,控制台只保留一行 except Exception as e: print("\n出现错误:%s",e.args) continue#出现错误跳出当前循环,继续下次循环 i+=1 outputfile.close() print("下载完成!总共耗时%d s"%(time.time()-start_time)) print("开始转换视频格式!") success = os.system(r'copy /b D:\Download\Film\{0}.ts D:\Download\Film\{0}.mp4'.format(self.fileName)) #ts转成mp4格式 if (not success): print("格式转换成功!") os.remove(self.final_path+'\\'+self.fileName+".ts") #删除ts和m3u8临时文件 os.remove("temp.m3u8") if __name__=='__main__': m3u8_addr = input("输入m3u8文件下载地址:\n") crawler=VideoCrawler(m3u8_addr) crawler.fileName = input("输入文件名:\n") crawler.run() quitClick=input("请按Enter键确认退出!")
三、总结
代码可以实现分段加载视频的爬取功能,其中还有很多细节待完善如:
- 验证码可以通过图像识别的方法自动识别。
- 通过解析视频地址获取m3u8文件,非计算机专业人使用起来更加友好。
- 例子中的网站没有对m3u8文件进行加密,涉及到加密的m3u8还需要加一步解密的过程。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 孙悦.1996-伙伴【正大国际】【WAV+CUE】
- 纪钧瀚《钢琴阅读时光 雨中书店聆听轻音乐》[FLAC/分轨][399.62MB]
- 证声音乐图书馆《走向自然 疗心爵士乐》[320K/MP3][87.4MB]
- 证声音乐图书馆《走向自然 疗心爵士乐》[FLAC/分轨][184.94MB]
- 陈慧娴.2018-Priscilla-Ism演唱会3CD(2024环球红馆40复刻系列)【环球】【WAV+CUE】
- 郑秀文.1999-我应该得到(国)【华纳】【WAV+CUE】
- 陈家慧.2011-钢琴酒吧2CD【龙吟唱片】【WAV+CUE】
- 证声音乐图书馆《雨季 蓝调吉他 Rainy Blues》[320K/MP3][45.01MB]
- 证声音乐图书馆《雨季 蓝调吉他 Rainy Blues》[FLAC/分轨][109.13MB]
- 赞多《序章》[320K/MP3][45.54MB]
- 许巍.2004-每一刻都是崭新的【步升大风】【WAV+CUE】
- 群星.2024-四方馆影视原声带【韶愔音乐】【FLAC分轨】
- 陈雷.1997-安锁咧【金圆唱片】【WAV+CUE】
- 关淑怡.2013-MY.FAVORITE.SK.3CD【环球】【WAV+CUE】
- Sweety.2006-花言乔语【丰华】【WAV+CUE】