본문 바로가기
프로그래밍

파이썬 크롤링(웹스크래핑) 네이버 기사 크롤링해서 엑셀에 저장

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

 

 

지난 글에서 네이버 기사의  제목, url, 신문사 이름까지 웹스크래핑해보았다. 

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

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

 

이렇게 '주식' 키워드의 네이버 기사의 제목, url, 신문사이름까지 잘 나타났다. 

 

 

 

 

이번에는 이렇게 웹 스크래핑한 기사의 제목, url, 신문사 이름을 엑셀 파일로 저장해보려고 한다. 

 

1. openpyxl 패키지 설치하기

 

파이참 기준 file - settings - python interperter - + - openpyxl 검색 - install - okay 이 과정으로 패키지를 설치한다. 

패키지 설치 방법은 아래 글에서 확인

파이썬 패키지(라이브러리) 설치하는 방법

 

 

 

 

2. openpyxl 테스트해보기

 

패키지를 설치했다면 잘 작동하는 지 한 번 테스트해보는 것이 좋다. 

temp.py 파일을 새로 만들고 새로운 파일에 아래 코드를 써서 테스트해보는 것이다. 

from openpyxl import Workbook

wb = Workbook()
ws1 = wb.active
#sheet이름
ws1.title = "네이버 기사 스크래핑"
#행 추가 
ws1.append(["제목", "링크", "신문사"])
#행 추가 
ws1.append(['1','2','3'])

#파일이름
wb.save(filename='네이버 기사 스크래핑.xlsx')

이렇게 파이참에 적고 run을 돌려보면 엑셀 파일이 딱! 생긴것을 볼 수 있다. 

 

 

3. ※스크래핑한 기사를 엑셀에 저장하기 완성코드※ 

 

이제 이미 작성했던 파이썬코드에 엑셀에 저장하는 코드를 추가한다. 

이제 굳이 파이참에서 확인하기 보다는 엑셀에 저장하는 것이기에 for 문 안에 print가 아니라 ws1.append([title, url, comp])를 써준다.

 

전체 코드를 확인해보자!

 

from bs4 import BeautifulSoup
from selenium import webdriver
from openpyxl import Workbook

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')

#엑셀로 저장하기 세팅
wb = Workbook()
ws1 = wb.active
ws1.title = "네이버 기사 스크래핑"
ws1.append(["제목", "링크", "신문사"])

#한 페이지 내에 있는 기사 제목, url, 신문사 이름 스크래핑
for article in articles:
    a_tag = article.select_one('dl > dt > a')

    title = a_tag.text
    url = a_tag['href']
    comp = article.select_one('span._sp_each_source').text.split(' ')[0]
#엑셀에 title, url, comp를 저장하기
    ws1.append([title, url, comp])

driver.quit()
wb.save(filename='네이버 기사 스크래핑.xlsx')

 

결과를 확인해보자!!

'네이버 기사 스크래핑' 이라는 제목의 엑셀 파일이 만들어졌고 제목, 링크, 신문사 행의 아래로 스크래핑한 기사 제목, 링크, 신문사 이름이 잘 들어가있다. 

 

 

좀 더 업그레이드해보기!!!

 

4. ※기사의 썸네일도 추가해서 엑셀 파일에 저장하기 완성코드※  

 

지금까지는 기사의 제목, url, 신문사 이름까지만 스크래핑해보았다. 

이번에는 기사의 썸네일도 추가해서 엑셀 파일에 저장해보려한다. 

 

바로 완성코드!!!

from bs4 import BeautifulSoup
from selenium import webdriver
from openpyxl import Workbook

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')

#엑셀로 저장하기 세팅
wb = Workbook()
ws1 = wb.active
ws1.title = "네이버 주식 기사 스크래핑"
ws1.append(["제목", "링크", "신문사", "썸네일"])

#한 페이지 내에 있는 기사 제목, url, 신문사 이름, 썸네일 스크래핑
for article in articles:
    #기사 스크래핑
    a_tag = article.select_one('dl > dt > a')
    #제목 텍스트 스크래핑
    title = a_tag.text
    #url스크래핑
    url = a_tag['href']
    #신문사이름스크래핑
    comp = article.select_one('span._sp_each_source').text.split(' ')[0]
    #썸네일 스크래핑
    thumbnail = article.select_one('div > a > img')['src']
#엑셀에 title, url, comp를 저장하기
    ws1.append([title, url, comp, thumbnail])

driver.quit()
wb.save(filename='네이버 기사 스크래핑.xlsx')

 

5. 기사 30개씩 스크래핑하기 

 

현재는 페이지에 기사가 10개씩 출력되어서 1페이지에 있는 기사 10개만 스크래핑이 된 상태이다. 

 

다음 페이지에 있는 기사까지 스크래핑하고 싶다면 어떻게 하면 될까? 

 

for 반복문을 중첩으로 이용해보자!!!

 

아래는 '다음'사이트에서 '주식' 기사를 찾아서 10페이지까지의 글을 크롤링하는 방법이다.

import requests
from bs4 import BeautifulSoup
import openpyxl

wb = openpyxl.Workbook()
sheet = wb.active

#검색어 입력
search = input('검색할 데이터를 입력해주세요 : ')
#데이터 크롤링
sheet.append(['기사제목','기사요약','기사url'])

#for 반복문
for p in range(1, 10+1, 1):
    raw = requests.get("https://search.daum.net/search?w=news&nil_search=btn&DA=NTB&enc=utf8&cluster=y&cluster_page=1&q={s}&{p}".format(s = search, p = p))
    html = BeautifulSoup(raw.text, 'html.parser')
    container = html.select("ul#clusterResultUL li")

    for c in container:
        #기사제목
        title = c.select_one("div.wrap_tit.mg_tit a").text.strip()
        #기사요약
        content = c.select_one("p.f_eb.desc").text.strip()
        #기사url
        url = c.select_one('div.wrap_tit.mg_tit a')['href']
        sheet.append([title, content, url])

wb.save('daum_news.xlsx')

위 코드는 간토끼 DataMining lab에서 참고하여 가져왔다! 
출처: https://datalabbit.tistory.com/24 [간토끼 DataMining Lab]

 

네이버 기사로도 시도해 봐야겠다!!!

 

 

반응형