Data Engineering

[Python Crawling] 네이버 기사 크롤링하기(1) - selenium

NIMHO 2023. 2. 7. 15:19
728x90

매일 내가 원하는 기사를 크롤링해서 알려주면 좋겠다는 생각을 했다.

 

python 크롤링과 github action을 이용해서 매일 issue로 기사를 알려준다.

내가 했던 것들을 한번 포스팅에 써보려고 한다.

 

https://github.com/dhalsdl12/Naver_Article

 

GitHub - dhalsdl12/Naver_Article

Contribute to dhalsdl12/Naver_Article development by creating an account on GitHub.

github.com

모든 과정을 작업한 github 주소이고, 전체 코드는 여기서 확인할 수 있다.

 

나는 맨체스터 시티의 팬이라서, 네이버에서 '맨체스터 시티'를 검색해 크롤링하도록 했다.

관련도 순으로 최근 1일 동안 나온 기사 10개만 보여주도록 했다.

 

github action을 사용해 issue는 이렇게 나오도록 제목과 본론을 만들었다.

728x90

 

▶selenium과 beautifulsoup

크롤링하는데 selenium과 beautifulsoup를 사용하는데,

이번 크롤링에는 selenium만을 이용했다.

 

나는 크롬(chrome)을 이용해서 크롤링을 했고, 이를 위해서 chrome driver를 설치해야 한다.

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 110, please download ChromeDriver 110.0.5481.30 If you are using Chrome version 109, please download ChromeDriver 109.0.5414.74 If you are using Chrome version 108, please download ChromeDriver 108.0.5359.71

chromedriver.chromium.org

 

위 링크에 들어가서 버전에 맞게 설치해 주면 된다.

버전은 설정에서 chrome 정보에 들어가면 알 수 있다.

 

그리고 다운로드한 파일은 실행될 python 코드와 같은 폴더에 위치하게 저장해 두면 된다.

크롤링만 한다면 위와 같은 방식만 해도 충분히 가능하다.

 

하지만 github action을 사용했을 때는, 제대로 인식을 못하는 경우가 발생했고,

이는 다른 방식으로 chrome driver를 불러와야 한다.

이는 다음 포스팅에서 github action을 하면서 적어야겠다.

 

import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import datetime
from pytz import timezone
from github_setting import get_github_repo, upload_github_issue


url = 'https://search.naver.com/search.naver?where=news&query=%EB%A7%A8%EC%B2%B4%EC%8A%A4%ED%84%B0%EC%8B%9C%ED%8B%B0&sm=tab_opt&sort=0&photo=0&field=0&pd=4&ds=&de=&docid=&related=0&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so%3Ar%2Cp%3A1d&is_sug_officeid=0'
drive = webdriver.Chrome('chromedriver.exe')
drive.get(url)

위 코드를 실행하면 자동으로 크롬을 실행시켜 주고, 입력한 url 주소로 나온다.

실행된 창에서 크롤링을 진행하면 된다.

 

이때 selenium을 사용해서 진행했고, F12를 눌러 나오는 html에서 원하는 부분을 따올 수 있는 함수이다.

자세히 보면 <ul class="list_news"> 안에 기사들이 들어가 있는 것을 볼 수 있다.

그다음 <li>를 이용해 각 기사들이 묶여 있다.

 

우리는 전체의 묶음을 가지고 해도 되고, 각각 list들을 빼와서 해도 된다.

하지만, 나는 전체를 list를 가지고 와서 반복문을 통해 정보를 저장해 주었다.

 

find_elements를 이용해서 정보들을 가지고 왔다.

find_elements는 복수의 정보들, find_element는 하나의 정보를 가지고 오는 데 사용된다.

def pageCrawl():
    article_list = drive.find_elements(By.XPATH, "//ul[@class=\"list_news\"]/li")
    for article in article_list:
        try:
            news_info = article.find_element(By.XPATH, "./div/div/a[@class=\"news_tit\"]")
            news_text = article.find_element(By.XPATH, "./div/div/div[@class=\"news_dsc\"]/div/a")
            title = news_info.get_attribute('title')
            link = news_info.get_attribute('href')
            article_title.append(title)
            article_link.append(link)
            article_text.append(news_text.text)
        except:
            print("error")

 

article_list에 find_elements를 이용해 가져온 정보를 넣어줬다.

By.XPATH는 해당 경로를 지정해서 정보를 가지고 오는 것이다.

이 외에도 다양한 것들이 있는데 아래 글을 확인하면서 찾아보면 된다.

https://pythonblog.co.kr/coding/23/

 

find_element By 사용

셀레늄 By 는 소스를 보다 유연하고 유지 관리하기 쉽게 만드는 데 사용할 수 있습니다. 저도 By를 주로 사용합니다. 엘리먼트를 찾는 방법은 find element 사용하기- naver 와 동일합니

pythonblog.co.kr

 

반복문으로 기사 하나씩 가지고 와서 해당 정보를 빼오면 된다.

경로를 설정하는 것은 모든 기사를 가져오는 것과 같은 방식인데 find_element를 사용하면 된다.

 

그리고 get_attribute는 원하는 부분을 확실하게 가지고 올 수 있다.

자세한 내용은 또 다른 글에서 자세히 적어야겠다.

 

main문에서 만든 article_title, link, text에다 append로 넣어주면 된다.

크롤링을 하는 것은 생각보다 단순한 작업이었다.

그래도 원하는 부분을 바로바로 가져올 수 있기에 재미있었다.

 

네이버에서 기사를 크롤링하는 거라면, URL만 수정해 주면 바로 할 수 있을 것이다.

 

728x90