티스토리 뷰

반응형

※이 글은 자기개발 및 복습을 위한 글로, 야후 뉴스 크롤링에 대한 파이썬 코딩을 만드는 방법을 작성하는 글임을 밝힌다.

주식을 하다 보면, Telegram이나 카카오 오픈채팅 등의 소스에서 뉴스를 접하는 경우가 많은데, 남이 떠먹여 주기만 해서는 내가 시사에 관심을 가질 수 없음을 깨닫는다. 그래서 직접 Yahoo News의 자료들을 크롤링하여, 해당 내용들 중 중요한 내용들을 요약하여 내 텔레그램 Bot에 요약 자료까지 발송하는 일련의 가정을 작성하고자 한다.
 
방법은 총 3가지로 진행될 예정이다.
 
1. 뉴스 자료 크롤링
2. 내용 요약(영문 -> 한글로 변환)
3. 텔레그램 Bot에 요약자료 발송
 
우선 뉴스 자료를 크롤링하기 위해서는 2가지 package가 필요하다. 
첫 번째는 Beautifulsoup4, 두 번째는 Requests이다.
두 가지를 설치하기 위해서는
 
Anaconda Prompt를 실행하여

Requests와 Beautifulsoup4를 설치하면 된다.
 
우선 크롬을 이용하여 Yahoo Finance News의 구조를 확인해 보자. 나는 최신 뉴스만 크롤링할 예정이라, Latest-news 탭을 이용해 크롤링할 것이다.
https://finance.yahoo.com/topic/latest-news/

Yahoo Finance - Stock Market Live, Quotes, Business & Finance News

At Yahoo Finance, you get free stock quotes, up-to-date news, portfolio management resources, international market data, social interaction and mortgage rates that help you manage your financial life.

finance.yahoo.com

홈페이지 상에서 내가 원하는 데이터가 어떤 구조를 가지는지 확인해 보려면, 

원하는 데이터에서 마우스 오른쪽을 누른 다음 "검사"를 누르면 된다.
 

그럼 개발자툴이 오픈되면서, 내가 누른 class가 어떤 경로에 있는지 확인할 수 있다.
Yahoo News 상에서 내가 원하는 것은 최신 뉴스 20개의 링크라고 가정을 하고, 클래스를 뜯어보면 
 

<a class> 경로에 href(hypertext reference)에 주소가 있음을 찾을 수 있다.
그리고 그 href까지의 전체 경로는 원하는 HTML에서 오른쪽 클릭 - Copy - Copy selector를 클릭하면 전체 경로가 나온다.
예시 경로 : #nimbus-app > section > section > section > article > section.container.yf-1ce4p3e > div > div > div > ul > li:nth-child(1) > section > a
 

그 밑의 주소도 같이 검사를 해보면, 규칙이 보임을 알 수 있다.
 

예시 경로 2 : #nimbus-app > section > section > section > article > section.container.yf-1ce4p3e > div > div > div > ul > li:nth-child(2) > section > div > a
우리는  li:nth-child(1) , li:nth-child(2) 이런 순서대로 경로를 유추할 수 있다.
nth-child가 증가하는 것을 보면, li을 기준으로 자식 요소가 증가하는 것임을 알 수 있다.
 
 
그렇다면, 해당 li class 경로에서 뉴스 기사 순서가 결정남을 알 수 있으므로, 해당 클래스 왼쪽의 ▼을 클릭해 접어보다 보면,

위와 같이 규칙성을 볼 수 있다.
다만, ad라고 붙은 것을 찾아볼 수 있는데, 이는 광고 자료이므로 유념하고 있어야 한다.
 
자 이제 코딩을 해보도록 하자!
 
★ 전체코드

def get_href():
    url = "https://finance.yahoo.com/topic/latest-news/"
    results = []   
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.select("#nimbus-app > section > section > section > article > section.container.yf-1ce4p3e > div > div > div > ul > li")
    

    for i, item in enumerate(items[:20]):
        if 'ad-item' in item.get('class', []):
            results.append("ad")
        else:
            link_tag = item.find('a', href=True)
            if link_tag:
                results.append(link_tag['href'])

    results = [item for item in results if item != 'ad']
    return results

1. 함수 정의 및 URL 설정

def get_href():
    url = "https://finance.yahoo.com/topic/latest-news/"

여기서 get_href(url) 함수는 Yahoo Finance 최신 뉴스 페이지에서 뉴스 기사 링크를 가져오는 역할을 한다.
앞에서 언급한 대로 url을 https://finance.yahoo.com/topic/latest-news/로 설정했지만, 본인의 필요에 따라 달리 설정해도 된다.
 

2. 리스트 초기화 & 웹 페이지 요청

    results = []   
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

results = [ ] : 크롤링한 링크들을 저장할 리스트를 생성
requests.get(url) : 해당 웹페이지에 요청
BeautifulSoup(response.text, 'html.parser') : 받아온 HTML을 BeautifulSoup으로 파싱

 

3. 뉴스 목록 찾기

items = soup.select("#nimbus-app > section > section > section > article > section.container.yf-1ce4p3e > div > div > div > ul > li")

여기서 soup.select()를 이용해서 뉴스 기사가 들어 있는 li 태그들을 가져온다.

앞에서 설명했듯,
ul > li:nth-child(1)
ul > li:nth-child(2), ... 이런 식으로 뉴스 기사들이 리스트(li) 형태로 저장되어 있기 때문에,
 ul > li를 전부 가져오고, 그 안에서 필요한 것만 걸러낸다.

 

4. 뉴스 링크 추출

    for i, item in enumerate(items[:20]):
        if 'ad-item' in item.get('class', []):
            results.append("ad")
        else:
            link_tag = item.find('a', href=True)
            if link_tag:
                results.append(link_tag['href'])

필요한 뉴스의 수량은 20개이기 때문에, 20개만 가져오고, ad의 경우에는 "ad"라는 값을 results에 반환해 준다.
 
그다음 ad를 제외한 뉴스들을 results에 반환한다.
 

5. 결과 반환

    results = [item for item in results if item != 'ad']
    return results

 
우리가 필요한 것은 광고가 아닌 기사들의 링크이므로, 광고인 경우 제거해 주고 결괏값을 반환한다.
 

해당 쿼리를 실행하면, 우리는 광고 없이 뉴스 주소들을 반환받을 수 있다.
 
다음 글은 해당 뉴스 주소들을 가지고 뉴스 제목/내용을 뽑는 작업을 할 예정이다.
 

반응형

'자기개발 > 취미코딩' 카테고리의 다른 글

[파이썬/기초]32bit 가상환경 만들기  (0) 2025.02.09
[파이썬/기초]Anaconda 설치  (46) 2024.08.21
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함