python爬蟲練習--爬取虎牙主播原畫視訊
此文章和程式碼僅供學習交流,請勿他用
前言
- 使用的python庫:os、requests、bs4
- 涉及動態資料的爬取
- 下載視訊時使用斷點續傳技術
爬取過程
開啟虎牙主播的主頁看一下
每一個主播的視訊頁面中,都會對應一個id值。通過這個id值就可以找到虎牙主播的視訊主頁。
我們可以把程式碼封裝起來,想要爬取哪一個主播的視訊,只需要修改主播ID值就好了。
class HuyaSpider:
def __init__(self,host_id):
self.url = 'https://v.huya.com/u/{}/video.html'.format(host_id)
def get_html(self):
pass
def save_file(self):
pass
def spider_start(self):
pass
h = HuyaSpider(1199529586692)
大致框架先列出來:
- 定義一個
HuyaSpider
類,在例項化的時候需要傳入一個引數:主播ID get_html(self)
方法用來獲取網頁內容save_file(self)
方法用來把視訊儲存至檔案中spider_start(self)
方法用來啟動爬蟲
初始工作已做好,開始分析網頁
檢視主播視訊網頁的原始碼,找到視訊列表:
每一個視訊的網頁地址在原始碼上找得到(經過測試,通過requests請求能夠真實得到)
接下來進入一個視訊網頁看看
分析原始碼,目的是要拿到視訊的具體地址
在瀏覽器檢視的網頁原始碼中,找到了視訊的url,看起來好像都是挺簡單的,其實不然。
經過測試,requests請求得到的原始碼中,是不包含上面方框圈中的<video> </video>
標籤的,也就是說從requests請求得到的原始碼中是得不到視訊的真實url。
因為,這是動態載入的資料,真正的視訊url不會放在源網頁中,而是通過別的請求得到之後再放進網頁裡。
所以,現在我們就要找到這個所謂的別的請求,拿到視訊的url。
當然我們可以用selenium來實現抓取動態資料(selenium實現,本文不作講解)
在瀏覽器原始碼中把視訊url拷貝一下,到瀏覽器開發者工具裡的network裡面搜尋一下,
在搜尋結果中有3條請求資料包含視訊url。
仔細檢視一下這些請求的請求體和返回的內容
這是json格式的資料,3號綠色方框中,在definitions的值是一個列表,列表裡有3個元素,每個元素中又是好幾個的字典,包含畫質,視訊的高度和寬度,視訊的大小,最重要的還包含視訊的m3u8連結和url。
現在,我們在這個請求資料中不僅找到原畫視訊的url,而且超清,流暢的視訊url都找到了。
只要我們能構造這個請求就可以搞定了
Request URL :
https://liveapi.huya.com/moment/getMomentContent?callback=jQuery1124009457286560941736_1606489913207&videoId=269035006&_=1606489913213
這個請求是由callback、videoId、uid 組成的,
vedioId很好理解,大概就是視訊的id,另外兩個callback和uid還不知道是什麼,刪掉試試??
刪掉之後:https://liveapi.huya.com/moment/getMomentContent?videoId=269035006
試訪問一下這個連結
我們還是拿到了這個資料,這說明videoId才是構造url的關鍵欄位,另外兩個不是必須的。
那麼這個videoId=269035006是如何來的呢?
這個videoId不就正好在那嘛。
分析完了哦
從頭到尾捋一下爬蟲思路:
- 通過主播id構造出主播視訊網頁的url
- 從網頁原始碼中獲取每個視訊的網頁url,並記住videoId值,
- 通過videoId構造url,請求得到json格式的資料
- 從json格式的資料中拿到真正視訊的url,接著下載視訊。
- 下載視訊時採用斷點續傳的方式
下載視訊和斷點續傳這裡就不作講解了。
有關斷點續傳的內容可瀏覽:https://blog.csdn.net/FujLiny/article/details/110098858
斷點續傳可避免重複下載同一個視訊以及能夠接著上一次下載的地方繼續下載
爬取效果
(演示的是爬取別的主播)
完整程式碼
# Author:FuJLiny
# CSDN blog homepage:https://blog.csdn.net/FujLiny
# ------version 1-1,Update time:2020/11/28------
import os
import requests
from bs4 import BeautifulSoup
class HuyaSpider:
def __init__(self, Id):
self.url = 'https://v.huya.com/u/{}/video.html'.format(Id)
self.place = 'F:/' # 儲存路徑
self.videoAll = []
def get_html(self):
soup = BeautifulSoup(requests.get(self.url).text, 'lxml')
vc = soup.select('a[class="statpid selected"]')[0].text[3:-1]
vPage = (eval(vc) // 15) + 1 # (視訊總數 // 15) + 1 = 視訊總頁數
# 遍歷每一頁
for i in range(1,vPage+1):
url = self.url + '?sort=news&p=%s' % i
soup = BeautifulSoup(requests.get(url).text, 'lxml')
for item in soup.select('div[class="content-list"] ul li a'):
videoId = item['href'].split('/')[-1][:-5]
dataUrl = 'https://liveapi.huya.com/moment/getMomentContent?&videoId=%s' % videoId
data = requests.get(dataUrl).json()
vTitle = data['data']['moment']['title']
vSize = data['data']['moment']['videoInfo']['definitions'][0]['size']
vUrl = data['data']['moment']['videoInfo']['definitions'][0]['url']
# 把獲取到的視訊標題、視訊大小、視訊url儲存到一個字典中,並把該字典儲存到列表
self.videoAll.append({'title':vTitle, 'size':vSize, 'url':vUrl})
print('\r獲取到%s個視訊連結'%len(self.videoAll),end='')
def save_file(self, name, size, url):
name = self.place + '%s.mp4' % name
size = eval(size)
try:
# 構造斷點續傳的headers
# 關於斷點續傳的內容可瀏覽文章:https://blog.csdn.net/FujLiny/article/details/110098858
fileSize = os.path.getsize(name)
if fileSize < size:
head = {'Range': 'bytes=%d-' % fileSize}
mode = 'ab'
else:
return
except FileNotFoundError:
fileSize = 0
head = {'Range': 'bytes=%d-' % 0}
mode = 'wb'
print('\n正在下載:', name)
r = requests.get(url, headers=head, stream=True)
with open(name, mode=mode)as fp:
completeSize = 0
for item in r.iter_content(200000):
fp.write(item)
completeSize += len(item)
dt = completeSize / (size-fileSize)
print('\r下載進度:'+'*'*(int(dt*50))+'%.2f%%'%(dt*100), end='')
def spider_start(self):
self.get_html()
print('\n該主播共有%s個視訊,開始爬取:'%len(self.videoAll))
for item in self.videoAll:
self.save_file(item['title'],item['size'], item['url'])
if __name__ == '__main__':
h = HuyaSpider(1199529586692)
h.spider_start()
相關文章
- Python爬蟲訓練:爬取酷燃網視訊資料Python爬蟲
- Python爬蟲入門教程 50-100 Python3爬蟲爬取VIP視訊-Python爬蟲6操作Python爬蟲
- 爬蟲練習——爬取縱橫中文網爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- python爬蟲——爬取大學排名資訊Python爬蟲
- python爬蟲--爬取鏈家租房資訊Python爬蟲
- python爬蟲練習之爬取豆瓣讀書所有標籤下的書籍資訊Python爬蟲
- 爬蟲學習筆記:練習爬取多頁天涯帖子爬蟲筆記
- 小白學 Python 爬蟲(25):爬取股票資訊Python爬蟲
- python網路爬蟲_Python爬蟲:30個小時搞定Python網路爬蟲視訊教程Python爬蟲
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 爬蟲練習--草稿爬蟲
- 如何爬取視訊的爬蟲程式碼原始碼爬蟲原始碼
- Python爬蟲爬取淘寶,京東商品資訊Python爬蟲
- python爬蟲學習01--電子書爬取Python爬蟲
- Python爬蟲爬取B站up主所有動態內容Python爬蟲
- Python爬蟲之小說資訊爬取與資料視覺化分析Python爬蟲視覺化
- python愛奇藝VIP視訊爬蟲爬取下載Python爬蟲
- Python爬蟲入門學習線路圖2019最新版(附Python爬蟲視訊教程)Python爬蟲
- Python爬蟲實戰:爬取淘寶的商品資訊Python爬蟲
- python 爬蟲 爬取 learnku 精華文章Python爬蟲
- Java爬蟲-爬取疫苗批次資訊Java爬蟲
- python爬蟲58同城(多個資訊一次爬取)Python爬蟲
- Python爬蟲實戰案例-爬取幣世界標紅快訊Python爬蟲
- Python爬蟲—爬取某網站圖片Python爬蟲網站
- python 爬蟲 1 爬取酷狗音樂Python爬蟲
- 【Python爬蟲】正則爬取趕集網Python爬蟲
- python爬蟲是什麼?學習python爬蟲難嗎Python爬蟲
- python爬蟲--招聘資訊Python爬蟲
- Python爬蟲入門【5】:27270圖片爬取Python爬蟲
- Python 第一個爬蟲,爬取 147 小說Python爬蟲
- 爬蟲——爬取貴陽房價(Python實現)爬蟲Python
- Python爬蟲:爬取instagram,破解js加密引數Python爬蟲JS加密
- python網路爬蟲--爬取淘寶聯盟Python爬蟲
- python例項,python網路爬蟲爬取大學排名!Python爬蟲
- python爬蟲學習1Python爬蟲
- python爬蟲小專案--飛常準航班資訊爬取variflight(上)Python爬蟲
- 爬蟲Selenium+PhantomJS爬取動態網站圖片資訊(Python)爬蟲JS網站Python