DevSSOM

파이썬 크롤링 - 간단한 실습 : 네이버 헤드 뉴스 찾기 본문

Python/크롤링

파이썬 크롤링 - 간단한 실습 : 네이버 헤드 뉴스 찾기

데브쏨 2021. 6. 21. 14:11
반응형

네이버 헤드 뉴스 찾기

이번 실습에서는 네이버 홈페이지에서 표시되는 헤드라인 뉴스를 전부 크롤링하여 출력해보고자 함. 해야할 것에 맞춰 올바른 코드 작성하기.

 

위 사진의 빨간 상자 부분이 헤드 뉴스. 출력 예시는 아래처럼.

[헤드뉴스1, 헤드뉴스2, 헤드뉴스3, ———]

 

해야할 것

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

  • list.append() : 리스트의 맨 뒤에 요소를 추가하는 파이썬 메소드입니다.
  • soup.find() : BeautifulSoup 객체에서 특정 태그를 찾기 위해 사용합니다.
  • soup.find_all() : BeautifulSoup 객체에서 특정 태그 여러 개를 찾아 리스트 자료형으로 얻습니다.
import requests
from bs4 import BeautifulSoup


def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환해보기
    result = []
    
    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 = "http://www.naver.com"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

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


if __name__ == "__main__" :
    main()

 

 

>>>

 

구글 개발자도구로 들어가서 연합뉴스 부분을 클릭하면 해당 HTML 소스로 가잖아. 거기서 저 뉴스 제목이 뜨는 곳을 보면, 회색 줄 부분이 해당됨. 저 부분을 크롤링 해보면,

 

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    result = []
    
    div = soup.find("div", class_ = "list_issue")
    print(div)
    
    return result

div 태그 안에 있는 내용들이 출력이 되고 있어. 자세히 보면, a 태그에 각각의 뉴스 기사로 향하는 링크가 담겨있는데, 링크와 함께 뉴스의 제목이 나와. 그래서 이번엔 이 div의 모든 a 태그를 출력해보면

 

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

각각의 a태그가 리스트로 들어있는걸 볼 수 있음. 여기서 리스트에 들어있는 애들을 한 줄 한 줄 꺼내주고, 뉴스 제목들 텍스트만 출력하려면

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    result = []
    
    div = soup.find("div", class_ = "list_issue")
    
    for a in div.find_all("a") :    # 각각의 줄에 a 태그가 출력이 되고
    	print(a.get_text())
    
    return result

 

이걸 또 result라는 변수에 담아서 반환해주려면

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    result = []
    
    div = soup.find("div", class_ = "list_issue")

    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", class_ = "list_issue")

    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 = "http://www.naver.com"
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")

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


if __name__ == "__main__" :
    main()

 

 

728x90
반응형
댓글