본문 바로가기
코드리뷰/chatGPT(Python)코드

웹 크롤링 기초 - 셀레니움으로네이버 기사 제목 가져오기

by 디마드 2024. 3. 23.

지난 포스팅에 requests를 이용해 네이버 기사를 크롤링했었다. 

2024.03.22 - [코드리뷰/chatGPT(Python)코드] - 웹 크롤링 기초 - 네이버 기사 제목 가져오기

 

웹 크롤링 기초 - 네이버 기사 제목 가져오기

웹 크롤링을 이용해 간단하게 네이버 기사 제목을 뽑아보자. 웹 데이터 추출을 위해 select_one/select/find/find_all 메소드를 이용한다. 기초지만 크로링에서 가장 중요한 기능을 담당한다고해도 과언

iamgus.tistory.com

requests는 빠르다는 장점은 있지만 동적인 데이터를 가져오는데 한계가 있다. 셀레니움을 이용하면 이런 문제가 해결된다. 수많은 기능이 내장되어 있어서 일일이 다 기술할 수는 없지만, 동적 페이지 구현 부분을 해보도록 하자. 

1. 셀레니움 관련 By, Keys를 import 한다. 스크롤 다운과 같은 효과를 내기 위함이다. 페이지가 내려가면 자바스크립트가 동적으로 작동해 다음 데이터를 불러온다. 

from seleniuhttp://m.webdriver.common.by import By
from seleniuhttp://m.webdriver.common.keys import Keys

...

2. 페이지 다운 효과를 내고 변경된 소스를 받아온다. 이때 중요한 것은 적절한 지연 시간을 주는 것이다. 처음 웹 페이지 불러올 때 1초, 스코롤 다운 시 2초를 줬다. 총 3번 스코롤 다운한다. 

driver.get(url)
time.sleep(1)

for i in range(3):
    driver.find_element(By.TAG_NAME, "body").send_keys(Keys.END)
    time.sleep(2)

html = driver.page_source

 

3. 데이터를 출력한다. request 결과물 출력하는 것과 동일하다. 

for rank, news in enumerate(news_wrap, 1):
    info_press = news.select_one(".info.press")
    news_tit = news.select_one(".news_tit")

    print(f"<<<{rank}위>>>")
    print(info_press.text)
    print(news_tit.text)
    print(news_tit["href"])
    print()

 

[전체 소스]

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time

keyword = input("KEYWORD : ")
url  = f"https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query={keyword}"

options = Options()
options.add_argument("--start-maximized")
options.add_argument("User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")
options.add_experimental_option("detach",True)
options.add_experimental_option("excludeSwitches",["enable-logging","enable-automation"])

driver = webdriver.Chrome(options=options)
driver.get(url)
time.sleep(1)

for i in range(3):
    driver.find_element(By.TAG_NAME, "body").send_keys(Keys.END)
    time.sleep(2)

html = driver.page_source

soup = BeautifulSoup(html, 'html.parser')

news_wrap = soup.select(".news_wrap.api_ani_send")

for rank, news in enumerate(news_wrap,1):
    info_press = news.select_one(".info.press")        
    news_tit = news.select_one(".news_tit")
    
    print(f"<<< {rank}위 >>>")
    print(info_press.text)
    print(news_tit.text)
    print(news_tit["href"])
    print(news_tit["class"])
    
# time.sleep(3)
# driver.close()

[output]

반응형

댓글