一、前言&機遇
許久沒看私信內(nèi)容,一上線就看到了官方的私信,我已經(jīng)來到CSDN1024天啦!
想到注冊這個號的初衷是學(xué)習(xí)記錄爬蟲,后面漸漸變成了各種學(xué)習(xí)筆記。
勿忘初心,今天補寫一篇爬蟲文章,紀念一下(嘿嘿)
GitHub項目地址:https://github.com/Polaris119/Audio-crawler
二、爬蟲代碼
由于一些原因,關(guān)于某站的爬蟲,基礎(chǔ)不能細??。大家看代碼吧。
import requests
import re
import json
import os
"""
根據(jù)bv號和自定義文件名得到filename、url、headers
bv:視頻bv號
name:自己給待下載文件取的名字
"""
def bv_name(bv, name):
if not os.path.exists("D:/video"):
os.mkdir("D:/video")
fileName = f"D:/video/{name}"
URL = f'https://www.bilibili.com/video/{bv}'
headers = {
'referer': f'https://www.bilibili.com/video/{bv}?spm_id_from=333.337.search-card.all.click',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
return fileName, URL, headers
"""
獲取網(wǎng)頁源代碼
url:網(wǎng)頁鏈接
headers:請求頭
"""
def send_request(url, headers):
response = requests.get(url=url, headers=headers)
return response
"""
解析視頻數(shù)據(jù)
html_data:頁面源代碼,相當(dāng)于上個函數(shù)response.text
"""
def get_video_data(html_data):
# 提取視頻對應(yīng)的json數(shù)據(jù)
# <script>window\.__playinfo__=(.*?)</script>是在網(wǎng)絡(luò)上找的,隨便百度都找的到
json_data = re.findall('<script>window\.__playinfo__=(.*?)</script>', html_data)[0]
json_data = json.loads(json_data)
# 提取音頻的url地址
audio_url = json_data['data']['dash']['audio'][0]['backupUrl'][0]
return audio_url
"""
下載音頻
file_name:待下載文件地址
audio_url:音頻文件在網(wǎng)頁中的地址
headers:請求頭
"""
def save_data(file_name, audio_url, headers):
# 請求數(shù)據(jù)
audio_data = send_request(audio_url, headers).content
with open(file_name + '.mp3', mode='wb') as f:
f.write(audio_data)
# print("音頻下載完畢?。?!")
"""
測試使用,可以注釋掉。GUI界面會調(diào)用之前的函數(shù)
"""
# if __name__ == '__main__':
# filename, URL, headers = bv_name('BV1t14y1F7kd', '英文歌')
# res = send_request(URL, headers).text
# video = get_video_data(res)
# print(video)
三、爬蟲GUI
可視化才夠爽?。?!
- GUI代碼如下:
from PyQt5.Qt import *
from audio_spider import *
import sys
import time
class WorkerThread(QThread):
# 自定義信號,傳遞兩個字符串參數(shù)
finish = pyqtSignal(str, str)
def __init__(self, parent=None):
super(WorkerThread, self).__init__(parent)
self.text1 = None
self.text2 = None
def run(self):
# 調(diào)用audio_spider.py的函數(shù)
filename, url, headers = bv_name(self.text1, self.text2)
res = send_request(url, headers).text
video = get_video_data(res) # 音頻地址
start_time = time.time() # 下載開始時間
save_data(filename, video, headers)
end_time = time.time() # 下載結(jié)束時間
value1 = video # 音頻地址
value2 = "下載完成咯?。。∮脮r" + str(round(end_time - start_time, 2)) + '秒' # 下載用時,保留兩位小數(shù)
self.finish.emit(value1, value2) # 發(fā)射信號,傳遞結(jié)果給主線程
class mainwindow(QWidget):
def __init__(self):
super(mainwindow, self).__init__()
self.windowUI()
self.setWindowTitle("B站音頻提取")
self.resize(1000, 1000)
def windowUI(self):
palette = QPalette()
pix = QPixmap("./file/background.jpg")
pix = pix.scaled(self.width(), self.height())
palette.setBrush(QPalette.Background, QBrush(pix))
self.setPalette(palette)
label_1 = QLabel(self)
label_1.move(400, 70)
label_1.setText("B站音頻提取")
label_1.setFont(QFont('SimHei', 20))
label_2 = QLabel(self)
label_2.move(500, 900)
label_2.setText("數(shù)據(jù)來源:Bilibili")
label_3 = QLabel(self)
label_3.move(800, 900)
label_3.setText("作者:Polaris")
# label_3.setFont(QFont('Arial', 0))
label_4 = QLabel(self)
label_4.move(200, 200)
label_4.setText("輸入BV號")
label_4.setFont(QFont('SimSun', 20, 75))
label_5 = QLabel(self)
label_5.move(200, 300)
label_5.setText("輸入文件名")
label_5.setFont(QFont('SimSun', 20, 75))
label_6 = QLabel(self)
label_6.move(200, 480)
label_6.setText("音頻地址")
label_6.setFont(QFont('SimSun', 20, 75))
label_7 = QLabel(self)
label_7.move(200, 680)
label_7.setText("下載用時")
label_7.setFont(QFont('SimSun', 20, 75))
self.line_1 = QLineEdit(self) # BV號
self.line_1.resize(200, 40)
self.line_1.move(430, 200)
self.line_2 = QLineEdit(self) # 文件名
self.line_2.resize(200, 40)
self.line_2.move(430, 300)
self.text_1 = QTextEdit(self) # 音頻地址
self.text_1.move(430, 400)
self.text_2 = QTextEdit(self) # 下載進度
self.text_2.move(430, 600)
self.btn = QPushButton('立即下載', self)
self.btn.setFont(QFont('SimSun', 10, 75))
self.btn.resize(150, 80)
self.btn.move(750, 235)
# 在 mainwindow 類的構(gòu)造函數(shù)中創(chuàng)建了一個 WorkerThread 對象(在主線程中創(chuàng)建一個子線程對象)
self.worker_thread = WorkerThread()
# 綁定按鈕事件
self.btn.clicked.connect(self.start_thread)
# 將子線程的 finish 信號連接到主線程的 value_change 槽函數(shù)上
self.worker_thread.finish.connect(self.value_change)
def start_thread(self):
# 獲取文本框內(nèi)容
self.worker_thread.text1 = self.line_1.text()
self.worker_thread.text2 = self.line_2.text()
# 我們使用 moveToThread 方法將 worker_thread 移動到一個新的線程中(即子線程中)
# 將主線程中text1、text2的值傳遞到子線程中
self.worker_thread.moveToThread(self.worker_thread)
# 啟動子線程
self.worker_thread.start()
def value_change(self, value1, value2):
# 在槽函數(shù)中獲取子線程傳遞的結(jié)果,并進行處理
self.text_1.setText(value1)
self.text_2.setPlainText(value2)
if __name__ == '__main__':
app = QApplication(sys.argv)
a = mainwindow()
a.show()
sys.exit(app.exec_())
四、文件打包
給不懂代碼的小伙伴用一用,說不定就騙到一個入坑的(doge )
可以參考我的這篇文章:pyinstaller多文件打包exe
五、結(jié)果展示
兩小時的音頻只需3秒哦?。。?!
未來可期
文章到這里就要結(jié)束了,但故事還沒有結(jié)局
如果本文對你有幫助,記得點個贊??喲,也是對作者最大的鼓勵???♂?。
如有不足之處可以在評論區(qū)??多多指正,我會在看到的第一時間進行修正文章來源:http://www.zghlxwxcb.cn/news/detail-518313.html
作者:愛打瞌睡的CV君
CSDN:https://blog.csdn.net/qq_44921056
本文僅用于交流學(xué)習(xí),未經(jīng)作者允許,禁止轉(zhuǎn)載,更勿做其他用途,違者必究。文章來源地址http://www.zghlxwxcb.cn/news/detail-518313.html
到了這里,關(guān)于【我的創(chuàng)作紀念日】關(guān)于某站的音頻爬蟲+GUI的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!