解析⽹站爬取腾讯vip视频
今天⽤油猴脚本vip⼀件解析看神奇队长。想到了问题,这个页⾯应该是到了视频的api的接⼝,通过接⼝调⽤获取到了视频的地址。
那⾃⼰腾讯视频地址多费劲啊,现在越来越多的参数,眼花缭乱的。
那我就到这个能够解析vip视频的,解析⽹站的视频地址,不就OK了。
network上发现,这个视频是通过ts流的形式。
并且还有视频地址和index.m3u8,但是我们怎么获得这些20190527/参数呢。(m3u8中有⼀部电影的所有ts流参数)
我到了个api.php,即接⼝地址,访问,返回json数据。
看到了视频流所在地址,然后访问地址,可以直接下载m3u8⽂件,⽂件中就是ts流参数了。
然后正则匹配到m3u8的地址,去请求后,下载到本地,打开匹配ts流的数字id。
发现视频地址就是api返回的json数据的url+/1000k/hls/xxx
然后依次下载完ts流⽂件后,保存到本地。再转化成mp4,明⼉实现。⽹上有些现成的。我试着改编下。
这样⽗母不需要怎么操作,我直接下下来本地给他们看就好了。嘿嘿
脚本如下:
# -*- coding: UTF-8 -*-
import requests
import re
import os,shutil
quest import urlretrieve
from multiprocessing import Pool
def cbk(a,b,c):
'''''回调函数
@a:已经下载的数据块
@b:数据块的⼤⼩
@c:远程⽂件的⼤⼩
'''
per=100.0*a*b/c
if per>100:
per=100
print('%.2f%%' % per)
def get_api_data(QQ_film_url): #正则匹配获取api返回的index.m3u8链接地址chrome直接下载
api_url='p/api.php'
user_agent={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}    get_url=api_url+'?url='+QQ_film_url
print(get_url)
(get_url,headers=user_agent).text
pattern=repile('url.*?m3u8')
get_data=pattern.findall(response)[0][6:].replace('\\','')
return get_data
def m3u8_download(m3u8_url):#获取下载m3u8⽂件
if ists('F:\\vip电影\\index.m3u8')!=True:#判断⽂件是否已经存在,存在则不操作。不存在才下载。
urlretrieve(url=m3u8_url, filename=path, reporthook=cbk)
else:
print(path+'已存在')
def get_ts():#通过m3u8⽂件,正则匹配需要的ts流
with open(path)as f:
ad()
pattern=repile('.*.ts')
get_ts_data=re.findall(pattern,data)
return get_ts_data
def ts_download(ts_list):#下载ts流
try:
ts_url = m3u8_url[:-10]+'{}'.format(ts_list)#获取ts流 url地址
urlretrieve(url=ts_url, filename=path[:-10] + r'\\' + '{}'.format(ts_url[-8:]))
except Exception:
print(ts_url+'保存⽂件错误')
def pool(ts_list):#多进程爬取所有的ts流到⽂件夹中,参考的那个py脚本,没⽤过pool进程池
print('经过计算,需要下载%s个⽂件'%len(ts_list))
print(ts_list[0])
pool=Pool(16)
pool.map(ts_download,[i for i in ts_list])
pool.close()
pool.join()
print('下载完成')
ts_to_mp4()
def ts_to_mp4():
print('dos实现ts合并为mp4')
str = 'copy /b ' + r'F:\vip电影' + '\*.ts ' + ''+ r'F:\vip电影\gogogo' + '\jingqi.mp4'
os.system(str)
if ists('F:\\vip电影\\gogogo\\jingqi.mp4')==True:
print('good job')
path = 'F:\\vip电影\\index.m3u8'
url = 'v.qq/x/cover/xyne4253g35nak3/m0031od9ekb.html'
m3u8_url = get_api_data(url)[:-10] + '1000k/hls/index.m3u8'
print(m3u8_url)
m3u8_download(m3u8_url)
ts_list = get_ts()
if__name__ == '__main__':
pool(ts_list)
成功,可能是多进程模块的问题,还是出现了将近15个⽂件错误。少了15个⽂件,但是为啥爬下来的时长⽐腾讯视频⾥的还长。
脚本还有很多地⽅都可以改进(锻炼⾃⼰写脚本的能⼒),改成类的调⽤,通过类中的self,⼀个函数接着⼀个函数调⽤。并且试试⽤多线程试试,多进程总有奇怪的问题,不统⼀。看了⼀会⼉,发现,观影视觉极差,我感觉丢失的不⽌是15个⽂件,⾳话都不同步了,是不是直接copy拼接命令有瑕疵。有待研究

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。