Try   HackMD

資料科學期末專題_一鍵下載youtube音樂

東華大學_資工三_郭新拳_401621205

動機

家中長輩喜歡去youtube聽音樂,但將下載影片轉為mp3檔案的步驟,較為繁瑣,所以想直接寫一個code,讓長輩直接輸入想要下載的音樂歌名,便可以直接將檔案下載下來,這樣長輩們就不怕擔心整個操作步驟了!

目的

將youtube透過第三方軟體進行下載到本地端,這樣離線也能享受音樂了!

相關技術

  1. selenium
  2. beautiful soup
  3. youtube有反爬蟲機制

專案描述

運用selenium 模擬爬蟲,取得目標影片url連結,將url傳到第三方程式,然後進行mp3下載

結論

能使用的第三方下載軟體很多種,但下載速度都很慢,可能要花多一點的時間分別進行優化,如果該用戶有升級youtube premium的話就根本不需要下載音樂了

code_採用更改網址到其他下載頁面進行下載

此網頁容易有502 Bad Gateway,可能就要再重複requset一次

使用的第三方軟體 : https://yout.com/
from bs4 import BeautifulSoup from selenium import webdriver import re import unidecode import pandas import time import requests driver = webdriver.Chrome() driver.get("https://www.youtube.com/?gl=TW&tab=r11") #前往這個網址 search_input = driver.find_element_by_name("search_query") str = input("有興趣的音樂") search_input.send_keys(str) #帳號 start_search_btn = driver.find_element_by_id("search-icon-legacy") start_search_btn.click() time.sleep(5) url = driver.current_url html = requests.get(url) sp = BeautifulSoup(html.text, 'lxml') url_lt = [] video_lt=sp.find_all('a', class_="yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink spf-link",limit=10) #抓youtubw前10筆內容 tag_span = [] title_span = [] href_span = [] download_url = [] lt = [[] for j in range(10)] for i in range(10): tag_span = video_lt[i].get("href") title_span = video_lt[i].get("title") href_span = tag_span[9:] download_url = "https://yout.com/video/" + href_span +'/' lt[i] =download_url print(i+1,title_span) set_number = int(input()) #得到下載的目標網址 driver.get(lt[set_number]) download_btn = driver.find_element_by_class_name("recorder-type") download_btn.click() time.sleep(60) driver.close()

code_到第三方下載網頁輸入yt 影片url進行下載以及轉檔(ok)

缺點會跳出廣告視窗

使用的第三方軟體 : https://www.youtubeto.com/zh/
from bs4 import BeautifulSoup from selenium import webdriver import re import unidecode import pandas import time import requests from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.chrome.options import Options driver = webdriver.Chrome() driver.get("https://www.youtube.com/?gl=TW&tab=r11") #前往這個網址 search_input = driver.find_element_by_name("search_query") str = input("有興趣的音樂") search_input.send_keys(str) #帳號 start_search_btn = driver.find_element_by_id("search-icon-legacy") start_search_btn.click() time.sleep(5) url = driver.current_url html = requests.get(url) sp = BeautifulSoup(html.text, 'lxml') url_lt = [] video_lt=sp.find_all('a', class_="yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink spf-link",limit=10) #抓youtubw前10筆內容 tag_span = [] title_span = [] href_span = [] download_url = [] lt = [[] for j in range(10)] for i in range(10): tag_span = video_lt[i].get("href") title_span = video_lt[i].get("title") href_span = tag_span[9:] download_url = "https://youtube.com/" + tag_span +'/' lt[i] =download_url print("{:<8d} {}".format(i+1,title_span)) set_number = int(input()) -1 #得到下載的目標網址,輸入感興趣的號碼 driver.close() from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--disable-notifications") driver = webdriver.Chrome(options=chrome_options) driver.implicitly_wait(10) download = lt[set_number] driver.get("https://www.youtubeto.com/zh/") sent_url = driver.find_element_by_id("url") time.sleep(10) sent_url.send_keys(download) # load_mp3 = driver.find_element_by_id("DownloadMP3_text") load_mp4 = driver.find_element_by_id("DownloadMP4_text") action = ActionChains(driver) action.move_to_element(load_mp4).perform() action.click(load_mp3) #模擬滑鼠移動 load_mp3.click() time.sleep(60) driver.quit() #下載的音樂會存在download資料夾