TBS크롤링

import pandas as pd
from dateutil.parser import parse
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait   # 해당 태그를 기다림
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException    # 태그가 없는 예외 처리
from selenium.common.exceptions import ElementNotVisibleException
from selenium.common.exceptions import StaleElementReferenceException
import time
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from dateutil import relativedelta

from selenium.common import exceptions

from glob import glob

programUrl = []
programTitle = []
programInfo= []
driver = webdriver.Chrome('C:./chromedriver_win32/chromedriver')
driver.get('http://tbs.seoul.kr/fm/programsDay.do')
div = driver.find_element_by_xpath('//*[@id="defCont"]/div[2]')
ul = div.find_elements_by_class_name('info')

for i in range(len(ul)):
    x = ul[i].text.split("\n")
    programUrl.append(ul[i].find_elements_by_tag_name("a")[0].get_attribute('href'))
    programTitle.append(x[0])
    programInfo.append(x[1])
    
driver.find_element_by_xpath('//*[@id="defCont"]/div[1]/p/a[2]').click()

div = driver.find_element_by_xpath('//*[@id="defCont"]/div[2]')
ul = div.find_elements_by_class_name('info')
#lis = ul.find_elements_by_tag_name('li')              

for j in range(len(ul)):
    x = ul[j].text.split("\n")
    programUrl.append(ul[j].find_elements_by_tag_name("a")[0].get_attribute('href'))
    programTitle.append(x[0])
    programInfo.append(x[1])
    

    
