๋ชฉ์ฐจ
๊ฐ๋น์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฉ์ธํ๋ฉด ํฌ๋กค๋งํ๊ธฐ
import requests
from bs4 import BeautifulSoup as bs
import re
gabiapage = requests.get("https://library.gabia.com/")
soup = bs(gabiapage.text, "html.parser")
elements = soup.select('div.esg-entry-content a > span')
#print(elements)
for index, element in enumerate(elements, 1):
print('{}๋ฒ์งธ ๊ฒ์๊ธ์ ์ ๋ชฉ : {}'.format(index, element.text))
- BeautifulSoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ importํ ๋, bs ๋ณ์นญ์ผ๋ก ์ค์ฌ์ ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉํ๋ค.
- div.esg-entry-content a > span ์ผ๋ก ๋ชจ๋ ๊ฒ์๊ธ์ ์ ๋ชฉ์ด ๋ด๊ธด <span> ์์๋ค์ ์ ํํ๋ค.
- enumerate()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ๋ค. ์ด๋ ์ธ๋ฑ์ค๋ 1๋ถํฐ ์์ํ๋ค. ๋ฐ๋ณต๋ฌธ์ ํตํด์ ์ ํ๋ ์์๋ค์ ์ํํ๋ฉด์ ๊ฐ ์์์ ํ ์คํธ, ์ฆ ๊ฒ์๊ธ์ ์ ๋ชฉ์ ์ถ๋ ฅํ๋ค.
๐ ์ถ๋ ฅํ ๋ฐ์ดํฐ ํ์ธ
์ ์ฝ๋๋ฅผ ์ํํ๋ฉด 388๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๋ค.
๊ฐ๋น์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฉ์ธํ๋ฉด์์ ๊ฐ์ ธ์จ ํ์ด์ง๋ค์ด์ ์ ํ์๋์ง ์๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด ๋ฐ์ดํฐ๋ ํ์ฑํ์ฌ ๊ฐ์ ธ์จ ํ, ๋ฉ๋ชจ๋ฆฌ ์์ ์๋ element ๋ณ์์ ์กด์ฌํ๋ค.
์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ค๋ฉด ํ์ผ์ ์ ์ฅํด์ผํ๋ค. ์ด๋ฅผ ์ํด re ๋ชจ๋์ ๋ ์ด์ ์ฌ์ฉํ์ง์๊ณ , ๋์ pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ pd ๋ณ์นญ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ค.
๋ฐ์ดํฐ ๊ด๋ฆฌ/๋ถ์์ ์ํ Pands ํ์ฉ
๐ฆ pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
์์์ ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ Excelํ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํด ํ๋ค์ค๋ฅผ ์ฌ์ฉํ๋๋กํ๋ค.
- cmd ์ฐฝ ์คํ
- ํจํค์ง ๊ด๋ฆฌ์ pip๋ฅผ ์ฌ์ฉํ์ฌ ์ค์น ํ์ธ pip show pands
- ์ค์น๋์ด ์์ง ์๋ค๋ฉด pip install pands
๐ ์นํฌ๋กค๋ง2.py ์ฝ๋์์ฑ
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
gabiapage = requests.get("https://library.gabia.com/")
soup = bs(gabiapage.text, "html.parser")
elements = soup.select('div.esg-entry-content a.eg-grant-element-0')
titles = []
links = []
for index, element in enumerate(elements, 1):
titles.append(element.text)
links.append(element.attrs["href"])
print(titles)
print(links)
- `titles = [], links = []` : ๊ฐ๊ฐ ๊ฒ์๊ธ์ ์ ๋ชฉ๊ณผ ๋งํฌ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋น ๋ฆฌ์คํธ ์์ฑ
- `for index, element in enumerate(elements,1)` : elements ์๋ ๊ฒ์๊ธ์ ์ ๋ชฉ๊ณผ ๋งํฌ๋ฅผ ํฌํจํ๋ HTML์์๊ฐ ๋ด๊ฒจ์๋ค. enumerate()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์์์ ์ธ๋ฑ์ค ํจ๊ป ์์ ์์ฒด๋ฅผ ๋ฐ๋ณตํ๋ค.
- ๊ฐ ์์์ ํ
์คํธ์ href ์์ฑ์ ์ถ์ถํ๊ณ titles, links ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ค.
โจ ์นํฌ๋กค๋ง2.py ์ฝ๋์ถ๊ฐ - Excel ํ์ผ๋ก ๋ณํ
์ด์ ์์งํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํด ํ๋ค์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. ํ๋ค์ค์ ๋ณ์นญ์ผ๋ก pd๋ฅผ ์ฌ์ฉํ๋ค.
๋จผ์ ๋ฐ์ดํฐํ๋ ์์ ์์ฑํด์ผํ๋ค. ์ด๋ฅผ ์ํด์๋ pd.DataFrame()์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ํ๋ ์์ ๋ง๋ค๊ณ ๊ฐ ์ด์ ์๋ key-valueํ์์ผ๋ก ๊ฐ์ ๋ฃ๋๋ค. ์ด๋ print(links)๋ก ์ถ๋ ฅํ ๋ด์ฉ์ links ํค ๊ฐ์ ๋ฆฌ์คํธํํ๋ก ๋ฃ๋๋ค.
df.to_excel() ๋ฉ์๋๋ ๋ฐ์ดํฐ ํ๋ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ผ์ ํ์์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋ ๋ฉ์๋์ด๋ค.
๋ฐ์ดํฐ ํ๋ ์์ ๋ฉํธ๋ฆญ์ค ํํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์์ ์ ํํ๋ก ๋ณํํ์ฌ ํ์ผ๋ก ์ ์ฅํ๋ค.
df = pd.DataFrame()
df["titles"] = titles
df["links"] = links
df.to_excel('test.xlsx', sheet_name = "Sheet1")
- `df = pd.DataFrame()` : ๋นํ๋ ์ ์์ฑ
- `df["titles"] = titles ์ df["links"] = links` : titles์ด๊ณผ links ์ด์ ์ถ๊ฐํ๋ค. ๊ฐ ์ด์๋ ์ด์ ์ ์์งํ ์ ๋ชฉ๊ณผ ๋งํฌ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ค.
- `df.to_excel('test.xlsx', sheet_name = "Sheet1")` : to_excel() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐํ๋ ์์ Excel ํ์ผ๋ก ์ ์ฅํ๋ค. ์ด๋ ํ์ผ ์ด๋ฆ์ text.xlsx๋ก ํ๊ณ , ์ํธ์ ์ด๋ฆ์ "Sheet1"๋ก ์ง์ ํ๋ค.
๐ฅ ๋ฌธ์ ํด๊ฒฐ
ํ๋ค์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ค์นํ๋ฉด ๋๋ ์ค.. openpyxl ๋ชจ๋์ด ์์ด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
openpyxl์ ํ๋ค์ค๊ฐ Excel ํ์ผ์ ์์ฑํ ๋ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๐ง openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
- ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ openpyx์ ์ค์น
- pip install openpyxl ๋ช
๋ น์ ์คํ ํํ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ ์์ ์ผ๋ก Excel ํ์ผ์ด ์์ฑ๋๋ค.
pip install openpyxl
์คํ์ ํ๋ฉด ๋ฐ์ดํฐ ํ๋ ์์ ๋ด์ฉ์ด ์์ ํ์ผ๋ก ๋ณํ๋์ด ์ถ๋ ฅ๋๊ณ , ์ง์ ํ ๊ฒฝ๋ก์ ํ์ผ์ด ์์ฑ๋๋ค.
์์ฑ๋ ์์ ํ์ผ์ ์ผ๋ฐ์ ์ธ ์์ ํ๋ก๊ทธ๋จ์ผ๋ก ์ด์ด์ ํ์ธํ ์ ์๋ค.
๐ญ ๋ง๋ฌด๋ฆฌ
ํฌ๋กค๋ง์ ํตํด ์์งํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ช ์ค๋ก ์ฝ๊ฒ ์ ๋ฆฌํ์ฌ ํ์ผ๋ก ๋ง๋ค ์ ์์๋ค.
์์ ํ์ผ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๋ด์ฉ ๋ถ์์ ํ ์ ์์๊ณ , ์ด๋ฅผ ํตํด ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์๊ฐํํ๊ณ ์ธ์ฌ์ดํธ๋ฅผ ๋์ถํ ์ ์์๋ค. ๋ํ Selenium ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋กค๋ง์ ์ํํ ์๋ ์๋ค. ์ด๋ฅผ ํตํด ๋์ ์นํ์ด์ง์์๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์์๋ค.