파이썬으로 웹 뉴스 받아보기 (1)

개발은뒷전인·2022년 6월 5일
0
post-thumbnail

[시작하기]
매일매일 뉴스를 찾아보기 힘들어 누가 나 대신 찾아주고 읽어줬으면 좋겠다는 생각이 들었다...
거기에서 착안한 웹 크롤링을 통해 자동 뉴스 알리미를 만들어 보려고 한다.
역시 세상은 귀찮음을 통해 발전하는 것 같다.

0. 환경 설정

0-1. Python 설치

우선 기본적으로 사용할 언어인 python을 설치해보도록 한다.
하지만 본 포스팅은 이미 설치되어 있음을 가정하여 작성했으므로, 설치는 기회가 되면 이 글을 수정하여 넣도록 해 보겠다........

0-2. 필요한 Package 설치

해당 기능을 수행하기 위해서 필요한 패키지를 설치해보도록 한다. 우선 뉴스를 가져오기 위해 꼭 필요한 크롤러, selenium을 다운로드 한다.

pip3 install selenium

이 다음에는 수집한 데이터를 슬랙봇을 통해 보내기 위해 request를 설치한다.

pip3 install request

마지막으로 이건 사실 필요는 없지만, 자동 실행 시 깔끔하게 실행 시키기 위함 또는 배포를 위하여 빌드할 수 있는 pyinstaller를 설치한다.

pip3 install pyinstaller

이를 마지막으로 개발 준비는 모두 끝이 났다.

0-3. 필요한 프로그램 설치

어찌되었든, 웹 상에 떠돌고 있는 뉴스를 가져오는 것이기 때문에 브라우저를 조작할 수 있는 드라이버가 꼭 필요하다. 가장 대중적으로 사용하기도하고, 손쉽게 접근할 수 있는 크롬을 사용하기 위해 크롬드라이버를 다운로드 해준다.
(크롬 버전이 바뀔 때 마다 새롭게 다운로드 해주어야 하므로, 추후 자동 업데이트 기능을 만들어 보자.)

https://chromedriver.chromium.org/downloads

이제 정말 끝!
(혹시나 하지만, 현재 사용중인 크롬의 버전과 맞는 크롬 드라이버를 다운받기 바란다!)

1. 구조 설계 및 기능 구현

1-1. 구조 설계

이 프로젝트를 통해 만들게 되는 프로그램의 구조는 아래와 같다.

뉴스 사이트 접속 - 기사 제목 및 url 가져오기 - 수집한 정보를 보내기

거창하게 구조라고 떠들었지만, 사실 아주 간단한 프로그램이다. 접속해서 긁고 보내주기. 끝!

1-2. 기능 구현

1-2-1. 뉴스 사이트 접속하기

본격적으로 사이트를 접속해보자. 원하는 사이트의 URL을 준비하고, 아래 코드처럼 사용해본다.

from selenium import webdriver
from selenium.webdriver.common.by import By

url = "https://www.naver.com/"
driver.get(url)

이렇게만 작성하고 코드를 실행시켜보면 즉시 크롬 창이 url로 접속하여 창을 띄워준다.

1-2-2. 기사들의 규칙성 찾기

우선 크롤링을 하기 위해서는 웹 페이지의 구성을 확인하여 요소들을 특정한 키를 통해 찾아 가져오는 작업이 필수이다. 위 작업 순서는

  1. 'F12'번을 눌러 개발자 도구를 열고
  2. 'ctrl+shift+c' 를 누른뒤
  3. 원하는 기사의 제목을 클릭해본다.

내가 원하는 기사들은 'class=li'들을 모두 공통적으로 가지고 있었고, 이 'li'들은 'class=day_article'이라는 큰 클래스에 묶여있었다. 그래서 큰 부분을 먼저 가져오고, 그 내부에서 반복을 진행하면 원하는 기사들을 가져 올 수 있을 것이라고 판단했다. 코드는 아래와 같다.

subject = driver.find_element(By.CLASS_NAME, 'day_article')
subject_lis = subject.find_elements(By.TAG_NAME, 'li')

첫번째 줄의 코드를 이용해서 큰 클래스를 가져오고, 그 클래스 내부에서 새로운 요소를 찾는 것이었다. 이 때 주의할 점은 'element''elements' 의 차이이고 두 번째 줄에서 's'를 붙이지 않으면 오류가 나거나 제일 첫 번째 요소만 찾아질 수 있으니 주의하자!

1-2-3. 반복해서 데이터 찾기

이제 'subject_lis'라는 리스트 안에 'li' 라는 이름을 가진 요소들을 모두 저장해두었다. 이제 우리가 해야할 부분은 각 요소에서 우리가 원하는 기사의 제목과 기사의 url 2가지를 뽑아내는 것이며 이를 모든 기사에 적용해야 한다. 그리고 기사의 제목은 'a' 태그의 text에 있고 URL은 'a' 태그의 'href' 라는 요소 내부에 있다. 하여, 반복문을 이용해 news_list 라는 리스트에 모두 저장해보도록 하겠다. 아래 코드를 참조하기 바란다.

news_list = []
for li in subject_lis:
    aTag = li.find_element(By.TAG_NAME,'a')
    href = aTag.get_attribute('href')
    news_list.append(aTag.text)
    news_list.append(href)

append 메서드를 이용하기 위해 리스트 선언을 첫줄에 미리 해둔다. 위 코드 까지 작성한 후 코드를 실행시키면 성공적으로 news_list 안에 제목과 url을 모두 담아 둘 것이다.

1-2-4. 데이터를 post하기

이까지 오게 되면 대부분의 작업이 끝났다고 봐도 무방하다. 사실상 마지막으로 남은 것은 우리가 수집한 데이터를 어딘가로 보내주는 것 뿐이다. 'request'라는 모듈은 http로 데이터를 보내주는 모듈이다. 아래 코드는 'slack'이라는 어플리케이션으로 보내는 예시이며 상세한 것은 아래에 추가적으로 설명할 것이다. 중요한것은. 'post'라는 메서드로 news_list를 보내버리는 것이다!

response = requests.post("https://slack.com/api/chat.postMessage",
        headers={"Authorization": "Bearer "+token},
        data={"channel": channel,"text": news_list}
    )

이렇게 하면 내가 원하는 기사를 내가 원하는 곳으로 보내는 것 까지 모두 끝이 났다.

[마무리]
이렇게 해서 뉴스를 모아서 보내주는 어플리케이션을 만들어 보았다. 글을 쓰다보니 너무 길어지기도 하고 해서 시리즈로 변경하도록 한다,,, 절대 한번에 쓰기가 귀찮아서가 아니다 ㅎㅎㅎㅎㅎㅎ
아무튼
1. 슬랙 봇을 만들고 이를 이용하여 원하는 메세지를 내 슬랙에 보내주기
2. 매일 정해진 시간에 프로그램을 실행하거나 특정 이벤트에 맞추어 프로그램 실행하기
3. 크롬 드라이버를 자동으로 업데이트하는 프로그램 만들기
는 최대한 빠르게 업데이트해보도록 하겠다!

profile
먹고살만큼개발하기를꿈꾸고있습니다

0개의 댓글