""" 實現步驟: 1.發送請求,對於視頻信息數據包發送請求 2.獲取數據,獲取服務器返回的數據 3.解析數據,提取我們想要的內容:視頻url地址、視頻標題 4.保存數據,將視頻內容保存到本地文件夾 """
import requests # 數據請求模塊
from pprint import pprint # 格式化輸出
import re # 正則表達式模塊
import json
import os
def get_response(url):
"""發送請求"""
# headers:請求頭,將python代碼進行偽裝
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
return response
def get_video_info(video_id):
"""獲取視頻數據"""
url = f'https://liveapi.huya.com/moment/getMomentContent?videoId={
video_id}&uid=&_=1657784282961'
response = get_response(url)
# print(response.text)
# print(response.json())
# json數據其實就是字典數據類型
# 根據key獲取值
# pprint(response.json())
# 獲取視頻標題
title = response.json()['data']['moment']['title']
title = re.sub(r'【.*?】', '', title)
# 在Windows操作系統中,文件名不能包含一些特殊字符,需要進行替換
title = re.sub(r'[\/:*?"<>|\n]', '_', title)
# 獲取視頻地址
video_url = response.json()['data']['moment']['videoInfo']['definitions'][0]['url']
video_info = [title, video_url]
return video_info
def save(title, video_url):
"""保存數據"""
# 發送網絡請求:請求每一個視頻地址,獲取視頻二進制數據
video_content = get_response(url=video_url).content
dir_name = 'videos/'
# 判斷該文件夾是否存在
if not os.path.exists(dir_name):
# 不存在則創建
os.mkdir(dir_name)
with open(dir_name + title + '.mp4', mode='wb') as f:
f.write(video_content)
print(f'視頻:{
title}----------下載完成')
""" 爬取多個視頻內容: 通過爬取單個視頻可以發現 >>> 只需更改視頻ID就可以下載不同的視頻內容 >>> 只要獲取所有視頻的ID,即可下載所有視頻內容 1.發送請求,對於視頻信息數據包發送請求 2.獲取數據,獲取服務器返回的數據 3.解析數據,提取視頻ID 4.保存數據,將視頻內容保存到本地文件夾 """
def get_video_ids(url):
"""獲取視頻ID"""
html_data = get_response(url).text
# print(html_data)
# 正則表達式解析數據
video_data = re.findall('<script> window.HNF_GLOBAL_INIT = (.*?)</script>', html_data)[0]
# print(video_data)
# 需要把字符串數據轉字典數據
json_data = json.loads(video_data)
# 字典取值的方法 提取視頻信息數據 返回的列表,而列表裡面的元素是字典
video_id_list = json_data['videoData']['videoDataList']['value']
video_ids = [i['vid'] for i in video_id_list] # 列表推導式
# pprint(video_ids)
return video_ids
def main(html_url):
"""主函數"""
# 獲取視頻ID列表
video_ids = get_video_ids(html_url)
# 遍歷ID列表
for video_id in video_ids:
# 獲取視頻信息
video_info = get_video_info(video_id)
# print(video_info[0], video_info[1])
# 保存視頻
save(video_info[0], video_info[1])
if __name__ == '__main__':
url = "https://v.huya.com/g/all?set_id=51&order=hot&page=1"
main(url)
爬取效果: