Python

업무자동화_파이썬으로 네이버 뉴스 기사 스크래핑/크롤링 하기(2)_엑셀에 저장하기

Yoonjung 2023. 6. 24. 21:56

[스파르타 내일배움] Python 1주차 - 웹 스크랩핑 (추가정리)

네이버에서 '키워드' 검색 후, 네이버 뉴스 리스트 웹 스크랩핑/크롤링 하기  ---> 엑셀로 출력 및 저장하기 

 

1. openpyxl 라이브러리 설치하기

⇒ openpyxl 도 마찬가지로 누군가 만들어둔 코드이며, 설치 진행 

pip install openpyxl

2. 엑셀 파일 만들어보기

openpyxl 기본 코드 

from openpyxl import Workbook

wb= Workbook()
sheet = wb.active

sheet['A1'] = '안녕하세요!'

wb.save("샘플파일.xlsx")
wb.close()

 

엑셀 읽기 (기본)

import openpyxl
wb = openpyxl.load_workbook('샘플파일.xlsx')
sheet = wb['Sheet']

sheet['A1'].value

엑셀 읽기 (시트 열에 있는 정보 불러오기) 

import openpyxl
wb = openpyxl.load_workbook('샘플파일.xlsx')
sheet = wb['Sheet']

rows = sheet.rows

for row in rows:
  print(row[0].value, row[1].value, row[2].value)

*항목명을 뺴고 출력하고 싶다면, 

#'번호,상품,가격'을 뺴고 출력하기 위해서 list로 만들어서 1번쨰 행부터 돌리게 하면 된다
import openpyxl
wb = openpyxl.load_workbook('샘플파일.xlsx')
sheet = wb['Sheet']

#'번호,상품,가격'을 뺴고 출력하기 위해서 list로 만들어서 1번쨰 행부터 돌리게 하면 된다. 
rows = list(sheet.rows)[1:]

for row in rows:
  print(row[0].value, row[1].value, row[2].value)

 

*엑셀데이터에서 출력하고 싶은 값만 뽑고 싶다면, 

조건문 if로 하여 원하는 값들만 출력 

import openpyxl
wb = openpyxl.load_workbook('샘플파일.xlsx')
sheet = wb['Sheet']

#'번호,상품,가격'을 뺴고 출력하기 위해서 list로 만들어서 1번쨰 행부터 돌리게 하면 된다. 
rows = list(sheet.rows)[1:]

for row in rows:
  if row[2].value < 300:  #조건문을 넣어서 300보다 작은 값만 출력한다. 
    print(row[0].value, row[1].value, row[2].value)

 

3. 웹스크랩핑 결과를 엑셀로 저장하기 

import requests
from bs4 import BeautifulSoup

wb = Workbook()
sheet = wb.active

def get_news(keyword):
  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)

  soup = BeautifulSoup(data.text, 'html.parser')

  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis : 
    a = li.select_one('a.news_tit')
    row = [a.text, a['href']] #0번째에 a.text,1번째에 a['href'] 쌓을 건데 list로 만들어줌  
    sheet.append(row) #sheet에 붙여준다. 

  wb.save(f"{keyword}.xlsx")
  wb.close()
get_news('삼성전자')

--> '삼성전자'.xlsx 파일이 생성되고, 열어보면 엑셀에 제목, 링크가 리스팅된다. 

 

날짜포함하여 파일명 생성하기 

import requests
from bs4 import BeautifulSoup
from datetime import datetime  #현재날짜 포함한 파일명 만들기

wb = Workbook()
sheet = wb.active

def get_news(keyword):
  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)

  soup = BeautifulSoup(data.text, 'html.parser')

  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis : 
    a = li.select_one('a.news_tit')
    row = [a.text, a['href']] #0번째에 a.text,1번째에 a['href'] 쌓을 건데 list로 만들어줌  
    sheet.append(row) #sheet에 붙여준다. 

  today = datetime.today().strftime("%Y-%m-%d")   #현재날짜 포함한 파일명을 만들기 위해 today 변수 지정 


  wb.save(f"{today}_{keyword}.xlsx")  #today 변수를 포함하여, 날짜들어간 파일명 생성 
  wb.close()

 

 

키워드별 파일 생성하기 

keywords = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']

for keyword in keywords: #keywords 리스트에 있는 걸 하나씩 꺼내서 get_news 함수를 보여줌 
  print(keyword)  #print를 넣어서 어디까지 출력되고 있는지 확인 가능 
  get_news(keyword)

[결과화면] 

 

Colab 파일 한번에 다운받기 --> 압축파일로 묶어서 다운로드 

!zip -r /content/files.zip /content/news

파일명 변경 

import os

path = '/content/news'
names = os.listdir(path)

for name in names:
  new_file = name.split('.')[0] + '(뉴스).xlsx'
  os.rename(path+'/'+name,path+'/'+new_file)

 


**(번외) 엑셀파일에 있는 기업종목에 대해 주식 차트 이미지 스크랩핑하여 다운로드 받기 

 

이미지 다운로드 

import urllib.request

url = 'https://ssl.pstatic.net/imgfinance/chart/item/area/day/005930.png' #이미지 URL 넣기 
urllib.request.urlretrieve(url, "samsung.jpg") #파일저장명 지정

 

엑셀 파일 종목들의 이미지를 한번에 다운로드 받기 

(예시) 

 

1) 관리종목 파일 불러오기 + 정보 불러오기 

import openpyxl
wb = openpyxl.load_workbook('관리종목.xlsx')
sheet = wb['종목']

new_rows = list(sheet.rows)[1:]

for row in new_rows:
  print(row[0].value, row[1].value)

 

2) 네이버 주식에서 기업별 주식 이미지 파일들을 불러와서 저장 

import openpyxl
wb = openpyxl.load_workbook('관리종목.xlsx')
sheet = wb['종목']

new_rows = list(sheet.rows)[1:]

for row in new_rows:
  code = row[1].value  #code 변수 지정/1번쨰 열
  name = row[0].value  #name 변수 지정/2번쨰 열 
  url = f'https://ssl.pstatic.net/imgfinance/chart/item/area/day/{code}.png'
  urllib.request.urlretrieve(url, f"images/{name}.jpg")   #여러개 이미지 파일들을 생성

3) 여러 이미지 파일을 압축파일로 묶어서 저장

!zip -r /content/files.zip /content/images  #여러개 이미지 파일을 압축파일로 묶어 저장

[결과화면]