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 #여러개 이미지 파일을 압축파일로 묶어 저장
[결과화면]