Hello creators ๐
[1-5] openpyxl, Workbook ํ์ฉํด์ ํ์ด์ฌ์ผ๋ก ์์ ๋ค๋ฃจ๊ธฐ (feat. ์คํ๋ฅดํ ์ฝ๋ฉํด๋ฝ ๋ฐ์ดํฐ ๋ถ์ ์์ ) ๋ณธ๋ฌธ
[WEB & AI] (feat. ์ทจ์ค)/Python
[1-5] openpyxl, Workbook ํ์ฉํด์ ํ์ด์ฌ์ผ๋ก ์์ ๋ค๋ฃจ๊ธฐ (feat. ์คํ๋ฅดํ ์ฝ๋ฉํด๋ฝ ๋ฐ์ดํฐ ๋ถ์ ์์ )
๋ถ์๋งค๋_HA 2022. 12. 10. 10:37728x90
๋ฐ์ํ
Study Colab URL
https://colab.research.google.com/drive/1coeNsJQ7EH-J-ZxL3XCECYPFGqkVZ1a3#scrollTo=P4L2IHWQjB_z
openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
!pip install openpyxl
#๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
# ์ด๋ ๊ฒ ์ฐ๋ฉด ๋๋ค~ ํ๋ 'document' ๊ฐ ์์์ ๊ฒ
# ์ด๊ฒ '์ฝ๋ ์ค๋ํซ' ์ผ๋ก ๋ค์ด๊ฐ
A1 ์ ์ ์๋ ํ์ธ์ ๋ฃ๊ธฐ
from openpyxl import Workbook # openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์์ Workbook ํจ์? ํด๋์ค? ๋ฅผ ์ํฌํธ
wb= Workbook() # workbook ํจ์, ํด๋์ค? ๋ฅผ > wb ๋ผ๊ณ ๋ถ๋ฅผ๊ฑฐ์ผ
sheet = wb.active # wb๋ผ๋ ํจ์, ํด๋์ค ์ค > active ๋ผ๋ ํจ์? ๋ฅผ ์ธ๊ฑฐ์ผ > ๊ทธ๋ฌ๋ฉด ํ์ฑํ๋(active๋ sheet๊ฐ ๋์ด) > ์ด๊ฑธ sheet ์ ๋ฃ์๊ฑฐ์ผ.
sheet['A1'] = '์๋
ํ์ธ์!' # (์์์) ๋ง๋ค์ด์ง sheet ์ AI ์
์ '์๋
ํ์ธ์' ๋ฅผ ๋ฃ์ด๋ผ
wb.save("์ํํ์ผ.xlsx") # ์ํ ํ์ผ ์ด๋ผ๋ ํ์ผ๋ก ์ ์ฅํด๋ผ
wb.close()
# ์ผ์ชฝ ํญ ์ด์ด์ > ํด๋น ํ์ผ, '๋๋ธํด๋ฆญ' ํ๋ฉด > ํด๋๊ฐ ๋ค์ด ๋ฐ์์ง!
๋ฐ์ํ
'์ํ ํ์ผ' ๋ค์ด ๋ฐ์์ ์๋์ ๊ฐ์ด ์์
์์ ํ ํ์ผ ์ ๋ก๋ ํ๊ธฐ
์์ ์ฝ๊ธฐ
# ์์
์ฝ๊ธฐ
import openpyxl # ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ธ์ฌ๊ฑฐ์ผ
wb = openpyxl.load_workbook('์ํํ์ผ์.xlsx') # ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ load_wordkbook ์จ์ > ํด๋น ์์
ํ์ผ ์ด๊ฑฐ์ผ > ๊ทธ๋ฆฌ๊ณ wb ์ ๋ด์๊ฑฐ์ผ
sheet = wb['Sheet'] # โ ์์
ํ์ผ (xlsx) ์ > ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๋ค์ ์ ์๊ฒ sheet ๋ก ๋ณํ?
print(sheet['A1'].value) # ํด๋น sheet ์ค A1 ์
์ ์๋ ๊ฐ์ ํธ์ถ
print(sheet['B1'].value) # ํด๋น sheet ์ค A1 ์
์ ์๋ ๊ฐ์ ํธ์ถ
row ์ด์ฉํด์ ํธํ๊ฒ ์ฝ๊ธฐ
# rows ์ด์ฉํด์ ํธํ๊ฒ ์ฝ๊ธฐ
# ์์
์ฝ๊ธฐ
import openpyxl # ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ธ์ฌ๊ฑฐ์ผ
wb = openpyxl.load_workbook('์ํํ์ผ์.xlsx') # ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ load_wordkbook ์จ์ > ํด๋น ์์
ํ์ผ ์ด๊ฑฐ์ผ > ๊ทธ๋ฆฌ๊ณ wb ์ ๋ด์๊ฑฐ์ผ
sheet = wb['Sheet'] # โ ์์
ํ์ผ (xlsx) ์ > ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๋ค์ ์ ์๊ฒ sheet ๋ก ๋ณํ?
rows = sheet.rows # rows ์ ๊ธฐ๋ฅ : sheet ์ ์๋ '๋ชจ๋ ํ์ ๊ฐ'โญ ๋ค์ ๊ฐ์ ธ์จ๋ค.
# print(rows)
# [๋ค ๋ด๊ฒจ์๋ ๊ฑฐ์์ > ํ๋์ฉ ๋นผ์ ์ถ๋ ฅํ๊ธฐ]
for row in rows:
print(row[0].value, row[1].value, row[2].value ) # row ๋ณ์์ ๋ด๊ฒจ์ง '๊ฐ' ์ ํธ์ถํ๋ค.
list ์ฌ์ฉํด์ '๋งจ ์์ค' ๋ถํฐ ๋์ค๊ฒ ํ๊ธฐ
# list ๋ฅผ ์ฌ์ฉํด์ > '๋งจ ์์ค' ๋ถํฐ ๋์ค๊ฒ ํ๊ธฐ
import openpyxl
wb = openpyxl.load_workbook('์ํํ์ผ์.xlsx') # โ
์ฌ๊ธฐ ํ์ผ ์ด๋ฆ ์ฒดํฌ ํ ๊ฒ / error ๊ฐ๋ฅํ ์ง์
sheet = wb['Sheet']
rows = list(sheet.rows)[1:] # row๊ฐ๋ค์ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค > ์ฒซ ๋ฒ์งธ ๋ฆฌ์คํธ ๋ถํฐ ์ฃผ๋ฃจ๋ฃฉ ๊ฐ์ ธ์จ๋ค.
# ๊ฑฐ์ ์ด๋ ๊ฒ ๋ง์ด ์ฌ์ฉํจ โญโญโญโญโญ
for row in rows:
print(row[0].value, row[1].value, row[2].value) #0๋ฒ์งธ ์
๊ณ ๋ฅธ๊ฒ์์ > value! ๋ฅผ ๋ฌ๋ผ , ์ด๊ฑธ ํด์ผ ๊ฐ์ด ๋์ด
๊ฐ๊ฒฉ์ด 300์ ๋ณด๋ค ์์์ ๋ค๋ง ๋ณด๊ธฐ
# ๊ฐ๊ฒฉ์ด 300์ ๋ณด๋ค ์์ ์ ๋ค๋ง ๋ณด๊ธฐ
import openpyxl
wb = openpyxl.load_workbook('์ํํ์ผ์.xlsx') # โ
์ฌ๊ธฐ ํ์ผ ์ด๋ฆ ์ฒดํฌ ํ ๊ฒ / error ๊ฐ๋ฅํ ์ง์
sheet = wb['Sheet']
rows = list(sheet.rows)[1:] # row๊ฐ๋ค์ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค > ์ฒซ ๋ฒ์งธ ๋ฆฌ์คํธ ๋ถํฐ ์ฃผ๋ฃจ๋ฃฉ ๊ฐ์ ธ์จ๋ค.
# ๊ฑฐ์ ์ด๋ ๊ฒ ๋ง์ด ์ฌ์ฉํจ โญโญโญโญโญ
for row in rows:
if row[2].value < 300 : # '๊ฐ๊ฒฉ' ์ row[2] ์ ์์. > ๊ทธ ๊ฐ๊ฒฉ์ value ๋ฅผ ๊บผ๋ด์ ๋ณธ๋ค > ๊ทธ๊ฒ 300 ๋ณด๋ค ์์ผ๋ฉด > ์๋์ค์ ์คํํ๋ค.
# [์๋กญ๊ฒ ๋๋์ ] ๊ฐ๊ฒฉ์ด row[2] ์ ์๋ค๋ ๊ฒ! โญ
# ์ด๋ ๊ฒ, sequence ๋ก, what's next ๋ก ์ดํดํ๋ฉด ๋๋ค. โญโญโญโญโญ
print(row[2].value) # 300์ ๋ณด๋ค ์ ์ ๋์ '๊ฐ๊ฒฉ' ์ด ๋์ค๊ฒ ์ง
โญ ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฉํด์ > '์ผ์ฑ์ ์' ๋ด์ค ์คํฌ๋ํ ํ๊ฒ์ > '์ผ์ฑ์ ์ ์์ ํ์ผ' ๋ก ์ ์ฅํ๊ธฐ_part1
# ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฉํด์ > '์ผ์ฑ์ ์' ๋ด์ค ์คํฌ๋ํ ํ๊ฒ์ > '์ผ์ฑ์ ์ ์์
ํ์ผ' ๋ก ์ ์ฅํ๊ธฐ
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
def get_news(keyword):
wb= Workbook() # openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ไธญ Workbook ํจ์?ํด๋์ค? ๋ฅผ > wb ๋ผ๊ณ ๋ถ๋ฅผ๊ฑฐ์ผ
sheet = wb.active # wb ไธญ active ํจ์๋ฅผ > sheet ์ ๋ด์ (โ ๋ด์? ํจ์๋ฅผ? )
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'}
# headers ๋ ๋ชจ๋ฅด๊ฒ ๋ค ๐ฅ๐ฅโโ
data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)
# ๋ด๊ฐ ํน์ ์ฃผ์์ keyword ๋ฅผ ๋ฃ์ผ๋ฉด > ํด๋น ์ฃผ์์ ๋ํ keyword ์ ๋ํด์ 'HTML, CSS, Javascript' ๋ฅผ ์์ฒญโ > ์ด๊ฑธ get ํด > ๊ทธ๋ฆฌ๊ณ data ์ ๋ด์
soup = BeautifulSoup(data.text, 'html.parser') # ๋ฐ์์จ data ์์ text ๋ง ๊บผ๋ดโ > html ๋ก ๋ถ์ํ ์ ์๊ฒ ํดโ > ๊ทธ๊ฑธ soup ์ ๋ด์
lis = soup.select('#main_pack > section > div > div.group_news > ul > li')
# ๋ถ์ํ ์ ์๋ soup ์ > select ํจ์๋ฅผ ๋ฃ์ด์ ๋ถ์ํ๊ณ ์ถ์ ์ ๋ค css selector ๋ก ๊ณจ๋ผ์ > ๊ทธ๋ฆฌ๊ณ lis ์ ๋ฃ์ด
# ์ด์ ๊ทธ๋ฌ๋ฉด lis ์๋ li ๋ค์ด ๋ฆฌ์คํธ ํํ๋ก, ๋ฉ์ด๋ฆฌ ์งธ๋ก ๋ค์ด๊ฐ๊ฒ ๋จ โญโญโญโญโญ
# [์๊ฐ] li ๊น์ง ๋ด๋ ค๊ฐ์ ๋ > li ๋ค์ด, ๋ฆฌ์คํธ๋ก ์์ด์, for ๋ฌธ์ ์ธ ์ ์๋ค๋๊ฒ ์ค์. / ์์ง 100% ์ดํด๋ ์ ๋ผ ๐ /
# for ๋ฌธ ์ฌ์ฉํด์ ๊ฐ์ ธ์ค๊ธฐ
for li in lis: # li ๋ฆฌ์คํธ ๋ฉ์ด๋ฆฌ ์ค > ํ๋์ฉ ๊บผ๋ด์ฌ๊ฑฐ์ผ
a = li.select_one('a.news_tit') # ํ๋ ๊บผ๋ด์จ li ์์ > class ์ด๋ฆ์ด new_tit ์ธ๊ฒ์ ์ฐพ์์ > ๊ทธ ๋ถ๋ถ์ a ์ ๋ด์
print(a.text, a['href']) # a ์ค์์ text, ๋งํฌ ์ฃผ์๋ฅผ ๊บผ๋ด์ ํ๋ฆฐํธ ํด์ค
wb.save(f'{keyword}.xlsx') # ์ง๊ธ๊น์ง ๋ง๋ค์ด์ง๊ฑธ excel๋ก ๋ง๋ ๋ค.
wb.close() # ์ข
๋ฃโ / ์ ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์.
get_news ('์ผ์ฑ์ ์')
โญ ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฉํด์ > '์ผ์ฑ์ ์' ๋ด์ค ์คํฌ๋ํ ํ๊ฒ์ > '์ผ์ฑ์ ์ ์์ ํ์ผ' ๋ก ์ ์ฅํ๊ธฐ_part2
# ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฉํด์ > '์ผ์ฑ์ ์' ๋ด์ค ์คํฌ๋ํ ํ๊ฒ์ > '์ผ์ฑ์ ์ ์์
ํ์ผ' ๋ก ์ ์ฅํ๊ธฐ_part2
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
def get_news(keyword):
wb= Workbook() # openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ไธญ Workbook ํจ์?ํด๋์ค? ๋ฅผ > wb ๋ผ๊ณ ๋ถ๋ฅผ๊ฑฐ์ผ
sheet = wb.active # wb ไธญ active ํจ์๋ฅผ > sheet ์ ๋ด์ (โ ๋ด์? ํจ์๋ฅผ? )
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'}
# headers ๋ ๋ชจ๋ฅด๊ฒ ๋ค ๐ฅ๐ฅโโ
data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)
# ๋ด๊ฐ ํน์ ์ฃผ์์ keyword ๋ฅผ ๋ฃ์ผ๋ฉด > ํด๋น ์ฃผ์์ ๋ํ keyword ์ ๋ํด์ 'HTML, CSS, Javascript' ๋ฅผ ์์ฒญโ > ์ด๊ฑธ get ํด > ๊ทธ๋ฆฌ๊ณ data ์ ๋ด์
soup = BeautifulSoup(data.text, 'html.parser') # ๋ฐ์์จ data ์์ text ๋ง ๊บผ๋ดโ > html ๋ก ๋ถ์ํ ์ ์๊ฒ ํดโ > ๊ทธ๊ฑธ soup ์ ๋ด์
lis = soup.select('#main_pack > section > div > div.group_news > ul > li')
# ๋ถ์ํ ์ ์๋ soup ์ > select ํจ์๋ฅผ ๋ฃ์ด์ ๋ถ์ํ๊ณ ์ถ์ ์ ๋ค css selector ๋ก ๊ณจ๋ผ์ > ๊ทธ๋ฆฌ๊ณ lis ์ ๋ฃ์ด
# ์ด์ ๊ทธ๋ฌ๋ฉด lis ์๋ li ๋ค์ด ๋ฆฌ์คํธ ํํ๋ก, ๋ฉ์ด๋ฆฌ ์งธ๋ก ๋ค์ด๊ฐ๊ฒ ๋จ โญโญโญโญโญ
# [์๊ฐ] li ๊น์ง ๋ด๋ ค๊ฐ์ ๋ > li ๋ค์ด, ๋ฆฌ์คํธ๋ก ์์ด์, for ๋ฌธ์ ์ธ ์ ์๋ค๋๊ฒ ์ค์. / ์์ง 100% ์ดํด๋ ์ ๋ผ ๐ /
# for ๋ฌธ ์ฌ์ฉํด์ ๊ฐ์ ธ์ค๊ธฐ
for li in lis: # li ๋ฆฌ์คํธ ๋ฉ์ด๋ฆฌ ์ค > ํ๋์ฉ ๊บผ๋ด์ฌ๊ฑฐ์ผ
a = li.select_one('a.news_tit') # ํ๋ ๊บผ๋ด์จ li ์์ > class ์ด๋ฆ์ด new_tit ์ธ๊ฒ์ ์ฐพ์์ > ๊ทธ ๋ถ๋ถ์ a ์ ๋ด์
row = [a.text, a['href']] # a ์ค์์ text, ๋งํฌ ์ฃผ์๋ฅผ ๊บผ๋ด์ค > ์ด๊ฑธ ๋ฆฌ์คํธ์ ๋ด์ / โญ ์ด ๋ถ๋ถ์ด ๋ฐ๋์์
sheet.append(row) # row ๋ฅผ line9 ์์ ๋ง๋ค์ด์ง sheet ์ ๋ถ์ฌ๋ฃ๋๋ค. โญโญโญ
# ์์๋ print ๋ฅผ ํ๋๋ฐ, ์ฌ๊ธฐ๊ฐ 'excel' ์ ๋ฃ๋ ์๊ฐ์ โญโญโญ
wb.save(f'{keyword}.xlsx') # ์ง๊ธ๊น์ง ๋ง๋ค์ด์ง๊ฑธ excel๋ก ๋ง๋ ๋ค.
wb.close() # ์ข
๋ฃโ / ์ ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์.
get_news ('์ผ์ฑ์ ์') # ๋ง๋ ํจ์ ์คํ
get_news ('ํ๋์๋์ฐจ')
datetime ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉํด์ '๋ ์ง๋ก๋ ํด๋' ๋ง๋ค๊ธฐ
# datetime ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉํด์ '๋ ์ง๋ก๋ ํด๋' ๋ง๋ค๊ธฐ
from datetime import datetime # date time ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์์ > ๊ทธ ์ค์์ dateime ํจ์(ํด๋์ค?) ๋ฅผ ์ธ๊ฑฐ์ผ
a = datetime.today().strftime("%Y-%m-%d") # ๊ทธ ํจ์(ํด๋์ค?) ไธญ today ํจ์ ๋ก ํ์ฌ ์๊ฐ์ ๊ฐ์ ธ์ค๊ณ > ๊ทธ๊ฑธ string ์ผ๋ก ๋ฐ๊ฟ ๊ฑฐ์ผ
# ์ด๋, - ๋ฅผ ์ธ ์๋ ์๊ณ , / ๋ฅผ ์ธ ์๋ ์์ด
print(a)
# cf. string ์ _ ๋ก ์ฐ๋ ๊ฒฝ์ฐ
b = datetime.today().strftime("%Y_%m_%d") # โ
์ฌ๊ธฐ์์ / ๋ก ์ผ์ด~
print(b)
โญโญโญ ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฉํด์ > '์ผ์ฑ์ ์' ๋ด์ค ์คํฌ๋ํ ํ๊ฒ์ > '์ผ์ฑ์ ์ ์์ ํ์ผ' ๋ก ์ ์ฅํ๊ธฐ
# ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฉํด์ > '์ผ์ฑ์ ์' ๋ด์ค ์คํฌ๋ํ ํ๊ฒ์ > '์ผ์ฑ์ ์ ์์
ํ์ผ' ๋ก ์ ์ฅํ๊ธฐ
import requests # ์์ฒญํด์ ์ผํ์ ๊ฐ์ ธ์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from bs4 import BeautifulSoup # ๊ฐ์ ธ์จ ์ผํ์ ๋ฅผ ๋ถ์ ๊ฐ๋ฅํ๊ฑธ๋ก ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from openpyxl import Workbook # ์์
ํ์ผ ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from datetime import datetime # ๋ ์ง ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
def get_news(keyword):
wb= Workbook() # openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ไธญ Workbook ํจ์?ํด๋์ค? ๋ฅผ > wb ๋ผ๊ณ ๋ถ๋ฅผ๊ฑฐ์ผ
sheet = wb.active # wb ไธญ active ํจ์๋ฅผ > sheet ์ ๋ด์ (โ ๋ด์? ํจ์๋ฅผ? )
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'}
# headers ๋ ๋ชจ๋ฅด๊ฒ ๋ค ๐ฅ๐ฅโโ
data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)
# ๋ด๊ฐ ํน์ ์ฃผ์์ keyword ๋ฅผ ๋ฃ์ผ๋ฉด > ํด๋น ์ฃผ์์ ๋ํ keyword ์ ๋ํด์ 'HTML, CSS, Javascript' ๋ฅผ ์์ฒญโ > ์ด๊ฑธ get ํด > ๊ทธ๋ฆฌ๊ณ data ์ ๋ด์
soup = BeautifulSoup(data.text, 'html.parser') # ๋ฐ์์จ data ์์ text ๋ง ๊บผ๋ดโ > html ๋ก ๋ถ์ํ ์ ์๊ฒ ํดโ > ๊ทธ๊ฑธ soup ์ ๋ด์
lis = soup.select('#main_pack > section > div > div.group_news > ul > li')
# ๋ถ์ํ ์ ์๋ soup ์ > select ํจ์๋ฅผ ๋ฃ์ด์ ๋ถ์ํ๊ณ ์ถ์ ์ ๋ค css selector ๋ก ๊ณจ๋ผ์ > ๊ทธ๋ฆฌ๊ณ lis ์ ๋ฃ์ด
# ์ด์ ๊ทธ๋ฌ๋ฉด lis ์๋ li ๋ค์ด ๋ฆฌ์คํธ ํํ๋ก, ๋ฉ์ด๋ฆฌ ์งธ๋ก ๋ค์ด๊ฐ๊ฒ ๋จ โญโญโญโญโญ
# [์๊ฐ] li ๊น์ง ๋ด๋ ค๊ฐ์ ๋ > li ๋ค์ด, ๋ฆฌ์คํธ๋ก ์์ด์, for ๋ฌธ์ ์ธ ์ ์๋ค๋๊ฒ ์ค์. / ์์ง 100% ์ดํด๋ ์ ๋ผ ๐ /
# for ๋ฌธ ์ฌ์ฉํด์ ๊ฐ์ ธ์ค๊ธฐ
for li in lis: # li ๋ฆฌ์คํธ ๋ฉ์ด๋ฆฌ ์ค > ํ๋์ฉ ๊บผ๋ด์ฌ๊ฑฐ์ผ
a = li.select_one('a.news_tit') # ํ๋ ๊บผ๋ด์จ li ์์ > class ์ด๋ฆ์ด new_tit ์ธ๊ฒ์ ์ฐพ์์ > ๊ทธ ๋ถ๋ถ์ a ์ ๋ด์
row = [a.text, a['href']] # a ์ค์์ text, ๋งํฌ ์ฃผ์๋ฅผ ๊บผ๋ด์ค > ์ด๊ฑธ ๋ฆฌ์คํธ์ ๋ด์ / โญ ์ด ๋ถ๋ถ์ด ๋ฐ๋์์
sheet.append(row) # row ๋ฅผ line9 ์์ ๋ง๋ค์ด์ง sheet ์ ๋ถ์ฌ๋ฃ๋๋ค. โญโญโญ
# ์์๋ print ๋ฅผ ํ๋๋ฐ, ์ฌ๊ธฐ๊ฐ 'excel' ์ ๋ฃ๋ ์๊ฐ์ โญโญโญ
today = datetime.today().strftime("%Y_%m_%d") # ์ค๋ ๋ ์ง ๊ฐ์ ธ์์ > string ์ผ๋ก ๋ฐ๊พธ๊ณ > today ์ ๋ฃ์ด
wb.save(f'{today}_{keyword}.xlsx') # ์ง๊ธ๊น์ง ๋ง๋ค์ด์ง๊ฑธ excel๋ก ๋ง๋ ๋ค.
# 30 line ์์ ๋ง๋ ๋ ์ง๋ฅผ > f-string ์ผ๋ก ๋ฃ๊ธฐ
# โ
ํจ์ ์ธ์ ๋ฃ์ด์ค
wb.close() # ์ข
๋ฃโ / ์ ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์.
get_news ('์ผ์ฑ์ ์') # ๋ง๋ ํจ์ ์คํ
get_news ('ํ๋์๋์ฐจ')
โญโญโญ news ํด๋์ ์์ด๊ฒ ํ๊ธฐ
# news ๋ผ๋ ํด๋! ์ ์์ด๊ฒ ํ๊ธฐ!
import requests # ์์ฒญํด์ ์ผํ์ ๊ฐ์ ธ์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from bs4 import BeautifulSoup # ๊ฐ์ ธ์จ ์ผํ์ ๋ฅผ ๋ถ์ ๊ฐ๋ฅํ๊ฑธ๋ก ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from openpyxl import Workbook # ์์
ํ์ผ ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from datetime import datetime # ๋ ์ง ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
def get_news(keyword):
wb= Workbook() # openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ไธญ Workbook ํจ์?ํด๋์ค? ๋ฅผ > wb ๋ผ๊ณ ๋ถ๋ฅผ๊ฑฐ์ผ
sheet = wb.active # wb ไธญ active ํจ์๋ฅผ > sheet ์ ๋ด์ (โ ๋ด์? ํจ์๋ฅผ? )
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'}
# headers ๋ ๋ชจ๋ฅด๊ฒ ๋ค ๐ฅ๐ฅโโ
data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)
# ๋ด๊ฐ ํน์ ์ฃผ์์ keyword ๋ฅผ ๋ฃ์ผ๋ฉด > ํด๋น ์ฃผ์์ ๋ํ keyword ์ ๋ํด์ 'HTML, CSS, Javascript' ๋ฅผ ์์ฒญโ > ์ด๊ฑธ get ํด > ๊ทธ๋ฆฌ๊ณ data ์ ๋ด์
soup = BeautifulSoup(data.text, 'html.parser') # ๋ฐ์์จ data ์์ text ๋ง ๊บผ๋ดโ > html ๋ก ๋ถ์ํ ์ ์๊ฒ ํดโ > ๊ทธ๊ฑธ soup ์ ๋ด์
lis = soup.select('#main_pack > section > div > div.group_news > ul > li')
# ๋ถ์ํ ์ ์๋ soup ์ > select ํจ์๋ฅผ ๋ฃ์ด์ ๋ถ์ํ๊ณ ์ถ์ ์ ๋ค css selector ๋ก ๊ณจ๋ผ์ > ๊ทธ๋ฆฌ๊ณ lis ์ ๋ฃ์ด
# ์ด์ ๊ทธ๋ฌ๋ฉด lis ์๋ li ๋ค์ด ๋ฆฌ์คํธ ํํ๋ก, ๋ฉ์ด๋ฆฌ ์งธ๋ก ๋ค์ด๊ฐ๊ฒ ๋จ โญโญโญโญโญ
# [์๊ฐ] li ๊น์ง ๋ด๋ ค๊ฐ์ ๋ > li ๋ค์ด, ๋ฆฌ์คํธ๋ก ์์ด์, for ๋ฌธ์ ์ธ ์ ์๋ค๋๊ฒ ์ค์. / ์์ง 100% ์ดํด๋ ์ ๋ผ ๐ /
# for ๋ฌธ ์ฌ์ฉํด์ ๊ฐ์ ธ์ค๊ธฐ
for li in lis: # li ๋ฆฌ์คํธ ๋ฉ์ด๋ฆฌ ์ค > ํ๋์ฉ ๊บผ๋ด์ฌ๊ฑฐ์ผ
a = li.select_one('a.news_tit') # ํ๋ ๊บผ๋ด์จ li ์์ > class ์ด๋ฆ์ด new_tit ์ธ๊ฒ์ ์ฐพ์์ > ๊ทธ ๋ถ๋ถ์ a ์ ๋ด์
row = [a.text, a['href']] # a ์ค์์ text, ๋งํฌ ์ฃผ์๋ฅผ ๊บผ๋ด์ค > ์ด๊ฑธ ๋ฆฌ์คํธ์ ๋ด์ / โญ ์ด ๋ถ๋ถ์ด ๋ฐ๋์์
sheet.append(row) # row ๋ฅผ line9 ์์ ๋ง๋ค์ด์ง sheet ์ ๋ถ์ฌ๋ฃ๋๋ค. โญโญโญ
# ์์๋ print ๋ฅผ ํ๋๋ฐ, ์ฌ๊ธฐ๊ฐ 'excel' ์ ๋ฃ๋ ์๊ฐ์ โญโญโญ
today = datetime.today().strftime("%Y_%m_%d") # ์ค๋ ๋ ์ง ๊ฐ์ ธ์์ > string ์ผ๋ก ๋ฐ๊พธ๊ณ > today ์ ๋ฃ์ด
wb.save(f'news/{today}_{keyword}.xlsx') # ์ง๊ธ๊น์ง ๋ง๋ค์ด์ง๊ฑธ excel๋ก ๋ง๋ ๋ค.
# 30 line ์์ ๋ง๋ ๋ ์ง๋ฅผ > f-string ์ผ๋ก ๋ฃ๊ธฐ
# โ
ํจ์ ์ธ์ ๋ฃ์ด์ค
# โ
์ฌ๊ธฐ์ news ํด๋ ๋ง๋ค์ด์ค / news ๋ฅผ ์ฌ๊ธฐ์ ์ฐ๋ฉด ์ ํด๋๊ฐ ๋ง๋ค์ด์ง๋ ๊ฑด์ง๋ ์์ง ๋ชจ๋ฅด๊ฒ ์. ๐
wb.close() # ์ข
๋ฃโ / ์ ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์.
get_news ('์ผ์ฑ์ ์') # ๋ง๋ ํจ์ ์คํ
get_news ('ํ๋์๋์ฐจ')
์ด์ ์คํ๋ฅดํ ์ฝ๋ฉ ํด๋ฝ ์์
๊ฐ์ URL | https://bit.ly/3W2CYsK |
Colab URL | https://bit.ly/3Ph9e9p |
728x90
๋ฐ์ํ
'[WEB & AI] (feat. ์ทจ์ค) > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Comments