前言
嗨嘍!大家好呀,這里是魔王~
知識(shí)點(diǎn):
爬蟲(chóng)基本流程re正則表達(dá)式簡(jiǎn)單使用requestsjson數(shù)據(jù)解析方法視頻數(shù)據(jù)保存開(kāi)發(fā)環(huán)境]:
Python 3.8Pycharm模塊使用]:
requests >>> pip install requests 第三方模塊rewin + R 輸入cmd 輸入安裝命令 pip install 模塊名 如果出現(xiàn)爆紅 可能是因?yàn)?網(wǎng)絡(luò)連接超時(shí) 切換國(guó)內(nèi)鏡像源
爬蟲(chóng)基本流程(固定):
一. 數(shù)據(jù)來(lái)源分析
確定爬取內(nèi)容是什么? (目標(biāo)網(wǎng)址, 網(wǎng)址里面數(shù)據(jù))
視頻內(nèi)容通過(guò)開(kāi)發(fā)者工具進(jìn)行抓包分析
, 分析我們想要數(shù)據(jù) 通過(guò)請(qǐng)求那個(gè)url地址可以獲得
I. 通過(guò)分析可以知道 視頻播放url地址是什么?
II. 通過(guò)視頻播放地址, 去分析找尋, 視頻數(shù)據(jù)包是在哪?
III. 通過(guò)兩個(gè)視頻數(shù)據(jù)包 請(qǐng)求參數(shù)對(duì)比, 可以知道 只要獲取所有視頻ID 就可以獲取視頻內(nèi)容
(圖片id 視頻ID 音樂(lè)ID 還是什么ID 都可以去列表頁(yè)面獲取)
IV. 去分析 視頻ID可以從哪里獲取 (一般情況都可以在列表頁(yè)面獲取)我想要獲取視頻播放地址 >>> 要得到視頻數(shù)據(jù)包 >>> 獲取視頻ID
二. 代碼實(shí)現(xiàn)步驟 發(fā)送請(qǐng)求 獲取數(shù)據(jù) 解析數(shù)據(jù) 保存數(shù)據(jù)
發(fā)送請(qǐng)求, 對(duì)于舞蹈視頻列表頁(yè)面發(fā)送請(qǐng)求獲取數(shù)據(jù), 服務(wù)器返回?cái)?shù)據(jù)內(nèi)容解析數(shù)據(jù), 提取我們想要數(shù)據(jù)內(nèi)容 視頻ID發(fā)送請(qǐng)求, 把視頻ID傳入到 視頻數(shù)據(jù)包里面 發(fā)送請(qǐng)求獲取數(shù)據(jù), 服務(wù)器返回?cái)?shù)據(jù)內(nèi)容解析數(shù)據(jù), 提取我們想要數(shù)據(jù)內(nèi)容 視頻標(biāo)題 以及視頻播放地址保存數(shù)據(jù), 把視頻內(nèi)容保存本地多頁(yè)數(shù)據(jù)采集代碼
# 導(dǎo)入數(shù)據(jù)請(qǐng)求模塊
import requests # 第三方模塊 pip install requests 需要自行安裝
# 導(dǎo)入re正則表達(dá)式
import re # 內(nèi)置模塊 不需要安裝
# 導(dǎo)入格式化輸出模塊
import pprint # 內(nèi)置模塊 不需要安裝
# 1. 發(fā)送請(qǐng)求, 對(duì)于舞蹈視頻列表頁(yè)面發(fā)送請(qǐng)求
for page in range(1, 11):
print(f正在爬取第{page}頁(yè)的數(shù)據(jù)內(nèi)容)
url = fhttps://v.huya.com/g/all?set_id=51&order=hot&page={page}
# 爬蟲(chóng)是模擬瀏覽器對(duì)于服務(wù)器發(fā)送請(qǐng)求, 然后獲取服務(wù)器返回?cái)?shù)據(jù)內(nèi)容
# user-agent:
用戶代理 表示瀏覽器基本身份信息 (一種簡(jiǎn)單反反爬手段)
headers = {
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
}
# 通過(guò)requests模塊里面get請(qǐng)求方式對(duì)于url地址發(fā)送請(qǐng)求, 并且攜帶上headers請(qǐng)求進(jìn)行偽裝, 最后用自定義變量response接收返回?cái)?shù)據(jù)
response = requests.get(url=url, headers=headers)
# <Response [200]> 表示請(qǐng)求成功, 請(qǐng)求網(wǎng)址成功了 *** 200狀態(tài)碼表示請(qǐng)求成功, 但是不一定能夠得到數(shù)據(jù)
# 2. 獲取數(shù)據(jù), 服務(wù)器返回?cái)?shù)據(jù)內(nèi)容 response.text 獲取響應(yīng)文本數(shù)據(jù)
# print(response.text)
# 3. 解析數(shù)據(jù), 提取我們想要數(shù)據(jù)內(nèi)容 視頻ID
# 解析方式: css re xpath
# <li data-vid="676382675"> 想要數(shù)據(jù) 可以(.*?) 從
response.text 里面去找尋這樣數(shù)據(jù)內(nèi)容
# .*? 是可以匹配任意字符(除了\n換行符以外) 如果你只是單純提取數(shù)字 最好用 \d+ 匹配一個(gè)或者多個(gè)數(shù)字
video_ids = re.findall(<li data-vid="(\d+)">, response.text) # 返回列表數(shù)據(jù)
for video_id in video_ids: # 通過(guò)for循環(huán)遍歷 提取列表里面元素 一個(gè)一個(gè)提取
# print(video_id)
# 4. 發(fā)送請(qǐng)求, 把視頻ID傳入到視頻數(shù)據(jù)包里面發(fā)送請(qǐng)求
# 5. 獲取數(shù)據(jù), 服務(wù)器返回?cái)?shù)據(jù)內(nèi)容
# f 字符串格式化方法 {} 占位符
video_info = fhttps://liveapi.huya.com/moment/getMomentContent?videoId={video_id}&uid=&_=1647433310180
json_data = requests.get(url=video_info, headers=headers).json()
# 有反爬 就有
反反爬
# print(json_data)
# pprint.pprint(json_data)
# 根據(jù)冒號(hào)左邊的內(nèi)容, 提取冒號(hào)右邊的內(nèi)容
# 6. 解析數(shù)據(jù)
title = json_data[data][moment][title]
video_url = json_data[data][moment][videoInfo][definitions][0][url]
# 7. 保存數(shù)據(jù) >>> 發(fā)送請(qǐng)求 并且獲取數(shù)據(jù)
"""
response.text >>> 文本數(shù)據(jù)返回字符串?dāng)?shù)據(jù)
response.json() >>> json字典數(shù)據(jù)
response.content >>>
二進(jìn)制數(shù)據(jù)
"""
video_content = requests.get(url=video_url, headers=headers).content
with open(video\\ + title + .mp4, mode=wb) as f:
f.write(video_content)
print(title, video_url)
尾語(yǔ)
好了,我的這篇文章寫(xiě)到這里就結(jié)束啦!
有更多建議或問(wèn)題可以評(píng)論區(qū)或私信我哦!一起加油努力叭(? ?_?)?
喜歡就關(guān)注一下博主,或點(diǎn)贊收藏評(píng)論一下我的文章叭?。?!