DevSSOM

파이썬 크롤링 - 간단한 실습 : 네이버 뉴스 헤드라인 추출 본문

Python/크롤링

파이썬 크롤링 - 간단한 실습 : 네이버 뉴스 헤드라인 추출

데브쏨 2021. 6. 22. 17:42
반응형

연합뉴스 속보 기사 제목 추출하기

네이버 뉴스 연합뉴스 속보 페이지의 기사 제목을 출력해보기.

https://news.naver.com/main/list.nhn?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y

 

네이버 뉴스

다양한 기사 정보를 제공합니다.

news.naver.com

출력예시

[기사제목1, 기사제목2, 기사제목3, ———]

해야할 것

  • crawling 함수는 네이버 뉴스 페이지의 연합뉴스 기사들을 찾고, 그것들의 제목을 담고 있는 리스트를 반환해야 함.
  • 주어진 코드는 main 함수와 crawling 함수가 있습니다. main 함수에서는 crawling 함수의 결과값을 출력.
  • main 함수를 직접 수정하실 필요는 없음.
  • crawling 함수를 올바르게 구현해봐.
import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    return None
    
    


def main() :
    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    url = "https://news.naver.com/main/list.nhn?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

    # crawling 함수의 결과를 출력
    print(crawling(soup))


if __name__ == "__main__" :
    main()

 

 

>>>

 

해당 페이지에서 구글 검사를 해보면 개발자 도구에 HTML들이 표시됨. 기사 제목들을 포함하고 있는 HTML은 <div class="list_body newsflash_body"> 그래서 이 class를 가지고 find 메소드를 적용하면

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    
    div = soup.find("div", "list_body")    # div 함수를 찾돼, list_body를 찾아
    print(div)
    
    return None

근데 실행 결과를 보면 아직은 좀 복잡해. 그래서 각각의 기사 제목이 들어있는 a 태그들을 찾는 걸 한번 더 해볼게.

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환하세요.
    div = soup.find("div", "list_body")    # div 함수를 찾돼, list_body를 찾아
    
    for a in div.find_all("a") :
        print(a)
        
    return None

이 상태에서 텍스트만 추출하기 위해 .get_text() 적용.

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환하세요.
    
    div = soup.find("div", "list_body")
    
    for a in div.find_all("a"):
        print(a.get_text())
    
    return None

 

이제 결과들을 리스트에 넣어주기 위해서 result라는 리스트를 만들고, append로 결과값을 넣어줘.

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환하세요.
    result = []
    
    div = soup.find("div", "list_body")
    
    for a in div.find_all("a"):
        result.append(a.get_text())
    
    return result

그럼 끝!

 

 

최종 코드

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    result = []
    
    div = soup.find("div", "list_body")
    
    for a in div.find_all("a"):
        result.append(a.get_text())
    
    return result
    
    


def main() :
    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    url = "https://news.naver.com/main/list.nhn?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

    # crawling 함수의 결과를 출력
    print(crawling(soup))


if __name__ == "__main__" :
    main()
728x90
반응형
댓글