본문 바로가기
웹크롤링 with Python

[웹크롤링 with Python] 동적크롤링 / 네이버뉴스 썸네일 다운로드

by CodeCrafter 2024. 6. 13.
반응형

 

이번에는 간단한 동적 웹크롤링을 알아보도록 하겠습니다.

 

동적 웹크롤링을 하는 대상은 네이버 뉴스 기사의 썸네일(Thumbnail) 입니다.

 

 

먼저, 동적 크롤링을 위해 selenium내 필요한 라이브러리들을 불러와주고 크롬 드라이버를 활용해 naver의 주소에 들어가게 해줍니다.

from selenium import webdriver #셀레니움 웹드라이버 제어 모듈
from selenium.webdriver.common.by import By  #HTML 인덱싱을 위한 클래스
import time #시간 지연을 위한 모듈

#크롬 드라이버 실행
driver = webdriver.Chrome()

#크롬 드라이버에 url 입력 및 페이지 이동
driver.get('https://news.naver.com/')
time.sleep(2)

 

이후 돋보기 버튼을 인덱싱 하고 이를 클릭해줍니다.

#돋보기 버튼 인덱싱
btn_search = driver.find_element(By.CLASS_NAME, 'Ntool_button._search_content_toggle_btn')

#인덱싱한 요소 클릭
btn_search.click()

 

돋보기 버튼의 인덱스를 확인하기 위해서는  돋보기 모양에 마우스 오른쪽 버튼을 대고 "검사" 버튼을 눌러줍니다.

 

이렇게 하면 아래와 같이 해당 부분의 html을 확인할 수 있고 이를 복사해서 활용해주면 됩니다.

 

 

 

이제 돋보기 버튼이 클릭되었으니, 검색어 입력창을 위와 동일하게 검사 버튼을 눌러 path를 확인해서 아래와 같이 붙여넣기 해주고, 검색어 입력도 진행해줍니다. 

box를 찾는 것은 driver.find_elements를 활용하고

검색어 입력은 box_search.send_keys를 활용해줍니다.

#검색어 입력창 인덱싱
box_search = driver.find_element(By.CSS_SELECTOR, 'input.u_it._search_input')

#검색어 입력
box_search.send_keys('파이썬')

 

이후 엔터키를 입력해줍니다.

from selenium.webdriver.common.keys import Keys

# 엔터키 입력
box_search.send_keys(Keys.ENTER)    

 

이렇게 하게되면 구글의 탭이 2개가 되는데 이 중 두번째 탭을 선택해줍니다.

tab_1st = driver.window_handles[0]
tab_2nd = driver.window_handles[1]

print("현재 탭 (switch 전): ", driver.current_window_handle)

# 두번째 탭으로 창 변경
driver.switch_to.window(tab_2nd)

print("현재 탭 (switch 후): ", driver.current_window_handle)

 

 

다음은 해당 화면에서 뉴스 제목을 추출해줍니다.

 

# 뉴스 제목 추출
news_titles = driver.find_elements(By.CLASS_NAME, 'a.news_tit')

for i in news_titles:
    title = i.text
    print(title)

 

이후 해당 뉴스의 썸네일(그림)에 대한 하이퍼링크를 추출해줍니다.

# 뉴스 하이퍼링크 추출

for i in news_titles:
    href = i.get_attribute('href')
    print(href)

 

이후 스크롤 내리기 및 썸네일 이미지 다운로드를 반복실행해주면됩니다.

그리고 저장할 폴더를 지정해주면 다음과 같이 썸네일들이 크롤링 된 것을 확인할 수 있습니다.

# 스크롤 내리기 (모든 썸네일 이미지 로딩을 위함)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

#뉴스 썸네일 이미지 다운로드
news_content_div = driver.find_elements(By.CLASS_NAME, 'news_contents')

news_thumbnail = []

for i in news_content_div:
    try:
        thumbnail = i.find_element(By.CLASS_NAME, "thumb")
        news_thumbnail.append(thumbnail)
    except:
        pass

link_thumbnail = [img.get_attribute('src') for img in news_thumbnail]


# 이미지 저장할 폴더 생성
import os

# path_folder의 경로는 각자 저장할 폴더의 경로를 적어줄 것
path_folder = r'/Users/wwsmb/Desktop/test'

# 디렉토리가 존재하지 않으면 생성
if not os.path.isdir(path_folder):
    os.makedirs(path_folder)

# 이미지 다운로드
from urllib.request import urlretrieve

i = 0
for link in link_thumbnail:
    i += 1
    file_path = os.path.join(path_folder, f'image_{i}.jpg')
    urlretrieve(link, file_path)
    time.sleep(0.3)

print(f"{i}개의 이미지가 다운로드 되었습니다.")

반응형

댓글