爬取B站單個視頻
用到的庫有 os,re,requests,lxml
直接上原始碼!!!
“”"
1.每次爬取都是爬到了 三個檔案,現在只想要合成好的MP4檔案 再在上一個例子上優化
– os.remove()
2. 如果想顯示檔案的大小,,,,
–1,發送請求的時候,引數添加上 steam=True
“”"
import requests
import os
from lxml import etree
import re
if name == ‘main’:
# 1.確認url
url_ = input(‘請輸入你想要抓取的視頻頁面:’)
# 2.設定用戶代理,Cookie
headers_ = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36’,
‘Cookie’: “_uuid=1BFF5D87-BF0F-8353-99F5-C901FAA9F09096621infoc; buvid3=B63EAE5A-4EF7-41BB-9317-CF51211D0529155811infoc; rpdid=|(k||luJY|)J0J’ulmuuR|u; CURRENT_FNVAL=80; blackside_state=1; sid=9eeltw8j; DedeUserID=313196967; DedeUserID__ckMd5=71a0e838ddc8e3ac; SESSDATA=26cce223%2C1619966047%2C02085*b1; bili_jct=efa8c91b32cfee4f96cebeb4896de8e9; bsource=search_baidu; finger=158939783”
}
# 3.發送請求,得到回應物件
response_ = requests.get(url_, headers=headers_)
str_data = response_.text # 視頻主頁的html代碼,型別是字串
# 4.使用xpath決議html代碼,得到想要的url
# 4.1 決議前需要轉化格式
html_obj = etree.HTML(str_data) # 轉換格式型別
# 1.新增部分,獲取視頻的名稱
res_ = html_obj.xpath('//title/text()')[0] # 現在的這個res_里面保存的是:我半夜唱Lemon直接把室友給唱哭了!!!!【米津玄師】_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili
# 2.新增部分,此時此刻這個title里面保存的就是視頻的名稱:我半夜唱Lemon直接把室友給唱哭了!!!!【米津玄師】
title_ = re.findall(r'(.*?)_嗶哩嗶哩', res_)[0]
# 3.新增部分的注釋(視頻名稱里面多了空格 & /會怎么樣?會影響視頻的合成!!!)
# 3.新增解決視頻名稱中出現 空格 & / 的解決辦法
title_ = title_.replace('/', '') # 第一次處理,將/替換成 空
title_ = title_.replace(' ', '') # 第二次處理,將空格替換成 空
title_ = title_.replace('&', '') # 第三次處理,將&替換成 空
title_ = title_.replace('×', '') # 第三次處理,將×替換成 空
# 5.使用xpath語法獲取資料,取到資料為串列,索引[0] 取出里面的字串,即包含視頻音頻檔案的url字串
url_list_str = html_obj.xpath('//script[contains(text(),"window.__playinfo__")]/text()')[0] # 獲取回來的資料是一個串列
# 6.上面去到的文本資訊是字串型別 過濾要用正則,取視頻的url
# \d+ 是用來匹配沒有1080p清晰度的url
video_url = re.findall(r'"video":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]
# 7. 取音頻的url
# audio_url = re.fianall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]
audio_url = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"', url_list_str)[0]
# 8.設定跳轉欄位的headers
headers_ = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
'Referer': url_
}
# 新增,獲取檔案的大小, 就是把kb轉成MB
# 9.獲取視頻的資料
response_video = requests.get(video_url, headers=headers_, stream=True)
bytes_video = response_video.content
# 10.獲取音頻的資料
response_audio = requests.get(audio_url, headers=headers_, stream=True)
bytes_audio = response_audio.content
# 新增視頻獲取檔案的大小,單位kb
video_size = int(int(response_video.headers['content-length']) / 1024)
# 新增,獲取音頻檔案的大小
audio_size = int(int(response_audio.headers['content-length']) / 1024)
# 11.保存純視頻檔案
title_1 = title_ + '!' # 名稱進行修改,避免重名
with open(f'{title_1}.mp4', 'wb') as f:
f.write(bytes_video)
print(f"{title_1}>>>>純視頻檔案下載完畢.....大小為:{video_size}KB,{int(video_size/1024)}MB")
# 12.保存音頻資料檔案
with open(f'{title_1}.mp3', 'wb') as f:
f.write(bytes_audio)
print(f"{title_1}>>>>純音頻檔案下載完畢.....大小為:{audio_size}KB,{int(audio_size/1024)}MB")
# 13.利用第三方工具ffmpeg合成視頻,需要執行終端命令
os.system(f'ffmpeg -i {title_1}.mp3 -i {title_1}.mp4 -c copy {title_}.mp4 -loglevel quiet')
# 新增,顯示合成檔案的大小
res_ = int(os.stat(f'{title_}.mp4').st_size/1024)
print(f'{title_}視頻合成成功......大小為:{res_}KB,{int(res_/1024)}MB')
# 14. 移出純視頻檔案
os.remove(f'{title_1}.mp4')
print('移出純視頻檔案移出成功')
# 15.移出純音頻檔案
os.remove(f'{title_1}.mp3')
print('移出純音頻檔案移出成功')
print('程式執行完畢...')

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/207694.html
標籤:其他
下一篇:C語言回圈和遞回求階乘圖解
