運(yùn)轉(zhuǎn)情形
IDE:pycharm
python:3.6.5
實(shí)現(xiàn)目的
實(shí)現(xiàn)對騰訊視頻方針url的解析與下載,由于第三方vip解析,只供給在線傍不雅觀不雅觀,潛匿想實(shí)現(xiàn)對方針視頻的下載
實(shí)現(xiàn)思緒
首先拿到想要看的騰訊片子url,經(jīng)由過程第三方vip視頻解析網(wǎng)站停止解析,經(jīng)由過程抓包,模仿閱讀器發(fā)送正常哀求,經(jīng)由過程拿到緩存ts文件,下載視頻ts文件,末了經(jīng)由過程轉(zhuǎn)換為mp4文件,即可實(shí)現(xiàn)正常播放
源碼
import re
import os,shutil
import requests,threading
from urllib.request import urlretrieve
from pyquery import PyQuery as pq
from multiprocessing import Pool
class video_down():
def __init__(self,url):
# 拼接全民解析url
self.api='https://jx.618g.com'
self.get_url = 'https://jx.618g.com/?url=' + url
#設(shè)置UA模仿閱讀器訪謁
self.head = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
#設(shè)置多線程數(shù)目
self.thread_num=32
#當(dāng)前已經(jīng)下載的文件數(shù)目
self.i = 0
# 挪用網(wǎng)頁獲取
html = self.get_page(self.get_url)
if html:
# 解析網(wǎng)頁
self.parse_page(html)
def get_page(self,get_url):
try:
print('正在哀求方針網(wǎng)頁....',get_url)
response=requests.get(get_url,headers=self.head)
if response.status_code==200:
#print(response.text)
print('哀求方針網(wǎng)頁完成....\n 預(yù)備解析....')
self.head['referer'] = get_url
return response.text
except Exception:
print('哀求方針網(wǎng)頁失敗,請搜檢錯誤重試')
return None
def parse_page(self,html):
print('方針信息正在解析........')
doc=pq(html)
self.title=doc('head title').text()
print(self.title)
url = doc('#player').attr('src')[14:]
html=self.get_m3u8_1(url).strip()
#self.url = url + '800k/hls/index.m3u8'
self.url = url[:-10] +html
print(self.url)
print('解析完成,獲取緩存ts文件.........')
self.get_m3u8_2(self.url)
def get_m3u8_1(self,url):
try:
response=requests.get(url,headers=self.head)
html=response.text
print('獲取ts文件成功,預(yù)備提守信息')
return html[-20:]
except Exception:
print('緩存文件哀求錯誤1,請搜檢錯誤')
def get_m3u8_2(self,url):
try:
response=requests.get(url,headers=self.head)
html=response.text
print('獲取ts文件成功,預(yù)備提守信息')
self.parse_ts_2(html)
except Exception:
print('緩存文件哀求錯誤2,請搜檢錯誤')
def parse_ts_2(self,html):
pattern=re.compile('.*?(.*?).ts')
self.ts_lists=re.findall(pattern,html)
print('信息提取完成......\n預(yù)備下載...')
self.pool()
def pool(self):
print('經(jīng)計(jì)較必要下載%d個文件' % len(self.ts_lists))
self.ts_url = self.url[:-10]
if self.title not in os.listdir():
os.makedirs(self.title)
print('正不才載...所需時辰較長,請耐心等待..')
#開啟多歷程下載
pool=Pool(16)
pool.map(self.save_ts,[ts_list for ts_list in self.ts_lists])
pool.close()
pool.join()
print('下載完成')
self.ts_to_mp4()
def ts_to_mp4(self):
print('ts文件正在停止轉(zhuǎn)錄mp4......')
str='copy /b '+self.title+'\*.ts '+self.title+'.mp4'
os.system(str)
filename=self.title+'.mp4'
if os.path.isfile(filename):
print('轉(zhuǎn)換完成,祝你不雅觀不雅觀影快樂')
shutil.rmtree(self.title)
def save_ts(self,ts_list):
try:
ts_urls = self.ts_url + '{}.ts'.format(ts_list)
self.i += 1
print('當(dāng)前進(jìn)度%d/%d'%(self.i,len(self.ts_lists)))
urlretrieve(url=ts_urls, filename=self.title + '/{}.ts'.format(ts_list))
except Exception:
print('保留文件出現(xiàn)錯誤')
if __name__ == '__main__':
#片子方針url:狄仁杰之四大天王
url='https://v.qq.com/x/cover/r6ri9qkcu66dna8.html'
#片子碟中諜5:奧秘國家
url1='https://v.qq.com/x/cover/5c58griiqftvq00.html'
#電視劇斗破蒼穹
url2='https://v.qq.com/x/cover/lcpwn26degwm7t3/z0027injhcq.html'
url3='https://v.qq.com/x/cover/33bfp8mmgakf0gi.html'
video_down(url2)
視頻緩存ts文件
這里都是一些緩存視頻文件,每個只需幾秒鐘播放,末了必要合并成一個mp4名目的視頻,就可以正常播放,默認(rèn)高清下載
注意這里的進(jìn)度由于使用多歷程下載,進(jìn)度僅供參考,沒有切當(dāng)表示進(jìn)度,可以進(jìn)文件夾檢察正常進(jìn)度,可以理解為表示一次進(jìn)度,下載一個ts文件
實(shí)現(xiàn)了局
私信小編007即可獲取數(shù)十套PDF的獲取編制哦!