본문 바로가기
Python/Crawling

[Crawling]_뉴스 타이틀만 가져올 수 있을까?

by ssolLEE 2023. 8. 6.
반응형

라이브러리 가져오기 / html 가져오기

  • ch02.py 파일을 만든 후 다음을 입력하여 라이브러리를 가져옵니다.
import requests
from bs4 import BeautifulSoup
  • requests는 사람 편의를 생각하여 http요청을 하는 라이브러리입니다. 
  • 우선 naver.com으로 해보겠습니다. 먼저 상태코드를 확인합니다. 
url1= "https://www.naver.com"

# 요청 url 변수에 담긴 url의 html 문서를 출력한다.
req = requests.get(url1)
print(req.status_code)
  • '상태코드 200' 은 서버가 요청을 제대로 처리했다는 의미입니다. 그럼 계속 이어서 하겠습니다. 
  • 다음 코드는 웹 페이지의 html을 모두 불러오는 것입니다. 이는 우리가 웹 페이지에서 마우스 우클릭-페이지 소스코드 보기에서 확인할 수 있는 내용입니다. 
print(req.text)

 

뉴스 타이틀 가져오기

 

네이버 뉴스

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

news.naver.com

  • 이 사이트의 뉴스 타이틀을 가져와보겠습니다. 

  • 먼저 referer와 user-agent를 설정합니다. 이것은 [웹 페이지 마우스 우클릭- 검사 -네트워크- 파일 클릭 -requests headers 아래]에서 확인할 수 있습니다. referer는 해당 사이트 오기 직전의 사이트, user-agent는 브라우저 종류를 의미합니다.

def main():

    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 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)
    # print(req.status_code)
    # print(req.text)

if __name__ == "__main__":
    main()
  • BeautifulSoup 객체를 초기화 합니다.
soup = BeautifulSoup(req.text, "html.parser")
print(soup)
  • 정상적으로 soup이 출력이 된다면 새로운 함수를 써서 제목을 불러오도록 합니다.
  • 제목은 <div class="list_body>아래에 있습니다.

def crawler(soup): # 아래 soup 출력하면 지저분하니까 정리
    # print(soup) 여기까진 잘 되는군. 주석처리 고
    div = soup.find("div", class_="list_body")
    print(div)

    result = []
    return result
    
def main():

# 요청 url 변수에 담긴 url의 html 문서를 출력한다. 
    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)
    # print(req.status_code)
    soup = BeautifulSoup(req.text, "html.parser")
    result = crawler(soup)
    print(result)
  • 위처럼 입력하면 해당 <div> 안쪽 html이 모두 출력됩니다.

  • 아래와 같이 result에 대한 코드를 입력하고 출력을 확인합니다. 
def crawler(soup): 
    div = soup.find("div", class_="list_body")

    result = []
    for a in div.find_all("a"): # find_all의 변환값 형태는 리스트다. 그래서 반복문 가능
        print(a.get_text())

    return result
  • 출력물을 list에 넣으면 다음과 같습니다.
def crawler(soup):
    div = soup.find("div", class_="list_body")

    result = []
    for a in div.find_all("a"): # find_all의 변환값 형태는 리스트다. 그래서 반복문 가능
        result.append(a.get_text())
    return result

def main():

# 요청 url 변수에 담긴 url의 html 문서를 출력한다. 
    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)
    # print(req.status_code)
    soup = BeautifulSoup(req.text, "html.parser")
    result = crawler(soup)
    print(result)

if __name__ == "__main__":
    main()

 

지금까지 수고 많으셨습니다.

크롤링에 대해 조금씩 가까워지고 있나요? 

다음 포스팅에서도 연습해보며 친해져보아요! 

감사합니다!