网页视频抓取脚本( 【】本文)

优采云 发布时间: 2022-03-06 22:07

  网页视频抓取脚本(

【】本文)

  Python爬虫爬取ts片段视频+验证码登录功能

  更新时间:2021-02-22 10:23:14 作者:毛小贤~

  本篇文章主要介绍Python爬虫爬取ts片段视频+验证码登录功能。本文为您介绍的很详细,对您的学习或工作有一定的参考价值。有需要的朋友可以参考以下

  内容

  目标:抓取您帐户中购买的课程视频。

  一、 实现登录账号

  这里采用手动输入验证码的方式,有能力的朋友也可以通过图像识别自动填写验证码。登录后,使用 session 保持登录状态。

  1.获取验证码地址

  第一步:首先查看验证码对应的代码。从图中可以看出验证码图片的地址是:

  红色部分 tmep_seq=08 是为解决浏览器缓存问题而添加的时间戳,所以真正的验证码图片地址为:

  

  第二步:找出登录时提交的表单内容和POST地址。

  (1)用户名、密码和验证码不要填写,直接点击登录,使用Chrome浏览器的网络检查,找到POST地址:

  

  (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文件中的内容如下,记录了每个视频的开始和结束编号。

  

#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 的网络控制台中查找。打开网络控制台,刷新页面,可以找到如图所示的m3u8文件。查看m3u8文件的相关信息,可以看到红框圈出的地址就是这个视频的m3u8下载地址。

  

  对比两个地址可以发现,文件名前的地址是一样的,视频下载地址是“红色标记的地址”+“m3u8文件中列出的视频片段文件名”:

  所以可以将这部分地址设置为:urlroot =

  为了方便下载其他视频时动态修改,改为动态截取:

  

url = input("请输入m3u8文件地址:")

urlRoot=self.url[0:url.rindex('/')]

  2.批量下载ts视频片段

  这一步使用上一步拼接的地址循环下载ts视频。下载时,使用登录时创建的会话进行下载。

  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键确认退出!")

  三、总结

  代码可以实现分段加载视频的爬取功能,还有很多细节需要改进,比如:

  至此,这篇关于Python爬虫爬取ts片段视频+验证码登录功能的文章文章就介绍到这里了。更多相关Python爬虫爬取视频内容,请搜索脚本之家以前的文章或继续浏览以下相关文章希望大家以后多多支持脚本之家!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线