본문 바로가기

데이터 청년 캠퍼스(경남대학교)/스터디

2021-07-12

크롤러

 

cmd창에서 pip install selenium

               pip install chrome-autoinstaller

 

파이썬 IDLE창에서 import chromedriver_autoinstaller

                         chromedriver_autoinstaller.installer()

 

주피터에서

%pip install chromedriver_autoinstaller
import chromedriver_autoinstaller
chromedriver_autoinstaller.install( )
from selenium import webdriver
driver= webdriver.Chrome()

 

멜론차트 크롤링하기

# 멜론에서 멜론차트 크롤링하기

#Step 1. 필요한 모듈을 로딩합니다
from selenium import webdriver
import time          

#Step 2.
print("=" *100)
print("멜론")
print("=" *100)
print("\n")

#Step 3. 크롬 드라이버 설정 및 웹 페이지 열기
chrome_path = "c:/temp/chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

url = 'https://www.melon.com/'
driver.get(url) #페이지에 접속
time.sleep(2)

 

멜론 페이지에서 멜론차트 클릭

driver.find_element_by_link_text('멜론차트').click()
time.sleep(2)

 

beautiful soup사용

#Step 6.Beautiful Soup 로 본문 내용만 추출하기
from bs4 import BeautifulSoup
html_1 = driver.page_source #현재 페이지의 전체 소스코드를 다 가져오기
soup_1 = BeautifulSoup(html_1, 'html.parser')

content_1 = soup_1.find('div','service_list_song type02 no_rank d_song_list').find_all('a')
for i in content_1 :
    print(i.get_text().replace("\n"," ").strip()) #stripe 좌우공백없애기
    print("\n")

그런데 이렇게 긁어오면 가수가 2번씩 출력됨

 

from selenium import webdriver
import time

ft_name = input('결과를 저장할 txt형식의 파일명을 쓰세요(예: c:\\temp\\riss.txt): ')
fc_name = input('결과를 저장할 csv형식의 파일명을 쓰세요(예: c:\\temp\\riss.csv): ')
fx_name = input('결과를 저장할 xls형식의 파일명을 쓰세요(예: c:\\temp\\riss.xls): ')

chrome_path = "c:/temp/chromedriver_win32/chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

url = 'https://www.melon.com/'
driver.get(url)
time.sleep(2)

driver.find_element_by_link_text('멜론차트').click()
time.sleep(2)

#Step 6.Beautiful Soup 로 본문 내용만 추출하기
from bs4 import BeautifulSoup
html_1 = driver.page_source #현재 페이지의 전체 소스코드를 다 가져오기
soup_1 = BeautifulSoup(html_1, 'html.parser')

content_1 = soup_1.find('div','service_list_song type02 no_rank d_song_list').find_all('tr') # 10개의 li태그
for i in content_1 :
    print(i.get_text().replace("\n"," ").strip()) #stripe 좌우공백없애기
    no2 = [ ]        #순위
title2 = [ ]     #노래 제목
writer2 = [ ]    #가수 저장
org2 = [ ]       #앨범명 저장
no = 1

for b in content_1[1:] :    
        #1. 논문제목 있을 경우만
            f = open(ft_name, 'a' , encoding="UTF-8")
            
            
            print('1.순위:',no)
            no2.append(no)
            f.write('\n'+'1.순위:' + str(no))
            
            title = b.find('div','wrap_song_info').find('span').get_text()
            title = title.strip()
            print('2.제목:',title)
            title2.append(title)
            f.write('\n' + '2.제목:' + title)
            
            singer= b.find('div','ellipsis rank02').find('a').get_text()
            print('3.가수:',singer)
            writer2.append(singer)
            f.write('\n' + '3.가수:' + singer)

            org = b.find('div','ellipsis rank03').find('a').get_text()
            print('4.앨범:' , org)
            org2.append(org)
            f.write('\n' + '4.앨범:' + org + '\n')
            
            f.close( )
            
            no += 1
            print("\n")


      # 페이지 변경 전 1초 대기 

        
print("요청하신 작업이 모두 완료되었습니다")

# Step 10. 수집된 데이터를 xls와 csv 형태로 저장하기
import pandas as pd 

df = pd.DataFrame()
df['순위']=no2
df['제목']=pd.Series(title2)
df['가수']=pd.Series(writer2)
df['앨범']=pd.Series(org2)

# xls 형태로 저장하기
df.to_excel(fx_name,index=False, encoding="utf-8")

# csv 형태로 저장하기
df.to_csv(fc_name,index=False, encoding="utf-8-sig")

print('요청하신 데이터 수집 작업이 정상적으로 완료되었습니다')

스터디에서 제시해준 해결방안

 


두 번째는 빌보드에서 긁어오기

 

#Step 1. 필요한 모듈을 로딩합니다
from selenium import webdriver
import time          

#Step 2.
print("=" *100)
print("빌보드")
print("=" *100)
print("\n")

#Step 3. 크롬 드라이버 설정 및 웹 페이지 열기
chrome_path = "c:/temp/chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

url = 'https://www.billboard.com/'
driver.get(url) #페이지에 접속
time.sleep(2)

 

빌보드 페이지에서 HOT 100클릭

driver.find_element_by_link_text('HOT 100').click()
time.sleep(2)

 

Beautiful Soup

#Step 6.Beautiful Soup 로 본문 내용만 추출하기
from bs4 import BeautifulSoup
html_1 = driver.page_source #현재 페이지의 전체 소스코드를 다 가져오기
soup_1 = BeautifulSoup(html_1, 'html.parser')

content_1 = soup_1.find('div','chart-list__wrapper').find_all('span','chart-element__information') # 10개의 li태그
for i in content_1 :
    print(i.get_text().replace("\n"," ").strip()) #stripe 좌우공백없애기
    print("\n")

이것도 출력 결과가 깨끗하지 못함

 

그래서 스터디에서 나온 해결방안

#Step 1. 필요한 모듈을 로딩합니다
from selenium import webdriver
import time          

#Step 2. 사용자에게 검색 관련 정보들을 입력 받습니다.
print("=" *100)
print(" 이 크롤러는 Billboard Hot100 차트 수집용 웹크롤러입니다.")
print("=" *100)
print("\n")

chrome_path = "c:/temp/chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

url = 'https://www.billboard.com/charts/hot-100'
driver.get(url)
time.sleep(2)

#Step 6.Beautiful Soup 로 본문 내용만 추출하기
from bs4 import BeautifulSoup
html_1 = driver.page_source #현재 페이지의 전체 소스코드를 다 가져오기
soup_1 = BeautifulSoup(html_1, 'html.parser') #pharsing을 시킴

content_1 = soup_1.find('div','chart-list__wrapper').find_all('button','chart-element__wrapper display--flex flex--grow sort--this-week')
for i in content_1 :
    grade = i.find('span','chart-element__rank__number').get_text()
    songName = i.find('span','chart-element__information__song text--truncate color--primary').get_text()
    artist = i.find('span','chart-element__information__artist text--truncate color--secondary').get_text()
    print(f'{grade}. {artist} - {songName}')

'데이터 청년 캠퍼스(경남대학교) > 스터디' 카테고리의 다른 글

2021-07-14  (0) 2021.07.14
2021-07-13  (0) 2021.07.14
2021 - 07 - 07  (0) 2021.07.07
2021-07-06  (0) 2021.07.06
2021-07-05  (0) 2021.07.05