1. 程式人生 > 其它 >爬某牙小姐姐視訊 - Python

爬某牙小姐姐視訊 - Python

爬某牙小姐姐視訊,播放量最多的那種。因為資料提取很繁瑣,就不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迴圈。