日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python手机端如何下载_过去,哔哩哔哩上面的视频只能在手机上面下载;现在,我用Python爬虫实现了能在PC端上面下载...

發布時間:2024/3/13 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python手机端如何下载_过去,哔哩哔哩上面的视频只能在手机上面下载;现在,我用Python爬虫实现了能在PC端上面下载... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

運用Python爬蟲下載嗶哩嗶哩上面的視頻

前言

之前一直沒有時間寫博客,從今天開始基本又有時間了,又可以高高興興地寫博客了。本篇文章純屬于小編原創,未經小編允許禁止轉載,還請大家見諒!

目錄

運用Python爬蟲下載嗶哩嗶哩上面的視頻

1.完成這個項目需要的模塊

2.怎樣實現項目

2.1 得到想看的視頻資源鏈接

2.2 得到視頻資源下面的所有視頻的請求鏈接

2.3 得到視頻和音頻的下載鏈接

2.4 下載所有的視頻和音頻

3.最終代碼和運行結果

4.總結

1.完成這個項目需要的模塊

完成這個項目需要的模塊有大家熟悉的requests、bs4、json、urllib.parse 等模塊,其中requests模塊用于爬取網頁數據;bs4模塊用于解析爬取的數據,也就是相當于整理數據;urllib.parse模塊主要是使用其下urlencode方法,對一個鏈接的部分信息進行編碼;json模塊用于處理json數據,也就是字符串數據,只不過處理之后會是字典數據。

2.怎樣實現項目

2.1 得到想看的視頻資源鏈接

也就是通過搜索得到內容中,選擇一個自己想看的視頻資源,得到這個視頻資源的鏈接,我輸入的是: python

點擊搜索之后,來到的是這個界面:

這個網址為:https://search.bilibili.com/all?keyword=python&from_source=nav_suggest_new

對這個網址進行分析,可以發現基本就是keyword后面就是我剛才輸入搜索內容了,只不過需要:urllib.parse.urlencode()進行一下編碼,因為輸入的是英文,所以編碼與沒有編碼兩者之間沒有什么區別。

我選擇了其中的一個視頻資源,也就是第一個,點擊進入,就是下面的這個畫面了。

代碼如下:

def get_url():

# 定有get_url()方法,用于得到讀者想下載的視頻鏈接

keyword=input("請輸入你想搜索的關鍵字:")

keyword1=parse.urlencode({'keyword':keyword})

url='https://search.bilibili.com/all?{}'.format(keyword1)

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400'}

response=requests.get(url=url,headers=headers)

soup=BeautifulSoup(response.text,'lxml')

urls=soup.select('ul.video-list.clearfix>li>a') # 搜索得到的列表

for i in range(len(urls)):

urls[i]=['https:'+urls[i]['href'],urls[i]['title']]

print('---->【{}】{}'.format(i+1,urls[i][1]))

id=int(input('請輸入你想下載的視頻序號:'))

return urls[id-1][0] # 視頻鏈接

2.2 得到視頻資源下面的所有視頻的請求鏈接

通過多次觀察發現,選擇不同的視頻播放,這個播放鏈接會改變,并且最終的請求鏈接也在這個播放鏈接下面。

這個視頻的請求鏈接分為三種畫質,分別是 高清 720P、清晰 480P 、流暢 360P ,而且音頻也分了兩種,我對于音頻不了解很多,我就選擇了第一個,認為第一個應該比較好。

因為視頻的畫質也是第一個比較好,是 720P 的畫質。

我們得到上述視頻和音頻的請求鏈接之后,就可以來到接下來的操作了。

代碼如下:

def get_info(url):

# 得到所有視頻的鏈接和名稱

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400'}

response=requests.get(url=url,headers=headers)

soup=BeautifulSoup(response.text,'lxml')

list_1=soup.select('script')

info=str(list_1[3]) # 字符出格式的數據

info=info[info.find('{'):info.rfind('};(function()')+1]

# 將這個字符串的數據轉化為字典格式的數據

dicInfo=json.loads(info)

listInfo=dicInfo['videoData']['pages']

listPage=[] # 定義一個存儲頁碼的列表

for i in range(len(listInfo)):

listPage.append(listInfo[i]['page'])

listInfo[i]=listInfo[i]['part'] # 視頻的名稱

for i in range(len(listPage)):

listPage[i]=url[:url.rfind('?')]+'?p={}'.format(listPage[i])

return listPage,listInfo

def get_info1(listPage):

print('*' * 56)

print('現在是得到所有視頻和音頻的請求鏈接的過程!')

# 得到所有視頻和音頻的請求鏈接

urlsList=[]

ipsList=get_ips()

# 得到ip

ip = ipsList.pop()

for url in listPage:

page=url[url.find('?p=')+3:]

print('正在爬取頁碼為{}的數據:'.format(page))

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400'}

while(True):

try:

print('正在使用代理的ip:{}'.format(ip))

proxies={'http':ip}

response = requests.get(url=url, headers=headers,proxies=proxies)

