如果你只想在線看視頻可以去看這篇博客:python實現通過指定瀏覽器免費觀看vip視頻
先看一下我們程序運行的結果
我們要解析的接口就是(就是這個“接口+視頻地址”可以解析出vip視頻,但是你只能看,不能下載,這里我們講怎么去通過python下載它)
self.api = 'http://jx.idc126.net/jx/?url='
1、我們打開fiddler抓包工具,然后打開解析視頻頁面,對其進行抓包
2、我們通過分析fiddler抓取的數據包可以找出來一個post請求的數據包,它的響應數據里面有一個m3u8文件
3、這個文件是干什么的呢,我們下載下來看看(或者你可以不下載,通過request來得到它)
下面給出一部分
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-TARGETDURATION:13 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:11.960, 00_m0034ealtm7.321004.1.ts?index=0&start=0&end=11960&brs=0&bre=1346643&ver=4&token=417e80a5285647da52a3ce86f2f3de94 #EXTINF:11.640, 01_m0034ealtm7.321004.1.ts?index=1&start=11960&end=23600&brs=1346644&bre=2687835&ver=4&token=b873fda12617909f994f8047cb8e6153 #EXTINF:11.520, 02_m0034ealtm7.321004.1.ts?index=2&start=23600&end=35120&brs=2687836&bre=4974103&ver=4&token=150a9d4990a7730f645144382b2fa55f #EXTINF:10.240, 03_m0034ealtm7.321004.1.ts?index=3&start=35120&end=45360&brs=4974104&bre=8842955&ver=4&token=9eeb5378d61d9f2b1abbc0e001d4412c #EXTINF:10.040, 04_m0034ealtm7.321004.1.ts?index=4&start=45360&end=55400&brs=8842956&bre=11803391&ver=4&token=47a6828e844862815e2e5ac8420dbe17
4、很懵,不知道這是什么,那我們先去看看抓取到的視頻數據包,你把它的請求頭在瀏覽器中打開就會下載一個ts文件,這是一個視頻文件
它不全,只是視頻的一部分(幾十秒,或十幾秒)
5、我們可以從上圖中看到這樣的視頻數據包不止一個,那么這個時候就很難受了,一個視頻十幾秒,難不成一個大視頻我們分成無數的小視頻去看(oh!no!)
這個時候我就在想了,可以可以把多個ts視頻合並成一個,答案是可以(yes!yes!yes!)
既然這樣,我們就可以通過“ab”方式去到所有ts小視頻寫入視頻內容到一個mp4文件里面
這樣的話我們就去看看這些ts小視頻的url有沒有什么規律(正常思維嘛^_^)
https://omts.tc.qq.com/moviets.tc.qq.com/ARF0VZJeyV4IhDCMh--Punp_e4JRrfixSD6F4zRjVKCM/uwMROfz2r5xhIaQXGdGnC2df64gZXNTMZvhtgq7maR8xuHpV/dSIdb30WOoG1mXzTAY4_dppqT81rMbPF0VeWLtyDlV_netQkbPmwLbZo-p30yJ8n3nObUSaqJGp_xD0NfrgEdzFdufZ7QHmSIJYX5qb7rB_gpg8YCNg8--j3ycIpD1aEKGK5kwCq70Ok9SlXSAhZsg/00_m0034ealtm7.321004.1.ts?index=0&start=0&end=11960&brs=0&bre=1346643&ver=4&token=417e80a5285647da52a3ce86f2f3de94 HTTP/1.1
https://omts.tc.qq.com/moviets.tc.qq.com/ARF0VZJeyV4IhDCMh--Punp_e4JRrfixSD6F4zRjVKCM/uwMROfz2r5xhIaQXGdGnC2df64gZXNTMZvhtgq7maR8xuHpV/dSIdb30WOoG1mXzTAY4_dppqT81rMbPF0VeWLtyDlV_netQkbPmwLbZo-p30yJ8n3nObUSaqJGp_xD0NfrgEdzFdufZ7QHmSIJYX5qb7rB_gpg8YCNg8--j3ycIpD1aEKGK5kwCq70Ok9SlXSAhZsg/01_m0034ealtm7.321004.1.ts?index=1&start=11960&end=23600&brs=1346644&bre=2687835&ver=4&token=b873fda12617909f994f8047cb8e6153 HTTP/1.1
https://omts.tc.qq.com/moviets.tc.qq.com/ARF0VZJeyV4IhDCMh--Punp_e4JRrfixSD6F4zRjVKCM/uwMROfz2r5xhIaQXGdGnC2df64gZXNTMZvhtgq7maR8xuHpV/dSIdb30WOoG1mXzTAY4_dppqT81rMbPF0VeWLtyDlV_netQkbPmwLbZo-p30yJ8n3nObUSaqJGp_xD0NfrgEdzFdufZ7QHmSIJYX5qb7rB_gpg8YCNg8--j3ycIpD1aEKGK5kwCq70Ok9SlXSAhZsg/02_m0034ealtm7.321004.1.ts?index=2&start=23600&end=35120&brs=2687836&bre=4974103&ver=4&token=150a9d4990a7730f645144382b2fa55f HTTP/1.1
6、視頻鏈接很長,這里怎么找我就不去說了,直接說結果
上面視頻鏈接前部分都一樣,后半部分不同,但是后半部分來自於上面的那個m3u8文件中(找了半天,呼~~~~~)
7、這個時候我們就要去找一下視頻鏈接前半部分在哪,這里還是說結果
視頻鏈接前半部分就是m3u8文件的前半部分鏈接(很牛掰!!!)
8、找到現在可以說只要能獲取m3u8文件和鏈接,那么所有問題都無了
那么我們就去分析一下m3u8這個文件鏈接在哪搞出來的
沒錯!就是最開始的post請求的響應文本
那么我們就去搞這個post請求的請求頭
#post請求的url地址 POST http://jx.idc126.net/jx/api.php#post請求的參數
url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fmzc00200fdthd81.html&referer=&ref=0&time=1596331710&type=&other=aHR0cHM6Ly92LnFxLmNvbS94L2NvdmVyL216YzAwMjAwZmR0aGQ4MS5odG1s&ios=
分析一下這個url(你可以多找幾個這樣的post請求對比着看)
我們的url參數就是我們要看的vip視頻地址,time的值在“解析接口+vip視頻地址”這個網頁的html中,other的值不變就行
其實也不用問怎么找出來的,就一直找,,,,沒什么說的
找完了,在程序中構造一個data的數據,然后一步一步進行就行
post+data----->m3u8鏈接+文件--------->搞出視頻鏈接前半部分+后半部分--------->講多個ts視頻用ab方式寫入一個文件
代碼(愛奇藝/騰訊視頻/優酷/芒果/土豆/樂視的播放鏈接都可以):
import requests,re,json,sys class video_downloader(): def __init__(self, url): self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' } self.get_name(url) # self.server = 'https://omts.tc.qq.com/' self.api = 'http://jx.idc126.net/jx/?url=' self.get_url_api = 'http://jx.idc126.net/jx/api.php' self.url = url.split('#')[0] self.target = self.api + self.url self.s = requests.session() """ 函數說明:獲取key、time、url等參數 Parameters: 無 Returns: 無 Modify: 2017-09-18 """ def get_name(self,url): res = requests.get(url, headers=self.headers) res.encoding = res.apparent_encoding html = res.text pattern1 = '<title>(.*?)</title>' self.name = re.search(pattern1, html).group(1) def get_key(self): req = self.s.get(url=self.target) req.encoding = 'utf-8' html = req.text pattern1 = "url':'(.*?)'" self.param_url = re.search(pattern1, html, re.S) limit = 0 if limit == 5: sys.exit(0) if self.param_url == None: self.get_key() limit = limit+1 else: self.param_url = self.param_url.group(1) pattern2 = "time':'(.*?)'" self.param_time = re.search(pattern2, html, re.S) if self.param_time == None: self.get_key() limit = limit+1 else: self.param_time = self.param_time.group(1) """ 函數說明:獲取視頻地址 Parameters: 無 Returns: video_url - 視頻存放地址 Modify: 2017-09-18 """ def get_url(self): data = { 'time': self.param_time, 'other': 'aHR0cHM6Ly92LnFxLmNvbS94L2NvdmVyL216YzAwMjAwZmR0aGQ4MS5odG1s', 'url': self.param_url, 'type': '', 'ref': '0' } req = self.s.post(url=self.get_url_api,data=data) req.encoding = req.apparent_encoding #print(req.text) self.down_pre_url = json.loads(req.text)['url'] self.down_pre_url = self.down_pre_url.replace('\\','') req = self.s.get(self.down_pre_url) html = req.text # print(html) pattern1 = ',.(.*?)#' res = re.finditer(pattern1, html, re.S) self.update_url() print('視頻{}已開始下載.......'.format(self.name)) for i in res: # print(i.group(1)) self.get_down_vedio(i.group(1)) self.down_vedio() print('視頻{}下載完成!!!'.format(self.name)) ''' pattern1 = ',.(.*?)#' url_old = re.search(pattern1, html, re.S).group(1) index = url_old.find('start') url_new = url_old[0:index + 6] + '1' + url_old[index + 7:len(url_old)] print(self.down_pre_url) print(url_new) return url_new''' def get_down_vedio(self,down_suf_url): # print(self.down_pre_url[0:aim + 1]) self.vedio_url = self.down_pre_url+down_suf_url # print(self.vedio_url) def update_url(self): aim = 0 for i in range(0, len(self.down_pre_url) - 5): if self.down_pre_url[i - 1] == '/': aim = i - 1 self.down_pre_url = self.down_pre_url[0:aim + 1] def down_vedio(self): film = requests.get(self.vedio_url, headers=self.headers).content with open(self.name+'.mp4', 'a+b') as f: f.write(film) if __name__ == '__main__': url = 'https://v.qq.com/x/cover/mzc00200fdthd81.html' #vip視頻鏈接 vd = video_downloader(url) vd.get_key() vd.get_url() # https://v.qq.com/x/cover/mzc00200fdthd81.html # http://www.iqiyi.com/w_19rqswhlx9.html?vfm=m_103_txsp