TBS_프로그램 = pd.DataFrame(data = list(zip(programUrl,programTitle,programInfo)) , columns = ["programUrl","programTitle","programInfo"])
#TBS_프로그램.to_csv("C:/Users/landg/Downloads/Python_Study_GM/도로교통공단/TBS_Radio_편성표.csv", encoding = "euc-kr")
TBS_프로그램
programUrl programTitle programInfo
0 http://tbs.seoul.kr/cont/FM/RadioPart2/intro/i... 라디오를 켜라 정연주입니다 (월-토) 05:00~07:00
1 http://tbs.seoul.kr/cont/FM/NewsFactory/intro/... 김어준의 뉴스공장 (월-금) 07:06~09:00
2 http://tbs.seoul.kr/cont/FM/economyplant/intro... 경제발전소 박연미입니다 (월-금) 09:00~10:00
3 http://tbs.seoul.kr/cont/FM/WithEun/intro/intr... 이은미와 함께라면 (월-금) 10:06~11:56
4 http://tbs.seoul.kr/cont/FM/KoreanWords/notice... 우리말 고운말 (월-금) 11:56~11:58
5 http://tbs.seoul.kr/cont/FM/djshow9595/intro/i... DJ SHOW 9595 (월-일) 12:11~14:00
6 http://tbs.seoul.kr/cont/FM/Hurricane/intro/in... 최일구의 허리케인 라디오 (월-일) 14:06~16:00
7 http://tbs.seoul.kr/cont/FM/folkSong/intro/int... 함춘호의 포크송 (월-금) 16:06~17:00
8 http://tbs.seoul.kr/cont/FM/lacucaracha/intro/... 김기욱의 라쿠카라차 (월-금) 17:00~18:00
9 http://tbs.seoul.kr/cont/FM/opening/intro/intr... 신장식의 신장개업 (월-금) 18:06~20:00
10 http://tbs.seoul.kr/cont/FM/Ju/intro/intro.do?... 아닌 밤중에 주진우입니다 (월-금) 20:00~21:00
11 http://tbs.seoul.kr/cont/FM/leeLoveletter/intr... 이가희의 러브레터 (월-금) 21:00~22:00
12 http://tbs.seoul.kr/cont/FM/radio/intro/intro.... 우리동네 라디오 (월-금) 21:44~21:59
13 http://tbs.seoul.kr/cont/FM/sweet_night/intro/... 달콤한 밤 황진하입니다 (월-일) 22:00~24:00
14 http://tbs.seoul.kr/cont/FM/tbsMusicOnly/music... TBS MUSIC ONLY (월-일) 00:00~03:00
15 http://tbs.seoul.kr/cont/FM/weRun/intro/intro.... 지금 우리는 새벽을 달리고 (월-일) 03:00~05:00
16 http://tbs.seoul.kr/cont/FM/sunday_classic/mus... 일요클래식 최영옥입니다 (일) 05:00~08:00
17 http://tbs.seoul.kr/cont/FM/NewsFactoryWeek/in... 김어준의 뉴스공장 주말특근 (토) 07:00~09:00
18 http://tbs.seoul.kr/cont/FM/readtoday/intro/in... 오늘도 읽음 (일) 08:00~10:00
19 http://tbs.seoul.kr/cont/FM/agora/mc/mc.do?pro... TBS 아고라 (토) 09:00~10:00
20 http://tbs.seoul.kr/cont/FM/pleasantSat/intro/... 기분좋은 토요일 일요일 조현아입니다 (토-일) 10:00~12:00
21 http://tbs.seoul.kr/cont/FM/Hurricane/intro/in... 최일구의 허리케인 라디오 (월-일) 14:06~16:00
22 http://tbs.seoul.kr/cont/FM/4624/intro/intro.d... 박성호의 사육의 이십사 (토-일) 16:00~18:00
23 http://tbs.seoul.kr/cont/FM/swtMelody/intro/in... 웅산의 스윗멜로디 (토-일) 18:00~20:00
24 http://tbs.seoul.kr/cont/FM/WeekendGood/intro/... 주말이 좋다 나선홍입니다 (토-일) 20:00~22:00
25 http://tbs.seoul.kr/cont/FM/sweet_night/intro/... 달콤한 밤 황진하입니다 (월-일) 22:00~24:00
26 http://tbs.seoul.kr/cont/FM/tbsMusicOnly/music... TBS MUSIC ONLY (월-일) 00:00~03:00
27 http://tbs.seoul.kr/cont/FM/weRun/intro/intro.... 지금 우리는 새벽을 달리고 (월-일) 03:00~05:00
#우리말 고운말 및 중복 drop
idx_ = list(TBS_프로그램[TBS_프로그램.duplicated()].index)
idx_.append(TBS_프로그램[TBS_프로그램["programTitle"] == "우리말 고운말"].index[0])
TBS_프로그램.drop(idx_, inplace = True)
TBS_프로그램.reset_index(drop=True, inplace = True)
TBS_프로그램
programUrl programTitle programInfo
0 http://tbs.seoul.kr/cont/FM/RadioPart2/intro/i... 라디오를 켜라 정연주입니다 (월-토) 05:00~07:00
1 http://tbs.seoul.kr/cont/FM/NewsFactory/intro/... 김어준의 뉴스공장 (월-금) 07:06~09:00
2 http://tbs.seoul.kr/cont/FM/economyplant/intro... 경제발전소 박연미입니다 (월-금) 09:00~10:00
3 http://tbs.seoul.kr/cont/FM/WithEun/intro/intr... 이은미와 함께라면 (월-금) 10:06~11:56
4 http://tbs.seoul.kr/cont/FM/djshow9595/intro/i... DJ SHOW 9595 (월-일) 12:11~14:00
5 http://tbs.seoul.kr/cont/FM/Hurricane/intro/in... 최일구의 허리케인 라디오 (월-일) 14:06~16:00
6 http://tbs.seoul.kr/cont/FM/folkSong/intro/int... 함춘호의 포크송 (월-금) 16:06~17:00
7 http://tbs.seoul.kr/cont/FM/lacucaracha/intro/... 김기욱의 라쿠카라차 (월-금) 17:00~18:00
8 http://tbs.seoul.kr/cont/FM/opening/intro/intr... 신장식의 신장개업 (월-금) 18:06~20:00
9 http://tbs.seoul.kr/cont/FM/Ju/intro/intro.do?... 아닌 밤중에 주진우입니다 (월-금) 20:00~21:00
10 http://tbs.seoul.kr/cont/FM/leeLoveletter/intr... 이가희의 러브레터 (월-금) 21:00~22:00
11 http://tbs.seoul.kr/cont/FM/radio/intro/intro.... 우리동네 라디오 (월-금) 21:44~21:59
12 http://tbs.seoul.kr/cont/FM/sweet_night/intro/... 달콤한 밤 황진하입니다 (월-일) 22:00~24:00
13 http://tbs.seoul.kr/cont/FM/tbsMusicOnly/music... TBS MUSIC ONLY (월-일) 00:00~03:00
14 http://tbs.seoul.kr/cont/FM/weRun/intro/intro.... 지금 우리는 새벽을 달리고 (월-일) 03:00~05:00
15 http://tbs.seoul.kr/cont/FM/sunday_classic/mus... 일요클래식 최영옥입니다 (일) 05:00~08:00
16 http://tbs.seoul.kr/cont/FM/NewsFactoryWeek/in... 김어준의 뉴스공장 주말특근 (토) 07:00~09:00
17 http://tbs.seoul.kr/cont/FM/readtoday/intro/in... 오늘도 읽음 (일) 08:00~10:00
18 http://tbs.seoul.kr/cont/FM/agora/mc/mc.do?pro... TBS 아고라 (토) 09:00~10:00
19 http://tbs.seoul.kr/cont/FM/pleasantSat/intro/... 기분좋은 토요일 일요일 조현아입니다 (토-일) 10:00~12:00
20 http://tbs.seoul.kr/cont/FM/4624/intro/intro.d... 박성호의 사육의 이십사 (토-일) 16:00~18:00
21 http://tbs.seoul.kr/cont/FM/swtMelody/intro/in... 웅산의 스윗멜로디 (토-일) 18:00~20:00
22 http://tbs.seoul.kr/cont/FM/WeekendGood/intro/... 주말이 좋다 나선홍입니다 (토-일) 20:00~22:00
TBS_프로그램.to_csv("C:./TBS_Radio_편성표.csv", encoding = "euc-kr")

