Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- merge
- 빅데이터분석
- sqld
- 불순도제거
- 여러 데이터 검색
- 그래프 생성 문법
- max
- sql
- difftime
- loop 문
- Dense_Rank
- 데이터분석가
- count
- if문 작성법
- 팀스파르타
- 회귀분석
- Sum
- %in%
- 단순회귀 분석
- 빅데이터
- 데이터분석
- 막대그래프
- 순위출력
- 상관관계
- 히스토그램 그리기
- 회귀분석 알고리즘
- 정보획득량
- 총과 카드만들기
- Intersect
- 그래프시각화
Archives
- Today
- Total
ch0nny_log
[빅데이터분석] Python_38. 파이썬 웹스크롤링10(유튜브) 본문
◈ 유튜브 웹 스크롤링
실습1. 크롬에서 뉴진스의 노래 모음 list 함수 생성하기
1. 뉴진스 노래 제목들 수집하기
https://www.google.com/search?q=%EB%89%B4%EC%A7%84%EC%8A%A4%EB%85%B8%EB%9E%98%EC%A0%9C%EB%AA%A9%EB%93%A4&oq=%EB%89%B4%EC%A7%84%EC%8A%A4%EB%85%B8%EB%9E%98%EC%A0%9C%EB%AA%A9%EB%93%A4&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQABiABBiiBNIBCDQ3MTFqMGo0qAIAsAIB&sourceid=chrome&ie=UTF-8&clie=1
2. 필요한 모듈을 불러오기
#크롬 로봇 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service #크롬 설치 자동화 from webdriver_manager.chrome import ChromeDriverManager # html 에서 데이터 수집을 편하게 from bs4 import BeautifulSoup import time # 부하주지 않도록 예의를 지키는 모듈
3. 크롬 로봇을 지정합니다.service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service)
4. 뉴진스 노래 제목들을 출력하는데 웹페이지를 크롬 로봇이 열 수 있게 합니다.driver.get("https://www.google.com/search?q=%EB%89%B4%EC%A7%84%EC%8A%A4%EB%85%B8%EB%9E%98%EC%A0%9C%EB%AA%A9%EB%93%A4&oq=%EB%89%B4%EC%A7%84%EC%8A%A4%EB%85%B8%EB%9E%98%EC%A0%9C%EB%AA%A9%EB%93%A4&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQABiABBiiBNIBCDQ3MTFqMGo0qAIAsAIB&sourceid=chrome&ie=UTF-8&clie=1")
-> 자동으로 웹페이지를 염
5. 페이지가 로드 되는 시간을 줍니다.time.sleep(3)
6. 웹페이즈의 html 코드를 BeautifulSoup로 파싱합니다.html = driver.page_source soup = BeautifulSoup( html, "html.parser" ) print(soup)
7. html 코드에서 노래 제목들이 있는 곳의 테그와 클래스로 접근합니다,song_elements = soup.select ("div.junCMe > div.CYJS5e.title") #태그주소 print(song_elements)
8. song_elements 코드에서 노래 제목들만 리스트에 result라는 list에 담아내시오.result = [] for i in song_elements: result.append(i.text) print(result)
9. 크롬 로봇이 웹브라우져를 닫게 하시오.
driver.quit()
10. 위 코드를 get_song_lists('노래제목들' ) 함수로 생성하시오.# 질문: 뉴진스 노래 조회수 순위 데이터 수집과 시각화 def get_song_lists(keyword): #크롬 로봇 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service #크롬 설치 자동화 from webdriver_manager.chrome import ChromeDriverManager # html 에서 데이터 수집을 편하게 from bs4 import BeautifulSoup import time # 부하주지 않도록 예의를 지키는 모듈 #3. 크롬 로봇을 지정합니다. service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) #4. 뉴진스 노래 제목들을 출력하는데 웹페이지를 크롬로봇이 열수 있게 합니다. driver.get(f"https://www.google.com/search?q={keyword}&oq=&gs_lcrp=EgZjaHJvbWUqCQgBEEUYOxjCAzIJCAAQRRg7GMIDMgkIARBFGDsYwgMyCQgCEEUYOxjCAzIJCAMQRRg7GMIDMgkIBBBFGDsYwgMyCQgFEEUYOxjCAzIJCAYQRRg7GMIDMgkIBxBFGDsYwgPSAQkxMzcwajBqMTWoAgiwAgE&sourceid=chrome&ie=UTF-8&clie=1") #5. 페이지가 로드되는 시간을 줍니다. time.sleep(3) #6. 웹페이지의 html 코드를 뷰티플 수프로 파싱합니다. html = driver.page_source soup = BeautifulSoup( html, "html.parser" ) #7. html 코드에서 노래제목들이 있는 곳의 테그와 클래스로 접근합니다. song_elements = soup.select('div.junCMe > div.CYJS5e.title') #8. song_elements html 코드에서 노래제목들만 출력하시오 ! result = [ ] for i in song_elements: result.append( i.text ) #9. 크롬 로봇이 웹브라우져를 닫게 합니다. driver.quit() return result
실습2. 유튜브에서 뉴진스의 노래 모음 list 함수 생성하기
1. 필요한 패키지 불러오기
#크롬 로봇 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service #크롬 설치 자동화 from webdriver_manager.chrome import ChromeDriverManager # html 에서 데이터 수집을 편하게 from bs4 import BeautifulSoup import time # 부하주지 않도록 예의를 지키는 모듈 import pandas as pd # 데이터 분석용 import matplotlib.pyplot as plt # 데이터 시각화용
2. 노래제목들을 불러오기
songs = get_song_lists('뉴진스 노래 제목들') print(songs)
3. 크롬 로봇을 지정합니다.
service = Service(ChromeDriverManager().install()) driver =webdriver.Chrome(service=service)
4. 각 노래에 대한 유튜브 링크추출● 가수명과 노래 사이에 '+' 기입 print(search_url)for i in songs: search_query =f'뉴진스 {i}' print(search_query)
for i in songs: search_query =f'뉴진스 {i}' search_url =f'https://www.youtube.com/results?search_query={search_query.replace(' ','+')}' # 가수명과 노래 사이에 '+' 기입 print(search_url)
● 구글에서 먼저 seach 하고 유튜브로 넘기게끔 하시오.
for i in songs: search_query =f'뉴진스 {i}' search_url =f'https://www.youtube.com/results?search_query={search_query.replace(' ','+')}' # 가수명과 노래 사이에 '+' 기입 driver.get(search_url) time.sleep(3)
5. 첫번째 동영상의 조회수 추출# 첫번째 동영상의 조회수 추출 view_cnt = driver.find_element(By.XPATH, '//*[@id="metadata-line"]/span[1]') # By.XPATH 방식으로 HTML코드를 검색하는데 id가 metadata-line 이 부분을 찾아서 spqn 태그 1번째 코드를 가져오라는 뜻 view_cnt_text =view_cnt.text print(view_cnt_text)view_cnt = driver.find_element(By.XPATH, '//*[@id="metadata-line"]/span[1]')
-> By.XPATH 방식으로 HTML코드를 검색하는데 id가 metadata-line 이 부분을 찾아서 spqn 태그 1번째 코드를 가져오라는 뜻
● 조회수를 정수형으로 변환
# 조회수를 정수형으로 변환 if '억' in view_cnt_text: view_count = float(view_cnt_text.replace('조회수','').replace('억','').replace('회','')) * 100000000 elif '만' in view_cnt_text: view_count = float(view_cnt_text.replace('조회수','').replace('만','').replace('회','')) * 10000 else: view_count = float(view_cnt_text.replace('조회수','').replace('회','').replace(',','')) view_count = int(view_count) print(view_count)
6. 조회수 담는 리스트만들기view_counts # 3뒤에 view_count = int(view_count) #5 뒤에 view_counts.append(view_count)
7. 웹드라이버 종료하기driver.quit()
8.데이터 프레임 생성하기df = pd.DataFrame ( { '노래제목' :songs, '조회수' : view_counts}) df
9. 데이터 프레임을 csv 파일로 저장하기.df.to_csv("c:\\data\\ns_song.csv", index = False, encoding ="utf-8-sig")
문제1. 위의 코드를 함수로 생성하는데 실행하면 해당 가수의 노래와 조회수가 csv 파일로 저장되게하시오.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time import pandas as pd import matplotlib.pyplot as plt def get_song_lists(search_query): # Set up the Chrome driver service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) # Open the Google search page with the specified query search_url = f"https://www.google.com/search?q={search_query}" driver.get(search_url) # Wait for the page to load time.sleep(3) # Parse the page source with BeautifulSoup html = driver.page_source soup = BeautifulSoup(html, "html.parser") # Select elements that contain the song titles song_elements = soup.select('div.junCMe > div.CYJS5e.title') # Extract the song titles result = [i.text for i in song_elements] # Close the browser driver.quit() return result def song_view_cnt(artist_name): # 2. 노래 제목들을 불러옵니다. songs = get_song_lists(f"{artist_name} 노래 제목들") # 3. 크롬 로봇을 지정합니다. service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) # 조회수 담는 리스트 view_counts = [] # 4. 각 노래에 대해서 유튜브 조회수 추출 for song in songs: search_query = f"{artist_name} {song}" search_url = f"https://www.youtube.com/results?search_query={search_query.replace(' ','+') }" driver.get(search_url) time.sleep(2) try: # 첫번째 동영상의 조회수 추출 view_cnt = driver.find_element(By.XPATH, '//*[@id="metadata-line"]/span[1]') view_cnt_text = view_cnt.text # 조회수를 정수형으로 변환 if '억' in view_cnt_text: view_count = float(view_cnt_text.replace('조회수', '').replace('억', '').replace('회','')) * 100000000 elif '만' in view_cnt_text: view_count = float(view_cnt_text.replace('조회수', '').replace('만', '').replace('회','')) * 10000 else: view_count = float(view_cnt_text.replace('조회수', '').replace('회','').replace(',','')) view_count = int(view_count) except Exception as e: print(f"조회수를 가져오는 중 오류 발생: {e}") view_count = 0 # 조회수를 가져오지 못한 경우 0으로 처리 view_counts.append(view_count) # 웹드라이버 종료 driver.quit() # 데이터 프레임 생성 df = pd.DataFrame({ '노래제목': songs, '조회수': view_counts }) # 데이터 프레임을 csv 파일로 저장 df.to_csv(f"c:\\data\\{artist_name}_song_views.csv", index=False, encoding="utf-8-sig") print(f"{artist_name}의 노래와 조회수가 {artist_name}_song_views.csv 파일로 저장되었습니다.")
★ 위 코드를 사용하여 시각화 하기
1. 뉴진스_song_views.csv 로 판다스 데이터 프레임을 생성하시오 ,
import pandas as pd ns = pd.read_csv('c:\\data\\뉴진스_song_views.csv') ns
2. 조회수가 높은 것 부터 노래제목과 조회수를 출력하시오.
from pandasql import sqldf pysqldf = lambda q : sqldf(q,globals()) q = """ select * from ns order by 조회수 desc; """ pysqldf(q)
3. 위 의 상태로 csv를 저장하시오.ns2 = pysqldf(q) ns2.to_csv("c:\\data\\ns_sort.csv", index=False, encoding ='utf-8-sig')
4. ns2 데이터 프레임의 컬럼의 데이터를 가지고 시각화하시오
import matplotlib.pyplot as plt plt.rcParams['font.family'] = 'Malgun Gothic' # 윈도우용 맑은 고딕 폰트 설정 plt.figure( figsize=(12,8) ) plt.barh( ns2['노래제목'], ns2['조회수'], color='skyblue' ) plt.show()
5. 위의 그래프를 다시 출력하는데 조회수가 높은 노래가 위쪽에 먼저 나오게 하시오.
import pandas as pd ns = pd.read_csv('c:\\data\\뉴진스_song_views.csv') from pandasql import sqldf pysqldf = lambda q : sqldf(q,globals()) # 데이터 프레임 만들기 q = """ select * from ns order by 조회수 asc; """ pysqldf(q) ns2 = pysqldf(q) ns2.to_csv("c:\\data\\ns_sort.csv", index=False, encoding ='utf-8-sig') # 그래프 출력 import matplotlib.pyplot as plt plt.rcParams['font.family'] = 'Malgun Gothic' # 윈도우용 맑은 고딕 폰트 설정 plt.figure( figsize=(12,8) ) plt.barh( ns2['노래제목'], ns2['조회수'], color='skyblue' ) plt.show()
'빅데이터 분석(with 아이티윌) > python' 카테고리의 다른 글
[빅데이터분석] Python_41. 파이썬 웹 스크롤링 (youtube text) (0) | 2024.08.26 |
---|---|
[빅데이터분석] Python_40. 파이썬 이미지 스크롤링 2 (Bing ) (0) | 2024.08.26 |
[빅데이터분석] Python_37. 파이썬 웹스크롤링9 (쿠팡) & pandas (0) | 2024.08.22 |
[빅데이터분석] Python_36. 파이썬 웹스크롤링8 (네이버 쇼핑) (0) | 2024.08.20 |
[빅데이터분석] Python_35. 파이썬 웹 스크롤링 7 (네이버 블로그) & 시각화(워드클라우드) (0) | 2024.08.20 |