1. 爬取的原理

我們來到虎牙視頻主界面,鏈接為:虎牙視頻主界面
然后隨便點擊一下某個視頻的發布者,來到這個發布者的主界面,點擊到視頻,如下:

我們可以看到這個界面下有許多視頻可以觀看,那么怎樣下載呢?我們隨便點擊其中的一個視頻進入,按電腦鍵盤的F12來到開發者模式,然后點擊network->js->找到相應的網址->視頻下載鏈接
我們可以找到相應的視頻下載鏈接,
那么怎樣發起請求呢?這是一個get請求,網址為:https://v-api-player-ssl.huya.com,請求引數如下:

那么這些請求引數具體代表什么意思呢?
2. 具體怎樣實作
小編經過分析發現,
- 第一個引數callback的值應該是:jQuery+一段隨機欄位+_+時間戳,既然有一段隨機欄位,那么這個不改直接用應該也是可以的;
- 第二個引數r的值應該是固定的,這個直接用就行;
- 第三個引數vid,也就是的視頻的id,其實這個引數就是這個視頻在服務器上的資料庫中的id(小編猜測的,畢竟小編最近也在做相應的專案,也會使用到相應的id編號),這個引數在發布者視頻下可以通過re正則運算式獲取;
- 第四個引數是format,應該是型別,這個應該也是固定的,直接copy即可;
- 第五個引數也就是時間戳,直接copy或者寫都行,
3. 代碼和運行結果

代碼如下:
import requests
from lxml import etree
from crawlers.userAgent import useragent
import re
import json
import time
class video(object):
def __init__(self,url):
# url 為輸入的鏈接
self.url = url
self.page = 0
self.u = useragent()
def getPages(self):
# 獲取當前鏈接界面的總頁數
headers = {'user-agent':self.u.getUserAgent()}
rsp = requests.get(url=self.url,headers=headers)
html = etree.HTML(rsp.text)
aList = html.xpath('//div[@class="user-paginator"]/ul/li/a')
print('視頻總頁數為:',aList[-2].text)
self.page = int(input("請輸入想下載的視頻頁數:"))
def downloadVideo(self):
# 下載視頻的方法,并沒有下載視頻,只是獲取視頻的下載鏈接
for i in range(1,self.page+1):
if i == 1:
url2 = '{}?sort=news'.format(self.url)
else:
url2 = '{}?sort=news&p={}'.format(self.url,i)
headers = {'user-agent':self.u.getUserAgent()}
rsp = requests.get(url=url2,headers=headers)
html2 = etree.HTML(rsp.text)
hrefs = html2.xpath('//div[@class="content-list"]/ul/li/a')
for j in range(len(hrefs)):
href = hrefs[j].xpath('./@href')[0]
title = hrefs[j].xpath('./@title')[0]
print('視頻名稱為:',title)
vid = re.findall("/play/(\d*).html",href)[0] # 獲取vid
self.getDownloadHref(vid=vid)
print('#'*50)
time.sleep(2)
def getDownloadHref(self,vid):
url3 = 'https://v-api-player-ssl.huya.com'
params={'callback': 'jQuery1124017458848743440036_1632126349635',
'r': 'vhuyaplay/video',
'vid': vid,
'format': 'mp4,m3u8',
'_': '1632126349643'}
rsp = requests.get(url=url3,headers={'user-agent':self.u.getUserAgent()},params=params)
infos = rsp.text
lindex = infos.find('(')
rindex = infos.find(')')
dict2 = json.loads(infos[lindex+1:rindex])
list2 = dict2['result']['items']
v_list2=['高清','原畫','流暢']
for i in range(len(list2)):
print(v_list2[i],list2[i]['transcode']['urls'][0])
if __name__ == '__main__':
url = input("請輸入視頻鏈接:")
v = video(url)
v.getPages()
v.downloadVideo()
其中crawlers模塊如果讀者一直閱讀小編的博客,就知道是來干什么的,如果讀者是第一次來閱讀小編的博客,可以去看看小編的這篇博客,博客鏈接為:Python爬蟲:制作一個屬于自己的IP代理模塊
另外,小編并沒有實作下載視頻的功能,只是把視頻的下載鏈接給提取出來了哈!爬蟲需要遵守相應的法律法規,不能對服務器造成很大的負擔,還有,就是,有的視頻時間比較長,代碼實作下載效果還沒有直接copy下載鏈接到網頁端下載那么高效,當然,有興趣的讀者可以自己去試試哈!
看看運行效果吧!
運用Python爬蟲下載虎牙視頻
對了,需要注意輸入的視頻鏈接喔!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301764.html
標籤:python
上一篇:Python 爬蟲資料寫入csv檔案中文亂碼解決以及天眼查爬蟲資料寫入csv
下一篇:教你使用cookie登錄