선곡표 크롤링

import re
driver = webdriver.Chrome('C:/Users/landg/Downloads/chromedriver_win32/chromedriver')
weekdays_ = {0: "월", 1:"화", 2:"수", 3:"목", 4:"금", 5:"토", 6:"일"}
for k in range(len(TBS_프로그램)):
    날짜 = []
    곡명 = []
    가수 = []
     = []
     = []
     = []
    요일 = []
    프로그램명 = []
    driver.get(TBS_프로그램["programUrl"][k])
    go = 0
    ul = driver.find_element_by_xpath('//*[@id="contbox"]/div[2]/div[1]/ul[1]')
    lis = ul.find_elements_by_tag_name('li')
 
    for index_, value_ in enumerate(lis):
        urls = value_.find_elements_by_tag_name("a")
        for url in urls:
            if ("선곡" in  url.text or "PLAYLIST" in  url.text or "노래" in  url.text) :
                go = url.get_attribute('href')
                print(go)
                print(url.text)
                print(TBS_프로그램["programTitle"][k])
            else: 
                pass
http://tbs.seoul.kr/cont/FM/RadioPart2/musiclist/musiclist.do?programId=PG2061678A
오늘의 선곡표
라디오를 켜라 정연주입니다
http://tbs.seoul.kr/cont/FM/WithEun/playlist/playlist.do?programId=PG2061716A
선곡표
이은미와 함께라면
http://tbs.seoul.kr/cont/FM/djshow9595/playlist/playlist.do?programId=PG2062074A
DJ's PLAYLIST
DJ SHOW 9595
http://tbs.seoul.kr/cont/FM/Hurricane/musiclist/musiclist.do?programId=PG2061460A
오늘의 방송(선곡표)
최일구의 허리케인 라디오
http://tbs.seoul.kr/cont/FM/folkSong/playlist/playlist.do?programId=PG2061987A
선곡표
함춘호의 포크송
http://tbs.seoul.kr/cont/FM/lacucaracha/playlist/musiclist.do?programId=PG2062076A
선곡표
김기욱의 라쿠카라차
http://tbs.seoul.kr/cont/FM/Ju/playlist/playlist.do?programId=PG2061767A
선곡표
아닌 밤중에 주진우입니다
http://tbs.seoul.kr/cont/FM/leeLoveletter/musiclist/musiclist.do?programId=PG2061286A
선곡표 및 선물당첨자
이가희의 러브레터
http://tbs.seoul.kr/cont/FM/sweet_night/musiclist/musiclist.do?programId=PG2061277A
선곡표
달콤한 밤 황진하입니다
http://tbs.seoul.kr/cont/FM/tbsMusicOnly/music1/musiclist1.do?programId=PG2061842A
0시~2시 MUSIC 선곡표
TBS MUSIC ONLY
http://tbs.seoul.kr/cont/FM/tbsMusicOnly/music2/musiclist2.do?programId=PG2061842A
2시~3시 MUSIC 선곡표
TBS MUSIC ONLY
http://tbs.seoul.kr/cont/FM/weRun/musiclist/musiclist.do?programId=PG2061831A
선곡표
지금 우리는 새벽을 달리고
http://tbs.seoul.kr/cont/FM/sunday_classic/musiclist/musiclist.do?programId=PG2062032A
선곡표
일요클래식 최영옥입니다
http://tbs.seoul.kr/cont/FM/pleasantSat/musiclist/musiclist.do?programId=PG2061477A
기분좋은 토요일 노래
기분좋은 토요일 일요일 조현아입니다
http://tbs.seoul.kr/cont/FM/pleasantSat/musiclist2/musiclist2.do?programId=PG2061477A
기분좋은 일요일 노래
기분좋은 토요일 일요일 조현아입니다
http://tbs.seoul.kr/cont/FM/4624/musiclist/musiclist.do?programId=PG2062011A
선곡표&선물당첨자
박성호의 사육의 이십사
None
이름모를 추억의 팝
"이 노래 뭐였지?"(토)
웅산의 스윗멜로디
http://tbs.seoul.kr/cont/FM/swtMelody/playlist/playlist.do?programId=PG2061649A
오늘의 선곡표
웅산의 스윗멜로디
http://tbs.seoul.kr/cont/FM/WeekendGood/musiclist/musiclist.do?programId=PG2061848A
선곡표
주말이 좋다 나선홍입니다
import re
driver = webdriver.Chrome('C:/Users/landg/Downloads/chromedriver_win32/chromedriver')
weekdays_ = {0: "월", 1:"화", 2:"수", 3:"목", 4:"금", 5:"토", 6:"일"}
for k in range(len(TBS_프로그램)):
    날짜 = []
    곡명 = []
    가수 = []
     = []
     = []
     = []
    요일 = []
    프로그램명 = []
    driver.get(TBS_프로그램["programUrl"][k])
    go = {}
    ul = driver.find_element_by_xpath('//*[@id="contbox"]/div[2]/div[1]/ul[1]')
    lis = ul.find_elements_by_tag_name('li')
    for index, value in enumerate(lis):
        urls = value.find_elements_by_tag_name("a")
        for url in urls:
            if ("선곡" in  url.text or "PLAYLIST" in  url.text or "노래" in  url.text):
                go[url.text] = url.get_attribute('href')
    
    for idx, values in go.items():
        if values!= None:
            driver.get(values)
            time.sleep(3)
            b = idx
            element = driver.find_element_by_id("board") #iframe 태그 엘리먼트 찾기
            driver.switch_to.frame(element)
            time.sleep(2)
            driver.find_element_by_xpath('//*[@id="boardVO"]/table/tbody/tr[1]/td[2]/a').click()

            while True:
                try:
                    content = driver.find_element_by_xpath('//*[@id="boardVO"]/table[1]/tbody/tr[3]/td')
                    contents_ = content.text.split("\n")
                    
                    for i in range(len(contents_)):
                        contents_[i] = re.sub('\([^)]*\)',"",contents_[i])
                        contents_[i] = re.sub('\[[^]]*\]',"",contents_[i])
                        contents_[i] = contents_[i].strip()
                        if contents_[i].find("-") == 0:
                            contents_[i] = contents_[i][1:] 
                        contents_[i] = contents_[i].replace("-", "/")
                        contents_[i] = contents_[i].replace("_", "/")
                        contents_[i] = contents_[i].replace("-", "")
                        #contents_[i] = contents_[i].replace("=", "")
                        #contents_[i] = contents_[i].replace(">", "")
                        if contents_[i].find(".") == 1:
                            contents_[i] = contents_[i][2:] 
                        if contents_[i].count("/") ==1:
                            if (("/" in contents_[i]) and ("<" not in contents_[i]) and ("=" not in contents_[i] ) and ("#") not in contents_[i]) and ("*" not in contents_[i]):
                                splits_ = contents_[i].split("/")
                                if  ((splits_[0].strip()[0].isnumeric() == False) and (splits_[1].strip()[0].isnumeric() == False)):
                                    #contents_[i] = contents_[i].replace(".", "")
                                    가수.append(splits_[0].strip())
                                    곡명.append(splits_[1].strip())
                                    날짜.append(driver.find_element_by_xpath('//*[@id="boardVO"]/table[1]/tbody/tr[1]/td[2]').text)

