본문 바로가기
프로그래밍

파이썬 크롤링(웹스크래핑) - 네이버 기사 제목 웹스크래핑

by 조크리 2020. 10. 2.
반응형

 

 

 

 

지난 이미지 스크래핑에 이어 이번에는 기사 스크래핑을 배웠다. 

이미지 웹스크래핑

파이썬 크롤링(웹 스크래핑) - 이미지 스크래핑하기, dload, selenium, bs4

 

이번에는 '주식'이라는 키워드를 네이버 뉴스에 검색한 뒤 기사 제목, 링크, 신문사를 웹스크래핑하여 엑셀에 저장하는 것

해보려한다. 

 

더불어 정리한 파일을 메일로 보내는 것! 까지 해볼 것이다!! 

 

일단 이번 글에서는 '기사 제목 웹 스크래핑' 을 해볼 것이다. 

 

 

우선 필요한 패키지가 잘 설치되어 있는지 확인해보자.

 

1) bs4

2) selenium

3) openpyxl 

4) smtplib

: 파이썬 기본 내장 패키지이므로 따로 설치할 필요 없음. 

 

1)과 2)는 이미지 웹 스크래핑을 할 때 설치했던 뷰티풀 숩과 셀레니움이고

3)은 엑셀로 저장하거나 엑셀을 열 때 필요한 패키지, 

4)는 자동으로 이메일을 보낼 때 필요한 패키지이다. 

 

 

설치가 끝났다면 본격적으로 기사 웹 스크래핑을 시작해보자. 

 

 

 

 

 

1. HTML 확인하기

먼저 네이버 뉴스에서 '주식'을 검색한 뒤 그 페이지의 HTML을 살펴보아야한다. 

where=news이고 query=주식 이라고 적혀있다. 

query에 다른 키워드를 작성하면 내가 원하는 키워드의 네이버 뉴스 검색 끝!!!

search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%A3%BC%EC%8B%9D

 

 

 

 

2. 기사 정보 스크래핑 하기 

 

기본적으로 웹스크래핑에 필요한 뷰티풀숩과 웹드라이버를 import해준다.

기초 설정은 아래 코드와 같다. 

url은 내가 아까 주식 키워드 주소를 적어준다. 

'여기에 코드 적기!' 이 부분에 코드를 적어서 원하는 부분을 가져오면 된다. 

 

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome('chromedriver')

url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=주식"

driver.get(url)
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')

#####################
# 여기에 코드 적기!
#####################

driver.quit()

 

 

먼저 제목을 스크래핑해보자.

각 기사를 선택하고, 그 안의 기사 제목을 프린트해보자. 

 

1) 맨 위 기사 제목 위에서 마우스 우클릭을 하고 검사를 누른다.

기사 제목 위에서 마우스 우클릭 - 검사 누르기

 

2) 개발자 도구가 보이는데 여기서 파란 부분 위에서 또 마우스 우클릭을 한 뒤 'copy'를 누르고 'copy selector'를 누르면 기사 제목에 해당되는 셀렉터가 복사된다. 

기사 제목이 잘 클릭된건지 확인! 

 

파이썬에 복사한 것을 붙여넣기하면 아래의 코드가 나온다. 기사마다 뭔가 규칙성을 찾기가 어렵다. 

#첫 번째 기사 
#sp_nws1 > dl > dt > a

#두 번째 기사 
#sp_nws4 > dl > dt > a

#세 번째 기사
#sp_nws9 > dl > dt > a

 

기사 제목이 속한 태그들을 쭉 살펴보니 ul이라는 목록을 나타내는 태그 안에 li로 기사들이 들어가 있는 것을 볼 수 있다. 

 

ul - li nws1,4,9, 숫자는 규칙이 없지만 ul안에 목록으로 들어있음.

 

 

그렇기 때문에 이 ul에 해당되는 부분을 카피 셀렉트해주는 것이다!!

 

 

 

ul에 해당되는 부분을 카피 셀렉트해서 붙여넣기 하면 아래의 코드처럼 나온다. 

#main_pack > div.news.mynews.section._prs_nws > ul

 

그럼 '이 ul 안에 있는 li들을 가지고 와라'라는 의미로 ul > li 를 적어준다. 

#main_pack > div.news.mynews.section._prs_nws > ul > li

 

 

 

이제 이 셀렉터를 가지고 아래처럼 코드를 적어주면 기사 li들을 출력할 수 있게 된다. 

articles = soup.select("#main_pack > div.news.mynews.section._prs_nws > ul > li")
for article in articles:
	print(article)

파이참에서 돌린 결과

 

 

하지만 기사의 모든 정보는 다 필요없고 우리는 기사 제목만 필요한 것이니! 기사 제목이 어디에 있는지 다시 보고 

a_tag라는 변수를 만들어서 article.select_one(' ') 이렇게 적어주면 될 것이다! 

 

아래 그림을 살펴보면 ul 안에 li 안에 dl 안에 dt 안에 a 태그 안에 기사 제목이 '텍스트'로  들어있다! 

 

일단 li까지는 왔으니 a_tag는 'dl > dt > a' 라는 위치를 가질 것이다.  

 

 

3) 위의 이야기를 이제 코드로 적어보자.

기사 제목을 가져온 다는 것은 a_tag안에서 text를 가져오는 것이기 때문에 .text를 붙여서 아래 코드처럼 써준다. 

#articles변수에 soup.select(기사 제목의 셀렉터를 카피해서 넣어준다!)#

articles = soup.select("#main_pack > div.news.mynews.section._prs_nws > ul > li")
for article in articles:
    a_tag = article.select_one("dl > dt > a")
    title = a_tag.text
    print(title)

파이참 실행 모습

 

휴~ 기사 제목 가져오는 것도 힘들다!!!! 어쨌든 기사 제목 가져오기 성공!!! 

이제 전체 코드를 쭉 확인해보자~!! 

 

 

※3. 기사 제목 크롤링 전체 코드 ※

 

네이버에서 '주식' 기사를 검색한 뒤 기사 제목을 크롤링하는 전체 코드는 아래와 같다!!!!

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome('chromedriver')

url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=주식"

driver.get(url)
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')

articles = soup.select('#main_pack > div.news.mynews.section._prs_nws > ul > li')

for article in articles:
    a_tag = article.select_one('dl > dt > a')

    title = a_tag.text
    print(title)

driver.quit()

 

다음 글에서는 기사의 url과 신문사 이름까지 크롤링하는 것을 정리해보려한다. 

파이썬 크롤링(웹스크래핑) - 네이버 기사 url과 신문사 크롤링

 

 

 

 

반응형