본문 바로가기
카테고리 없음

김대리, 네이버 뉴스 크롤링 해볼 시간이지 (2/2)

by 데이터스토리 2022. 2. 25.
반응형

"김대리. 그러니까

네이버 뉴스 제목 추출하기 위해서는

  1. 라이브러리 Import
  2. URL 생성
  3. 페이지 수집
  4. 파싱
  5. 뉴스 제목 추출

의 순서로 진행된다는 거지"

"예. 맞아요.

이제 해 볼께요. 따라서 해 주세요."

 

 

1. 라이브러리 Import
import requests
from bs4 import BeautifulSoup

여기서 "requests"는 웹페이지의 코드를 가져오는 라이브러리이고,

"BeautifulSoup"은 가져온 웹페이지 코드를 파싱하세 해 주는 라이브러리 입니다.

"BeautifulSoup"을 설치하면 bs4 라는 폴더에 생겨요. 그래서 "from bs4"를 붙여서 가지고 와요.

 

 

2. URL 생성
url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=코로나"

print(url)

<output>

https://search.naver.com/search.naver?where=news&sm=tab_pge&query=코로나&start=11

 

URL은 앞에서 설정한  URL을 그대로 적용해 보겠습니다.

 

 

3. 페이지 수집
response = requests.get(url)
print(response)

<output>

<Response [200]>

 

 

정상처라인 '200'이 출력되었습니다.

 

4. 파싱

if response.status_code == 200:   # 정상
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    print(soup)
else:
    print(response.status_code)

<output>

 

정상일 경우(코드 200)에 파싱 처리를 위한 작업을 진행하게 되어요.

 

"html = response.text" 코드는 URL 웹페이지 결과를 html 변수에 넣어주는 작업입니다.

이것은 다음 줄에 있는 파싱을 위한 형태 전환을 위한 준비작업입니다.

 

"soup = BeautifulSoup(html, 'html.parser')"가 BeautifulSoup을 이용하여 파싱을 위한 환경을 갖추는 것입니다.

"print(soup)"로 출력하면 위 그림에 보이는 코드가 나와요.

이 코드는 우리가 크롤링 하려는 네이버뉴스 페이지가 가지고 있는 코드와 같아요.

 

 

5. 뉴스제목추출

뉴스 제목 추출을 위해서는 뉴스 제목의 위치 파악을 먼저해야 되요.

그러기 위해서 브라우저의 "개발자도구"를 사용하게 되요.

크롬을 사용하시네요. 크롬의 경우는 "F12"를 누르시면 됩니다. 눌러보세요.

 

1) F12 누르면

우측에 새로운 화면이 하나 더 떠요. 그게 개발자 도구입니다.

 

 

2) 죄측에 있는 "사각형+화살표"를 클릭하세요.

    그리고 좌측의 기사제목이 포함된 블록을 찾아서 클릭해 보세요.

    그러면 죄측에 파란박스가 생기고 우측 개발자도구에 해당위치가 표시 됩니다.

 

    이것이 기사가 나오는 웹페이지의 위치를 가르키는 것이거든요.

 

 

3) 개발자 도구 해당 위치 바로 위에 있는 <ul ...>에 마우스위치하면 뉴스 블록 전체가 선택되는 것을 보실 수 있어요

   이 위치에서 마우스 우측을 클릭하세요.

   6번째인가 "복사" 메뉴가 나오고 그 옆으로  세번재에 "selector복사"가 나와요.

   이걸 클릭하세요.

   메모장에 붙여넣기 해 보면

      " #main_pack > section.sc_new.sp_nnews._prs_nws > div > div.group_news > ul"

   이렇게 나올꺼예요.

 

   이 의미가 뉴스 블록의 위치가 웹페이지에서 어디이다라고 알려 주는 주소가 됩니다.

 

 

4) 여기 위치에 해당하는 소스코드를 가져와요.
pos = "#main_pack > section.sc_new.sp_nnews._prs_nws > div > div.group_news > ul"
divs = soup.select(pos)   # pos 영역 하단 코드를 변수에 저장(리스트로 저장됨)
print(divs[0])            # 첫번째 요소를 출력

<output>

위 코드에서 soup.select는 pos 에 명시된 위치 하단의 코드를 다 가져와서 리스트 형식으로 저장하는 것을 의미합니다. 

이 중 첫번째 요소는 "div[0]"을 출력해 보면 위 그림과 같이 나와요.

 

5) 코드를 분석해 보면 

    <li class="bx" id="...>가 10번 반복되어 나오는 것을 알 수 있어요.

 

 

    이게 웹페이지에 나온 뉴스 10개와 같은 것이어요.

    첫번째 <li...>를 풀어보면 조금 아래 <a href=...> 부분에 뉴스 제목에 있는 것을 알수 있어요.

    마우스를 이 곳에 위치 시키면 좌측 기사도 같이 표시되는 게 보이거든요.

 

 

 

자 이제 제목을 찾아오려면

<li...> 10개를 담고 각각에서 <a ...>된 부분의 text 를 읽으면 되겠다는 것을 알 수 있어요.

 

 

6) 코드에 담아 보면

 

lis = divs[0].find_all("li", class_="bx")   
title = lis[0].find("a", class_="news_tit")
print(title)

<output>

 

find_all로 전체 태그 "li"인 것을 가져와서 변수 lis에 리스트로 저장합니다.

lis변수의 첫번째 내용을 출력해 보면 위 그림과 같아요.

제목이 들어있는 웹코드를 담고 있는 것이 보이죠.

 

title.text

해 보면  아래처럼 제목만 추출하죠.

 

이제 10개를 반복처리해 보면 제목을 가져오는 것을 볼 수 있겠죠.

이렇게요.

 

7) 반복하여 뉴스 제목 가져오는 코드 입니다.

 

for li in lis:
    title = li.find("a", class_="news_tit")
    print(title.text )

<output>

자, 이런 방식으로 크롤링을 하게 됩니다.

 

팀장님 어렵지 않죠"

 

 

"음,.. 그러네.

단지, 뉴스 제목이 있는 위치값을 파악하는 작업만 고민을 더 하면 되겠는데."

"맞습니다.

가장 핵심은 그 위치를 파악하고 가져오는 파싱이죠.

오늘은 여기까지 하께요.

내일은 네이버금융에 나오는 한 부분을 가져오는 작업을 해 볼께요.

수고하셨습니다."

 

"응. 김대리도 수고했어.

아메리카노 마시러 가자."

/

반응형