새소식

반응형
Toy Project/Crawler

[Crawler] 파이썬 웹 크롤링 실습(기본편) 4 - 네이버 뉴스 가져오기

  • -
반응형

파이썬 로고 이미지입니다.
Python

웹 크롤링 실습(기본 편) 4 - 네이버 뉴스 가져오기


이번 실습으로는 네이버에서 구글의 주식인 알파벳 A주에 대한 뉴스 정보를 크롤링해 보는 시간을 가져보자. 크롤링을 하기에 앞서 이번 시간에 필요한 라이브러리는 requests와 BeautifulSoup이기 때문에 설치가 되어있지 않은 분들은 아래와 같은 명령어로 필요한 라이브러리를 먼저 설치하자. 

pip install requests
pip install beautifulsoup4

 

 

네이버에서 알파벳 A주에 대해 검색하고 뉴스 탭을 클릭 후 나오는 화면에 대한 이미지입니다.
네이버에서 "알파벳 A주" 검색

 

먼저 네이버에 접속해 검색 키워드로 "알파벳 A주"를 입력 후, "뉴스" 탭을 클릭하면 위와 같은 화면이 나올 것이다. 이제 크롤링을 하기 위해선 2가지의 정보가 필요하다.

 

먼저 해당 화면에서 F12를 눌러 개발자 도구를 켠 후, 아래 빨간색 네모로 표시된 부분을 클릭하자.

크롬 웹 브라우저에서 F12를 눌러 개발자 도구를 열었을 때 화면 이미지입니다.
개발자 도구


해당 부분을 클릭하면 화면에서 본인이 원하는 영역의 정보를 마우스를 가져다 댄 후 클릭하면 알 수 있다.

 

크롬 브라우저에서 개발자 도구를 이용해 원하는 정보를 찾는 화면에 대한 이미지입니다.
찾고자 하는 영역

 

그럼 위와 같이 원하는 요소에 대한 정보를 살펴볼 수 있다. 

 

개발자 도구 화면에 대한 이미지입니다.
자세히 보기

 

자세히 살펴보면 뉴스의 제목은 <a> 태그로 이 루져 있다. 제목은 <a> 태그 안에 있는 텍스트라는 것을 확인할 수 있고 href는 해당 뉴스에 접근할 수 있는 링크를 의미한다.

 

여기까지 살펴보았을 때 크롤링을 하기 위한 2가지의 정보를 모두 수집할 수 있었다. 이제 크롤링을 수집해야 할 때 원하는 태그를 선택하는 방법에 대해 고민해봐야 한다.

 

해당 화면에서 <a> 태그는 뉴스의 제목뿐만 아니라 다른 용도로도 무수히 많이 있을 것이다. 그래서 뉴스 제목만을 위한 <a> 태그들을 식별해야 한다. 다양한 방법들이 있겠지만 필자는 class를 이용해서 식별하는 방법으로 한 번 해보겠다.

 

원하는 요소의 클래스 속성을 확인하는 이미지입니다.
class 속성 찾기

 

뉴스 제목으로 사용되는 <a> 태그는 "news_tit"이라는 클래스를 가지고 있다는 것을 위의 이미지에서 확인할 수 있다.

 

그럼 필요한 정보를 모두 얻었으니 해당 정보를 토대로 크롤링하는 코드를 직접 구현해 보자.

import requests
from bs4 import BeautifulSoup

# 크롤링 하려는 사이트 주소
response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%95%8C%ED%8C%8C%EB%B2%B3+a%EC%A3%BC")

# response.text는 해당 페이지의 전체 html 코드를 가져오는 의미이다.
html = response.text

# 따라서 BeautifulSoup를 이용해 해당 text에서 원하는 정보만 가져와야 한다.
soup = BeautifulSoup(html, "html.parser")

# 파라미터로 아까 찾았던 클래스 "news_tit"를 넣어준다.
# 반환값의 형태는 리스트이다.
links = soup.select(".news_tit")  
print(type(links)) # 결과 : <class 'bs4.element.ResultSet'>
print('------------------')
for link in links:
    print(f'type(link) : {type(link)}') # 결과 : <class 'bs4.element.Tag'>
    title = link.text # 각 링크의 텍스트만 가져온다.
    url = link.attrs['href'] # 각 링크의 href 속성 정보만 가져온다.
    print(f'Titile : {title}')
    print(f'URL : {url}')
    print('------------------')

BeautifulSoup(html, "html.parser")는 BeautifulSoup 라이브러리를 사용하여 HTML 문서를 파싱 하는 데 사용되는 코드이다. 

  • BeautifulSoup - HTML 및 XML 문서를 파싱하고, 검색하고, 수정하는 데 사용되는 파싱 라이브러리이다. 즉, 웹 스크레이핑 및 데이터 추출을 위해 HTML 문서를 처리하는 데 유용하다.
  • html - 첫 번째 파라미터로 파싱하려는 HTML 문서의 문자열이 들어간다. 이는 웹 페이지에서 가져온 HTML 코드일 수 있다.
  • "html.parser" - 두 번째 파라미터로 어떤 파서를 사용할지를 지정한다. HTML 문서를 파싱 하기 위해 "html.parser" 파서를 사용하고 있다. 파서는 HTML 문서의 구조를 이해하고 태그, 속성 등을 추출하는 역할을 한다. "html.parser"는 Python 표준 라이브러리인 "html.parser"를 사용하는 것을 의미한다.
<class 'bs4.element.ResultSet'>
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 알파벳, 클라우드 사상 첫 흑자…700억 달러 자사주 매입
URL : http://www.g-enews.com/ko-kr/news/article/news_all/202304260124502999be84d87674_1/article.html
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 美자산운용 "알파벳, 장기적으로 15% 상승 여력"
URL : http://news.einfomax.co.kr/news/articleView.html?idxno=4244079
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : "알파벳·MS, 어닝쇼크 없었다"...시간외 거래서 급등
URL : http://www.fnnews.com/news/202207270746096794
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : [뉴욕 e종목] 알파벳 매출 32% 급증 깜짝 실적...20대1 액면분할
URL : http://www.g-enews.com/ko-kr/news/article/news_all/202202020610036927be84d87674_1/article.html
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 알파벳, 4Q 어닝 서프라이즈…20대 1 액면분할 추진
URL : http://www.newsis.com/view/?id=NISX20220202_0001743950&cID=10101&pID=10100
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 월가, 알파벳 목표주가 대거 상향
URL : http://news.einfomax.co.kr/news/articleView.html?idxno=4196637
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 테슬라·알파벳 주가 '지붕뚫고 하이킥'...로빈후드는 공모가 밑으로 추락
URL : http://www.g-enews.com/ko-kr/news/article/news_all/202110280040459103be84d87674_1/article.html
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 알파벳이 배당주가 될 수 있을까?
URL : https://ppss.kr/archives/229517
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 알파벳, 1분기 순익·매출 예상치 상회…주가 4%↑(상보)
URL : http://news.einfomax.co.kr/news/articleView.html?idxno=4144719
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 알파벳, 3분기실적 시장예상 상회…주가 시간외서 8% 상승
URL : http://news.einfomax.co.kr/news/articleView.html?idxno=4114820
------------------

실행 결과

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.