본문 바로가기
Programming Basics

[크롤링] 셀레늄(selenium) 활용 ; nate 검색어 1위부터 10까지 가져오기(동적화면에서의 크롤링)

by ISLA! 2023. 8. 8.

동적화면 크롤링하기

 

🧐 동적화면에서 검색어 가져오기

 

다음 네이트 메인 화면의 실시간 이슈 키워드 10개를 뽑아보자.

이 화면의 특징은 1~5위가 나타난 다음, 6~10위가 나타나는 식이다.

10개 키워드가 한번에 나타나지 않으므로 유의가 필요하다!

 

라이브러리 Import

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time

 

크롬 드라이버 매니저 시작

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

 

생각해보기

👀 5초 정도마다 바뀌는 검색어를 어떻게 가져오면 좋을까?
- 두 개의 리스트를 만들어, 시간 차를 두고 검색어가 두번 저장되게 한 다음,
- 두 리스트를 더하면(결합), 중복되는 것 없이 깔끔하게 1~10위가 출력되지 않을까?

 

코드 작성

  • 두 개의 빈 리스트를 생성한다.
  • 이제 시간차를 두고 2번 검색어를 수집하는 코드를 작성한다.
    • url (네이트 메인) 설정
    • driver.get(url)로 웹드라이버를 통해 Nate의 메인 페이즈를 연다
    • driver.find_elements(By.CSS_SELECTOR, "수집을 원하는 부분의 경로") : 순위와 키워드를 가져온다
    • for i in range(2) : 를 사용하여 두 번 반복한다.(5초 간격을 두고)
      • 가져온 순위와 키워드 리스트의 내용을 가지고 2번에 걸쳐 리스트에 내용을 추가하도록 한다.
      • 즉, i == 0 일때는 첫번째 시도로, nate_list_1st 리스트에 내용을 저장하고
      • i == 1 일때는 두번째 시도록, nate_list_2nd 리스트에 내용을 저장한다. 
      • 그런데 i 가 0에서 1이 될 때, 5초의 timesleep을 주어, 시간차로 인한 문제를 해결한다.
      • 시간차를 준 후, 페이지를 새로고침
nate_list_1st = []
nate_list_2nd = []
for i in range(2):
    URL='https://www.nate.com'
    driver.get(url=URL) 
    rank_results = driver.find_elements(By.CSS_SELECTOR,'#olLiveIssueKeyword > li > span.num_rank')
    nate_results = driver.find_elements(By.CSS_SELECTOR,'#olLiveIssueKeyword > li > a > span.txt_rank')
    
    for rank, keyword in zip(rank_results, nate_results):
        if i == 0:  #첫번째 화면
            nate_list_1st.append(f'{rank.text}_{keyword.text}')
        elif i == 1: #두번째 화면
            nate_list_2nd.append(f'{rank.text}_{keyword.text}')
            
    time.sleep(5)
    driver.refresh()   #새로고침같은 개념

 

  • 마지막으로, 수집한 두 리스트를 + (더하기 연산자) 로 통합한다.
result = nate_list_1st + nate_list_2nd

print(result)
driver.quit()

 

👍 결과 확인

728x90