解析網站爬取騰訊vip視頻


今天用油猴腳本vip一件解析看神奇隊長。想到了問題,這個頁面應該是找到了視頻的api的接口,通過接口調用獲取到了視頻的地址。

那自己找騰訊視頻地址多費勁啊,現在越來越多的參數,眼花繚亂的。

那我就找到這個能夠解析vip視頻的,解析網站的視頻地址,不就OK了。

network上發現,這個視頻是通過ts流的形式。

並且還有視頻地址和index.m3u8,但是我們怎么獲得這些20190527/參數呢。(m3u8中有一部電影的所有ts流參數)

我找到了個api.php,即接口地址,訪問,返回json數據。

url: http://p.p40.top/api.php?url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fxyne4253g35nak3%2Fm0031od9ekb.html

 

看到了視頻流所在地址,然后訪問地址,可以直接下載m3u8文件,文件中就是ts流參數了。

因此思路就是:用py模擬瀏覽器向解析網站的api.php請求你想看的vip視頻的url即http://p.p40.top/api.php?url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fxyne4253g35nak3%2Fm0031od9ekb.html

然后正則匹配到m3u8的地址,去請求后,下載到本地,打開匹配ts流的數字id。

發現視頻地址就是api返回的json數據的url+/1000k/hls/xxx

 

然后依次下載完ts流文件后,保存到本地。再轉化成mp4,明兒實現。網上有些現成的。我試着改編下。

這樣父母不需要怎么操作,我直接下下來本地給他們看就好了。嘿嘿

腳本如下:

# -*- coding: UTF-8 -*-
import requests
import re
import os,shutil
from urllib.request 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鏈接地址
    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:#判斷文件是否已經存在,存在則不操作。不存在才下載。
        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+'保存文件錯誤')



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 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)

 

  

 

 成功,可能是多進程模塊的問題,還是出現了將近15個文件錯誤。少了15個文件,但是為啥爬下來的時長比騰訊視頻里的還長。

 

 

腳本還有很多地方都可以改進(鍛煉自己寫腳本的能力),改成類的調用,通過類中的self,一個函數接着一個函數調用。並且試試用多線程試試,多進程總有奇怪的問題,不統一。

看了一會兒,發現,觀影視覺極差,我感覺丟失的不止是15個文件,音話都不同步了,是不是直接copy拼接命令有瑕疵。有待研究


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM