這兩天在爬TX的視頻的原始下載地址媒怯,遇到的問題挺多,感覺這個(gè)網(wǎng)站的規(guī)律變化多端的纵装,中間也忘了修改過多少次代碼了征讲,而且有時(shí)候抓包也抓不到一些想要的內(nèi)容,最后也只能抓到一些像《拜托啦學(xué)妹》橡娄、《國(guó)產(chǎn)整蠱大師》類似的小視頻诗箍,長(zhǎng)時(shí)間的視頻最后我看了一下只能拿到前五分鐘的視頻,現(xiàn)在先記錄一下挽唉,供后續(xù)再研究滤祖。
我是利用Chrome直接進(jìn)行抓包的,可以拿到視頻的真實(shí)地址(ps.但是后續(xù)多次嘗試其他小視頻竟然抓不到這個(gè)真實(shí)地址瓶籽,不知道什么原因):
http://203.205.148.155/vhot2.qqvideo.tc.qq.com/AXTAonPSZxrOwR7IS-ihDRKKiNXe1AI29z6NWNjAUHzQ/u0559hfpsi7.mp4?sdtfrom=v1104&guid=c05f836b267c173e684cec6410185d3b&vkey=9DB055870FCCE159D79ECF6ACD62777A7783FEC58EB4D18F8B3B54164BF7085FDC5E097BF150ADBE2522011A739A844B6AF7FABF6A72D3D9C32E443A11677BBF33E4946EAB82723509823A4045888AE6C5EF367FC4E92603CFFD593945ED4CD9EC1808A02E0B98391D902371DA83641F0173E69E71E1CF50&platform=2
可以進(jìn)行簡(jiǎn)化:
http://203.205.148.155/vhot2.qqvideo.tc.qq.com/u0559hfpsi7.mp4?vkey=9DB055870FCCE159D79ECF6ACD62777A7783FEC58EB4D18F8B3B54164BF7085FDC5E097BF150ADBE2522011A739A844B6AF7FABF6A72D3D9C32E443A11677BBF33E4946EAB82723509823A4045888AE6C5EF367FC4E92603CFFD593945ED4CD9EC1808A02E0B98391D902371DA83641F0173E69E71E1CF50
可以簡(jiǎn)單的分為兩部分:
前半部分:http://203.205.148.155/vhot2.qqvideo.tc.qq.com
后半部分:vid.視頻格式?vkey=...
vid的值可以根據(jù)輸入的小視頻所在的網(wǎng)頁網(wǎng)址獲得匠童;而前半部分以及后半部分的vkey(同一個(gè)視頻不同次請(qǐng)求vkey是不同的)就要根據(jù)抓其他包來獲得了:
可以看看抓到的這個(gè)包的返回值:
前半部分可以在url中拿到(可能存在多個(gè)),后半部分可以通過keyid和fvkey拼接拿到棘劣。
然后我就再回頭看如何請(qǐng)求這個(gè)URL俏让,參數(shù)很多,我也進(jìn)行了多次嘗試:
https://vv.video.qq.com/getinfo?callback=txplayerJsonpCallBack_getinfo_502855&&charge=0&defaultfmt=auto&otype=json&guid=c05f836b267c173e684cec6410185d3b&flowid=16326941443e441cde6cc6bc8600a4e8_70201&platform=70201&sdtfrom=v1104&defnpayver=0&appVer=3.3.125&host=v.qq.com&ehost=https%3A%2F%2Fv.qq.com%2F&sphttps=1&_rnd=1507894470&spwm=4&unid=d2b03881abf611e79d19a042d42c850a&vid=u0559hfpsi7&defn=&fhdswitch=0&show1080p=0&isHLS=1&dtype=3&sphls=1&defsrc=1&_qv_rmt=4N45ERvoA10847LFR%3D&_qv_rmt2=sOgo9dd11579401rg%3D&_1507894470324=
如何拿到這些參數(shù)進(jìn)行請(qǐng)求是個(gè)問題,而且當(dāng)我想進(jìn)行一些適當(dāng)?shù)膮?shù)刪減的時(shí)候發(fā)現(xiàn)我拿到的fvkey并不是完整的(個(gè)數(shù)少了很多)首昔,在這個(gè)問題上糾結(jié)了很多寡喝,最后在搜索,把一些參數(shù)固定住勒奇,簡(jiǎn)化成這樣了:
https://av.video.qq.com/getinfo?callback=JsonpCallBack&&charge=0&defaultfmt=auto&otype=json&guid=c05f836b267c173e684cec6410185d3b&platform=70201&sdtfrom=v1104&defnpayver=0&appVer=3.3.128&host=v.qq.com&ehost=https%3A%2F%2Fv.qq.com%2F&_rnd=1507969615&spwm=4&vid={}&_qv_rmt=ZHrqJgF6A10991DBb%3D&_qv_rmt2=y%2FlweBl0157665zsQ%3D&_1507969615506='.format(vid)
然后就開始寫代碼了:
import requests
from requests.exceptions import RequestException
import re
import json
headers={
'Accept-Encoding':'identity;q=1, *;q=0',
'Accept-Language':'zh-CN,zh;q=0.8',
'Accept':'*/*',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
}
#這一部分是為了得到網(wǎng)頁源代碼
def get_html(url):
response=requests.get(url,headers=headers)
try:
if response.status_code==200:
return response.text
return None
except RequestException as e:
print(e)
return None
#這一部分是為了得到參數(shù)vid
def parse_part_1(url):
try:
vid=url.split('/')[-1].split('.')[0]
print('解析URL第一部分vid:'+vid)
return vid
except Exception:
print('解析vid失敗')
#這一部分是為了得到keyid预鬓、vkey、title赊颠、pre_url
def parse_part_2(html):
try:
pattern=re.compile('JsonpCallBack\((.*)\)',re.S)
data=re.search(pattern,html).group(1)
data=json.loads(data)
keyid=data.get('vl').get('vi')[0].get('cl').get('ci')[0].get('keyid')
if len(keyid.split('.'))==3:
if '10' in keyid:
keyid=keyid.replace('10', 'p')
else:
keyid=list(keyid)
keyid[12]='p'
keyid=''.join(keyid)
else:
keyid=keyid
print('解析URL第二部分keyid:'+keyid)
vkey=data.get('vl').get('vi')[0].get('fvkey')
print('解析URL第二部分vkey:'+vkey)
title=data.get('vl').get('vi')[0].get('ti')
# print('解析URL第二部分title:' + title)
for i in range(4):
pre_url=data.get('vl').get('vi')[0].get('ul').get('ui')[i].get('url')
print('解析URL第二部分pre_url:'+pre_url)
yield {
'keyid':keyid,
'pre_url':pre_url,
'vkey':vkey,
'ti':title
}
except Exception:
print('解析vkey失敗')
#主程序
def main(url):
try:
vid=parse_part_1(url)
if vid:
url='https://av.video.qq.com/getinfo?callback=JsonpCallBack&&charge=0&defaultfmt=auto&otype=json&guid=c05f836b267c173e684cec6410185d3b&platform=70201&sdtfrom=v1104&defnpayver=0&appVer=3.3.128&host=v.qq.com&ehost=https%3A%2F%2Fv.qq.com%2F&_rnd=1507969615&spwm=4&vid={}&_qv_rmt=ZHrqJgF6A10991DBb%3D&_qv_rmt2=y%2FlweBl0157665zsQ%3D&_1507969615506='.format(vid)
html=get_html(url)
if html:
for each in parse_part_2(html):
keyid=each.get('keyid')
pre_url=each.get('pre_url')
vkey=each.get('vkey')
title=each.get('ti')
url=pre_url+str(keyid)+'.mp4?vkey='+str(vkey)
print('=====視頻:{0}=====下載URL:{1}'.format(title,url)+'\n')
except Exception:
print('解析視頻下載URL失敗')
if __name__=='__main__':
print('溫馨提醒:e.g. https://v.qq.com/x/page/g0024s8pd38.html' )
url=input('請(qǐng)輸入騰訊視頻地址:')
main(url)
運(yùn)行后的結(jié)果,得到的下載地址有多個(gè)格二,可隨便打開一個(gè):
現(xiàn)在程序還是存在一定問題,比如keyid的討論竣蹦,比如不能得到大文件的完整視頻顶猜,待后續(xù)進(jìn)行研究。