爬某牙小姐姐視訊 - Python
阿新 • • 發佈:2021-10-29
爬某牙小姐姐視訊,播放量最多的那種。因為資料提取很繁瑣,就不bb了。直接上程式碼,程式碼裡有註釋。
""" 試爬某牙的視訊,養養眼 """ import os import pprint import re import requests # 視訊地址:https://v.huya.com/ ->頻道,星宿顏值->最多播放 filePath = 'video\\' # 要儲存的地址 if not os.path.exists(filePath): os.mkdir(filePath) # 首先請求的是視訊列表頁面,獲取視訊id url = 'https://v.huya.com/g/all_most_31' # 視訊列表頁面 # 請求引數 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36', } # 請求資料 response = requests.get(url=url, headers=headers) # print(response.text) # 用正則表示式找到視訊列表id results = re.findall('<a href="//v.huya.com/play/(\d+)\.html"', response.text) # print(results) # 找到了視訊列表id之後,現在要確定視訊播放來源, # 隨便點開一個視訊播放,找到它請求的播放地址 # 發現為類似的:https://huya-w20.huya.com/2120/510233425/1300/e0817db60b0729879b0a5553d7474214.mp4?bitrate=1401&client=22&definition=1300&pid=1199564385429&scene=vod&vid=510233425 # 複製.mp4前面的字串,在開發者工具裡進行查詢,看它的最終源 # 發現有類似json的資料,展開檢視,發現正是需要的資料來源 # 請求json資料 for vedioId in results: # # 構造視訊列表播放請求的url # videoPlayurl = f'https://liveapi.huya.com/moment/getMomentContent?callback=jQuery1124037387656100533784_1635472169330&' \ # f'videoId={vedioId}&uid=&_=1635472169352' # # 請求一下上面的地址以檢視資料是否準確 # playUrlresponse = requests.get(url=videoPlayurl, headers=headers) # print(playUrlresponse.text) # 這裡肯定是個字串,可以用處理字串的方式或者用re提取想要的資訊 # # 有個大神說,只需要將url裡的callback那一串去掉就能打印出json資料 # 上面的處理需要字串處理,用大神說的,將callback那一串刪除 videoPlayurl = f'https://liveapi.huya.com/moment/getMomentContent?' \ f'videoId={vedioId}&uid=&_=1635472169352' playUrlresponse = requests.get(url=videoPlayurl, headers=headers) # print(playUrlresponse.json()) # 到此就獲取到了json資料 # pprint.pprint(playUrlresponse.json()) # 獲取到了json資料就提取要下載的源url和視訊名稱 videoOrginalUrl = playUrlresponse.json()['data']['moment']['videoInfo']['definitions'][0]['url'] # 取到url videoName = playUrlresponse.json()['data']['moment']['videoInfo']['videoTitle'] print(videoName, videoOrginalUrl) # break # 除錯的時候可以只打印一次 # 取到了資料來源就可以請求下載了 requestVideoDownload = requests.get(url=videoOrginalUrl, headers=headers) with open(filePath + videoName + '.mp4', mode='wb') as f: # 以二進位制方式儲存資料 f.write(requestVideoDownload.content) if os.path.exists(videoName + '.mp4'): print(videoName + '視訊已經存在!') else: print(videoName + '還在下載中。。。')
下載完後的結果:
我就爬了一頁,沒做分頁爬取,電腦太卡。分頁的話加個for迴圈。