1. 爬取的原理
我們來到虎牙視頻主界面,鏈接為:虎牙視頻主界面
然后隨便點擊一下某個視頻的發布者,來到這個發布者的主界面,點擊到視頻,如下:
很多人學習python,不知道從何學起, 很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手, 很多已經做案例的人,卻不知道如何去學習更加高深的知識, 那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼! QQ群:701698587 歡迎加入,一起討論 一起學習!
我們可以看到這個界面下有許多視頻可以觀看,那么怎樣下載呢?我們隨便點擊其中的一個視頻進入,按電腦鍵盤的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[@]/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[@]/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()
另外,小編并沒有實作下載視頻的功能,只是把視頻的下載鏈接給提取出來了哈!爬蟲需要遵守相應的法律法規,不能對服務器造成很大的負擔,還有,就是,有的視頻時間比較長,代碼實作下載效果還沒有直接copy下載鏈接到網頁端下載那么高效,當然,有興趣的讀者可以自己去試試哈!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/302113.html
標籤:其他
