解析网站爬取腾讯vip视频
今天用油猴腳本vip一件解析看神奇隊(duì)長。想到了問題,這個(gè)頁面應(yīng)該是找到了視頻的api的接口,通過接口調(diào)用獲取到了視頻的地址。
那自己找騰訊視頻地址多費(fèi)勁啊,現(xiàn)在越來越多的參數(shù),眼花繚亂的。
那我就找到這個(gè)能夠解析vip視頻的,解析網(wǎng)站的視頻地址,不就OK了。
network上發(fā)現(xiàn),這個(gè)視頻是通過ts流的形式。
并且還有視頻地址和index.m3u8,但是我們?cè)趺传@得這些20190527/參數(shù)呢。(m3u8中有一部電影的所有ts流參數(shù))
我找到了個(gè)api.php,即接口地址,訪問,返回json數(shù)據(jù)。
url: http://p.p40.top/api.php?url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fxyne4253g35nak3%2Fm0031od9ekb.html
看到了視頻流所在地址,然后訪問地址,可以直接下載m3u8文件,文件中就是ts流參數(shù)了。
因此思路就是:用py模擬瀏覽器向解析網(wǎng)站的api.php請(qǐng)求你想看的vip視頻的url即http://p.p40.top/api.php?url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fxyne4253g35nak3%2Fm0031od9ekb.html
然后正則匹配到m3u8的地址,去請(qǐng)求后,下載到本地,打開匹配ts流的數(shù)字id。
發(fā)現(xiàn)視頻地址就是api返回的json數(shù)據(jù)的url+/1000k/hls/xxx
然后依次下載完ts流文件后,保存到本地。再轉(zhuǎn)化成mp4,明兒實(shí)現(xiàn)。網(wǎng)上有些現(xiàn)成的。我試著改編下。
這樣父母不需要怎么操作,我直接下下來本地給他們看就好了。嘿嘿
腳本如下:
# -*- coding: UTF-8 -*-
import requests
import re
import os,shutil
from urllib.request import urlretrieve
from multiprocessing import Pool
def cbk(a,b,c):
'''''回調(diào)函數(shù)
@a:已經(jīng)下載的數(shù)據(jù)塊
@b:數(shù)據(jù)塊的大小
@c:遠(yuǎn)程文件的大小
'''
per=100.0*a*b/c
if per>100:
per=100
print('%.2f%%' % per)
def get_api_data(QQ_film_url): #正則匹配獲取api返回的index.m3u8鏈接地址
api_url='http://p.p40.top/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)
response=requests.get(get_url,headers=user_agent).text
pattern=re.compile('url.*?m3u8')
get_data=pattern.findall(response)[0][6:].replace('\','')
return get_data
def m3u8_download(m3u8_url):#獲取下載m3u8文件
if os.path.exists('F:\vip電影\index.m3u8')!=True:#判斷文件是否已經(jīng)存在,存在則不操作。不存在才下載。
urlretrieve(url=m3u8_url, filename=path, reporthook=cbk)
else:
print(path+'已存在')
def get_ts():#通過m3u8文件,正則匹配需要的ts流
with open(path)as f:
data=f.read()
pattern=re.compile('.*.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+'保存文件錯(cuò)誤')
def pool(ts_list):#多進(jìn)程爬取所有的ts流到文件夾中,參考的那個(gè)py腳本,沒用過pool進(jìn)程池
print('經(jīng)過計(jì)算,需要下載%s個(gè)文件'%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實(shí)現(xiàn)ts合并為mp4')
str = 'copy /b ' + r'F:vip電影' + '*.ts ' + ' '+ r'F:vip電影gogogo' + 'jingqi.mp4'
os.system(str)
if os.path.exists('F:\vip電影\gogogo\jingqi.mp4')==True:
print('good job')
path = 'F:\vip電影\index.m3u8'
url = 'https://v.qq.com/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)
成功,可能是多進(jìn)程模塊的問題,還是出現(xiàn)了將近15個(gè)文件錯(cuò)誤。少了15個(gè)文件,但是為啥爬下來的時(shí)長比騰訊視頻里的還長。
腳本還有很多地方都可以改進(jìn)(鍛煉自己寫腳本的能力),改成類的調(diào)用,通過類中的self,一個(gè)函數(shù)接著一個(gè)函數(shù)調(diào)用。并且試試用多線程試試,多進(jìn)程總有奇怪的問題,不統(tǒng)一。
看了一會(huì)兒,發(fā)現(xiàn),觀影視覺極差,我感覺丟失的不止是15個(gè)文件,音話都不同步了,是不是直接copy拼接命令有瑕疵。有待研究
總結(jié)
以上是生活随笔為你收集整理的解析网站爬取腾讯vip视频的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想王传东回应“宁愿放弃5G也不选华为”
- 下一篇: 微软 Win11 文件资源管理器全新设计