코딩

배성재 텐 전체 다운로드 파이썬 코드 배성재 라디오 mp3 다시듣기

강한인상이다 2024. 10. 16. 21:06

초특가 미니가습기

 

요즘 배성제 텐 다시듣기를 하고 있습니다. 

 

유튜브에 올라와 있는건 편집 없이 올려져 있는거라 운전 중에 듣기 어렵더군요 

 

sbs 홈페이지에 노래 광고 없는 편집본이 있는데 일일이 다운 받기 힘들어 파이썬으로 전체 다운 받을 수 있는 코드를 만들었습니다. 

 

실행 방법은 아래와 같습니다. 먼저 파이썬이 설치되어 있어야 합니다.

 

1. 크롬 드라이버를 다운 받아 exe 파일을 실행시킨다 

 

chromedriver-win64.zip
8.51MB

 

 

2. 비쥬얼스튜디오 코드에서 필요한 라이브러리를 설치한다. 

 

pip install requests beautifulsoup4

 

pip install selenium

 

pip install webdriver-manager

 

3. 아래 py 파일을 실행한다

 

배성제텐다운로드.py
0.00MB

 

 

 

 

배성재 텐 전체 다운로드 파이썬 코드는 아래와 같습니다.

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import os
import urllib.parse
import requests
from bs4 import BeautifulSoup
import re

# 크롬 드라이버 설정
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 다운로드할 페이지 범위 설정
start_page = 1
end_page = 313

# 저장할 폴더 설정 (현재 디렉토리에 'mp3_files' 폴더를 생성)
download_folder = "mp3_files"
if not os.path.exists(download_folder):
    os.makedirs(download_folder)

# 파일 다운로드 함수
def download_file(url, file_name):
    response = requests.get(url)
    file_path = os.path.join(download_folder, file_name)
    with open(file_path, "wb") as file:
        file.write(response.content)

# 파일명에서 특수 문자를 제거하는 함수
def sanitize_filename(filename):
    # 탭 문자와 줄바꿈 문자 제거
    filename = filename.replace('\t', '').replace('\n', '')
    # 파일명에서 윈도우에서 허용되지 않는 특수 문자를 '_'로 대체
    return re.sub(r'[\\/*?:"<>|]', "_", filename)

# MP3 파일을 다운로드하는 함수
def download_mp3_files(soup, page_number):
    # MP3 파일 링크 찾기 (다운로드 버튼의 href 속성)
    download_links = soup.find_all('a', class_='podcast_btn_download')

    for link in download_links:
        raw_mp3_url = link['href']  # 파일 다운로드 링크
        decoded_url = urllib.parse.unquote(raw_mp3_url.split('fileUrl=')[-1].split('&')[0])
        original_file_name = f"page_{page_number}_{link['download']}.mp3"

        # 파일명 안전하게 변환
        safe_file_name = sanitize_filename(original_file_name)
        mp3_url = decoded_url.replace('%2F', '/')

        print(f"Downloading {safe_file_name} from {mp3_url}")
        download_file(mp3_url, safe_file_name)

# 페이지 이동 함수
def go_to_page(driver, page_number):
    try:
        # '다음페이지 보기' 버튼 클릭 (페이지가 11, 21, 31 등일 때 다음 페이지로 이동)
        clicks_needed = (page_number - 1) // 10  # 11페이지부터는 1번, 21페이지부터는 2번, 31페이지부터는 3번...

        for _ in range(clicks_needed):
            next_page_button = driver.find_element(By.ID, "program-front-radio-pagination-next")
            next_page_button.click()
            time.sleep(2)  # 페이지 로딩 대기

        # 페이지 번호에 해당하는 버튼 클릭
        page_link = driver.find_element(By.ID, f"program-front-radio-pagination-page-{page_number}")
        if "current" not in page_link.get_attribute("class"):
            page_link.click()
            time.sleep(2)  # 페이지 로딩 대기
    except Exception as e:
        print(f"페이지 이동 중 오류 발생: {e}")

# 메인 함수 - Selenium으로 페이지를 이동하면서 MP3 파일 다운로드
for page_number in range(start_page, end_page + 1):
    # 페이지 로드
    url = "https://programs.sbs.co.kr/radio/ten/aods/57944"
    driver.get(url)

    # 페이지 로드 후 약간의 대기 시간 (자바스크립트가 로드되도록)
    time.sleep(3)

    # 페이지 이동 함수 호출
    go_to_page(driver, page_number)

    # 페이지 HTML 소스를 BeautifulSoup으로 파싱
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')

    # 해당 페이지에서 MP3 파일을 다운로드
    print(f"Scraping page {page_number}...")
    download_mp3_files(soup, page_number)

# 크롬 드라이버 종료
driver.quit()

print("모든 MP3 파일 다운로드 완료!")

 

 

반응형