if response.status_code==200:

soup = BeautifulSoup(response.text, 'lxml')

list_1 = soup.select('script')

## 視頻和音頻的網址

info1 = str(list_1[2])

info1 = info1[info1.find('{'):info1.rfind('}') + 1]

info1 = json.loads(info1)

url1 = info1['data']['dash']['video'][0]['baseUrl'] # 視頻的請求鏈接,選擇第一個鏈接的原因是這個視頻的清晰度最高

url2 = info1['data']['dash']['audio'][0]['baseUrl'] # 音頻的請求鏈接

urlsList.append([url1, url2,page])

break

# 推出while循環

else:

# 狀態碼不為200和報錯情況下,換一個ip

ip=ipsList.pop()

except Exception as e:

print('ip:{}無效'.format(ip))

ip=ipsList.pop()

return urlsList

2.3 得到視頻和音頻的下載鏈接

我們選擇其中的一個視頻播放,然后按電腦鍵盤的F12鍵,點擊network,點擊xhr,找到下面這個網址,視頻或者音頻的下載鏈接就在這個網址下面。

點擊headers,看到下面的這個畫面

那個請求鏈接就是上面我所說的請求鏈接,因為請求的data數據必須是文本類型,所以如果data={字典數據} ,這樣是得不到數據的,還必須通過json.dumps() 方法,將字典數據轉化成字符串數據才行。

這樣我們就得到了視頻和音頻的下載鏈接。

代碼如下:

def get_info2(urlsList):

print('*'*56)

print('---->現在是得到所有視頻和音頻下載鏈接的過程!')

url = 'https://h5seeds-open.xycdn.com/api/get_seeds'

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400"}

ipsList=get_ips() # 得到IP

ip=ipsList.pop()

infos=[]

for i in range(len(urlsList)):

proxies={'http':ip}

print('正在使用ip:{}爬取{}頁內容'.format(ip,urlsList[i][2]))

while True:

try:

data1={'url':urlsList[i][0]}

response1 = requests.post(url=url, data=json.dumps(data1), headers=headers,proxies=proxies)

data2 = {'url': urlsList[i][1]}

response2 = requests.post(url=url, data=json.dumps(data2), headers=headers, proxies=proxies)

if response1.status_code==200 and response2.status_code==200:

dict1 = json.loads(response1.text)

dict2=json.loads(response2.text)

url_1=dict1['data']['peers'][0]['request_url'] # 視頻或者音頻的下載鏈接

url_2 = dict2['data']['peers'][0]['request_url']

infos.append([url_1,url_2,urlsList[i][2]])

break

else:

# 狀態碼不為200和報錯情況下,換一個ip

ip=ipsList.pop()

except Exception as e:

print('錯誤原因:{}'.format(e))

print('ip:{}無效'.format(ip))

ip = ipsList.pop()

return infos

2.4 下載所有的視頻和音頻

本來我是打算用上多線程和ip代理的,但是因為速度過快,結果報錯了,后面我用上了ip代理,結果大部分代理都沒用了,原本很多都可用的,這樣的結果用完所有的ip之后,才成功下載了幾個視頻和音頻,運行結果如下:

當然,在前面的幾個過程當中,我還是應用了ip代理的,代碼我已經上傳到github了,鏈接為:ip2.py,另外,也可以看看我的這篇文章,也是講ip代理的,只不過前面我是爬取 快代理,這里我爬取的是西祠代理。

文章鏈接為:運用Python做一個ip代理池

這兩個程序代碼運行完成之后,在同一個文件夾下面會多出一個ip文件,里面就是可用的ip代理了。

最后下載還是不用ip代理了。

3.最終代碼和運行結果

代碼我已經上傳到github上了,鏈接為:bilibili.py

下載是很慢的,讀者可以自行將相應的下載鏈接得到,然后下載。改動代碼如下:

運行結果:

Python爬蟲下載嗶哩嗶哩上面的視頻

注意:最好多準備點ip,否則會出錯;另外,運行次數過多的情況下,會出現412錯誤,查了一下資料,才知道,這是headers的錯誤,最好多準備多個不同的headers,當然,也可以等待一段時間即可。小編沒有對視頻和音頻進行合并,所以如果有需求的讀者可以自行查找資料進行合并,當然,如果有讀者知道怎樣進行合并,歡迎在評論區留言。

4.總結

這個程序代碼是小編運行一天時間寫的,讀者也知道,爬取嗶哩嗶哩比較繁瑣的。當然對于大牛來說,或許太簡單了。看了小編這篇文章的讀者,如果覺得小編的這篇文章寫的還不錯,記得點贊,謝謝,如果讀者對于小編的這篇文章有什么建議或者疑問,歡迎在評論區留言,或許小編回復的時間不會很準時,希望讀者鏈接。

總結

以上是生活随笔為你收集整理的python手机端如何下载_过去,哔哩哔哩上面的视频只能在手机上面下载;现在,我用Python爬虫实现了能在PC端上面下载...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。