#                     for i in range(len(contents_)):
#                         if "/" in contents_[i]:
#                             idx_ = contents_[i].index("/")
#                             가수.append(contents_[i][:idx_].rstrip())
#                             곡명.append(contents_[i][idx_+1:].lstrip())
#                             날짜.append(driver.find_element_by_xpath('//*[@id="boardVO"]/table[1]/tbody/tr[1]/td[2]').text)
                except:
                    pass
                try:
                    driver.find_element_by_xpath('//*[@id="boardVO"]/table[2]/tbody/tr[2]/td/a').click()
                except:
                    break


        for j in range(len(날짜)):
            날짜[j] = 날짜[j][:10]
            x = parse(날짜[j])
            .append(x.year)
            .append(x.month)
            .append(x.day)
            요일.append(weekdays_[x.weekday()])
            프로그램명.append(TBS_프로그램["programTitle"][k])

            df = pd.DataFrame(data = list(zip(프로그램명,,,,요일,곡명,가수)) , columns = ["프로그램명","년","월","일","요일","노래이름","가수이름"])
            a = TBS_프로그램['programTitle'][k]
            b = re.sub("'" , "" , b)
            exec(f"df.to_csv('C:/Users/landg/Downloads/도로교통공단_프로젝트/{a}_{b}.csv', encoding = 'utf-8',index=False)")
       

df
프로그램명 요일 노래이름 가수이름
0 라디오를 켜라 정연주입니다 2021 10 8 발란스 옥상달빛
1 라디오를 켜라 정연주입니다 2021 10 8 금요일에 만나요 아이유
2 라디오를 켜라 정연주입니다 2021 10 8 상상 더하기 라붐
3 라디오를 켜라 정연주입니다 2021 10 8 love on top beyonce
4 라디오를 켜라 정연주입니다 2021 10 8 알고 싶어요 양파
... ... ... ... ... ... ... ...
30517 라디오를 켜라 정연주입니다 2009 9 11 가을 우체국 앞에서 YB
30518 라디오를 켜라 정연주입니다 2009 9 11 미스터 카라
30519 라디오를 켜라 정연주입니다 2009 9 11 인디언 보이 MC몽
30520 라디오를 켜라 정연주입니다 2009 9 11 왼손잡이 패닉
30521 라디오를 켜라 정연주입니다 2009 9 11 하이힐 박혜경

30522 rows × 7 columns

Comments