Study Anything ๐Ÿง

ํ”„๋กœ์ ํŠธ ์„ค๋ช… & ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ (์›น ํฌ๋กค๋ง), ์ €์žฅ - ์„ ์ˆ˜ ๋ฐ์ดํ„ฐ ๋ณธ๋ฌธ

ํ”„๋กœ์ ํŠธ/[DA] ๋ฐ์ดํ„ฐ ๋ถ„์„ : ๋ฐฐ๊ตฌ

ํ”„๋กœ์ ํŠธ ์„ค๋ช… & ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ (์›น ํฌ๋กค๋ง), ์ €์žฅ - ์„ ์ˆ˜ ๋ฐ์ดํ„ฐ

์†” 2022. 3. 11. 23:48

์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋Š” ์Šคํฌ์ธ  ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋กœ, ์Šคํฌ์ธ  ์ค‘ ์—ฌ์ž๋ฐฐ๊ตฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ํฐ ๋ชฉํ‘œ๋Š” ์„ ์ˆ˜๋“ค์˜ ๊ฒฝ๊ธฐ ๊ธฐ๋ก ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ตฌํ•˜๊ณ , ์–ด๋–ค ๋‘ ํŒ€์ด ๊ฒฝ๊ธฐ๋ฅผ ์น˜๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ํฌ์ง€์…˜ ๋ณ„๋กœ ์„ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ์–ด๋Š ํŒ€์ด ์Šน๋ฆฌํ• ์ง€ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ”„๋กœ์ ํŠธ์˜ ์ง„ํ–‰ ๊ณผ์ •์„ ๋‹ด์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ๊ตฌ์˜ ์ž์„ธํ•œ ๋ฃฐ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

์„ ์ˆ˜์˜ ๊ฒฝ๊ธฐ ๊ธฐ๋ก ๋ฐ์ดํ„ฐ์—๋Š” ํฌ๊ฒŒ ๊ณต๊ฒฉ, ์„œ๋ธŒ, ์„ธํŠธ, ๋ธ”๋กœํ‚น, ๋ฆฌ์‹œ๋ธŒ, ๋””๊ทธ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

๊ฐ ํฌ์ง€์…˜ ๋ณ„๋กœ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ฒจ์ง€๋Š” ํ•ญ๋ชฉ์ด ์กฐ๊ธˆ์”ฉ์€ ๋‹ค๋ฅด์ง€๋งŒ ์œ„ ํ•ญ๋ชฉ๋“ค์„ ํ† ๋Œ€๋กœ ์„ ์ˆ˜์˜ ์—ญ๋Ÿ‰์„ ์ธก์ •ํ•œ๋‹ค.

 

 

 

๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ๋ถ„์„ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋งˆ๋ จํ•˜๋Š” ์ผ์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ๋งˆ๋ จํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ ์ด๋ฏธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ชจ์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์„ ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ํฌ๋กค๋ง์ด๋‹ค.

 

์ž ๊ทธ๋Ÿผ ํฌ๋กค๋ง์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

 

 

 

(1) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import

from selenium import webdriver	# ํฌ๋กค๋ง์— ์‚ฌ์šฉ
import pandas as pd	# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„, csv ์ƒ์„ฑ์— ์‚ฌ์šฉ
import time

 

 

 

(2) ํฌ๋กค๋ง

๋‚ด๊ฐ€ ํฌ๋กค๋ง ํ•  ์›นํŽ˜์ด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค.

ํฌ์ง€์…˜๊ณผ ํฌ์ง€์…˜ ๋ณ„ ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ์ž๋™์œผ๋กœ ํฌ๋กค๋งํ•˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

 

ํฌ๋กค๋ง ํ•  ์›นํŽ˜์ด์ง€

 

 

ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํฌ๋กค๋งํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” chromedriver ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์€ ํ›„ ํ•ด๋‹น ํŒŒ์ผ์„ ๋“œ๋ผ์ด๋ฒ„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋‹ค์Œ์œผ๋กœ url ์„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ ํฌ๋กค๋งํ•  ๋•Œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋„๋ก ํ•œ๋‹ค.

browser = webdriver.Chrome('C:/Users/ADMIN/Desktop/chromedriver.exe')  # chromedriver ๋‹ค์šด ํ•„์š”

position = input("ํฌ์ง€์…˜: ")
page = int(input("ํŽ˜์ด์ง€ ์ˆ˜: "))

๋‹ค์Œ์œผ๋กœ url ์„ ์ž…๋ ฅํ•˜๊ณ  ๋“œ๋ผ์ด๋ฒ„๊ฐ€ url ์„ ์‚ฌ์šฉํ•˜๋„๋ก get ํ•˜๊ณ , ์ž ๊น์˜ ์‹œ๊ฐ„ ํ…€์„ ๋‘”๋‹ค.

search_url = "url ์ž…๋ ฅ"

browser.get(search_url)
browser.implicitly_wait(2)

 

 

์ž ์ด์ œ ์›นํŽ˜์ด์ง€์˜ html ๊ตฌ์กฐ๋ฅผ ๋ณด์ž.

์šฐ๋ฆฌ๊ฐ€ ์ถ”์ถœํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๋“ค์ด table ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด ์ •๋ณด๋“ค์„ ํ† ๋Œ€๋กœ ํฌ๋กค๋ง ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

html ๊ตฌ์กฐ

table ์•ˆ์˜ ๋‚ด์šฉ์„ ํฌ๋กค๋ง ํ•˜๋Š” ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ…Œ์ด๋ธ”์„ ์ฐพ์„ ๋•Œ class_name ์œผ๋กœ ์ฐพ์•˜๋Š”๋ฐ, ์œ„์˜ html ๊ตฌ์กฐ์™€ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ดค์„ ๋•Œ "table-div" ๋Š” ํ…Œ์ด๋ธ” ํƒœ๊ทธ์˜ ํด๋ž˜์Šค๋ช…์ด ์•„๋‹ˆ์ง€๋งŒ ์ด ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•ด์•ผ ์ •์ƒ์ ์œผ๋กœ ํฌ๋กค๋ง์ด ์ด๋ค„์กŒ๋‹ค.

์ด์ฒ˜๋Ÿผ ํฌ๋กค๋ง์ด ์›ํ•˜๋Š”๋Œ€๋กœ ๋˜์ง€ ์•Š์„ ๋•Œ๋Š” ์ƒ์œ„์™€ ํ•˜์œ„๋ฅผ ์˜ค๊ฐ€๋ฉฐ ์ ์ ˆํ•œ ํƒœ๊ทธ๋ฅผ ์ฐพ์•„๋ด์•ผ ํ•œ๋‹ค.

 

์•„๋ฌดํŠผ ์ฒ˜์Œ์— ํ…Œ์ด๋ธ”์„ ์ฐพ์„ ๋•Œ๋Š” class_name ์œผ๋กœ ์ฐพ๊ณ ,

๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” tag_name ์œผ๋กœ tbody ์™€ tr, td ์˜์—ญ์„ ์ฐพ๋Š”๋‹ค.

find_element ์™€ find_elements ์˜ ์ฐจ์ด๋Š” ํ•œ ๊ฐœ๋ฅผ ์–ป๋Š”์ง€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์–ป๋Š”์ง€์— ๋Œ€ํ•œ ์ฐจ์ด์ด๋‹ค.

find_elements ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์Šฌ๋ผ์ด์‹ฑ์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์˜์—ญ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.

 

๋‚˜๋Š” ์ข€ ๋” ์„ธ๋ถ„ํ™”ํ•˜๋Š๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ , ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด ๋‘” ๋ฆฌ์ŠคํŠธ์— ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ด๋„ ๋ฌธ์ œ๋Š” ์—†๋‹ค. (๋ฐ”๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์€ ๋” ์ข‹์„ ๊ฒƒ..)

table = browser.find_element_by_class_name("table-div")	# ๋˜‘๊ฐ™์ด ํ…Œ์ด๋ธ”์ด์–ด๋„ ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ช…์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
tbody = ptable.find_element_by_tag_name("tbody")
trows = ptbody.find_elements_by_tag_name("tr")

for index, value in enumerate(trows):
    data = value.find_elements_by_tag_name("td")[1:]
    name = data[0].text
    team = data[1].text
    ...
    namelist.append(name)
    teamlist.append(team)
    ...

 

 

๋ฐ์ดํ„ฐ ์ถ”์ถœ์ด ๋๋‚ฌ๋‹ค๋ฉด ๋“œ๋ผ์ด๋ฒ„๋กœ ์‚ฌ์šฉํ–ˆ๋˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์•„์ค€๋‹ค.

browser.close()

 

 

 

(3) ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ, csv ํŒŒ์ผ๋กœ ์ €์žฅ

๋ฆฌ์ŠคํŠธ์— ๊ฐ ๋‚ด์šฉ์ด ๋ชจ๋‘ ๋‹ด๊ฒผ๋‹ค๋ฉด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ์‚ฌ์šฉํ•  column ๊ณผ ๊ฐ’์„ ๋”•์…”๋„ˆ๋ฆฌ์˜ { ํ‚ค:๊ฐ’ } ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํ™•์ธํ•ด๋ณธ๋‹ค.

# DataFrame - Libero
data = {"name":namelist,"team":teamlist,"pos":"Li","score":scorelist,"error":errlist,...}

libero = pd.DataFrame(data)
libero.index += 1
libero.head(5)

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์ด ์ž˜ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•  ๋•Œ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š”๋ฐ ์ธ๋ฑ์Šค๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋„๋ก ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

๋ฆฌ๋ฒ ๋กœ ๋ฐ์ดํ„ฐ

 

 

๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ ˆํ”„ํŠธ, ๋ผ์ดํŠธ, ์„ผํ„ฐ, ์„ธํ„ฐ ํฌ์ง€์…˜์˜ ๋ฐ์ดํ„ฐ๋„ ์ถ”๊ฐ€๋กœ ์–ป๋Š”๋‹ค.

์ด์ œ ๊ฐ ํฌ์ง€์…˜ ๋ณ„ csv ํŒŒ์ผ๊ณผ ๋ชจ๋‘ ํ•ฉ์นœ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

 

DataFrame.to_csv() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ csv ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

๋ฉ”์†Œ๋“œ ์†์„ฑ์— ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํŒŒ์ผ ์ด๋ฆ„, ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•์€ utf-8-sig ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๊ธ€์ด ๊นจ์ง€์ง€ ์•Š๋Š”๋‹ค.

libero.to_csv('C:\\...\\libero.csv',encoding='utf-8-sig')
left.to_csv('C:\\...\\left.csv',encoding='utf-8-sig')
right.to_csv('C:\\...\\right.csv',encoding='utf-8-sig')
center.to_csv('C:\\...\\center.csv',encoding='utf-8-sig')
setter.to_csv('C:\\...\\setter.csv',encoding='utf-8-sig')

 

์ค‘๊ฐ„์— ๋ฆฌ๋ฒ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์€ ํ›„ ๋‹ค๋ฅธ ํฌ์ง€์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ๋•Œ ํฌ์ง€์…˜์„ ๋ชจ๋‘ Li ๋กœ ์„ค์ •ํ•˜๋Š” ์‹ค์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ํŠน์„ฑ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

ํ•œ ์นผ๋Ÿผ์˜ ๋ชจ๋“  ๊ฐ’์„ ๋ฐ”๊ฟ€ ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด DataFrame[column] = value ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

left["pos"] = "L"

 

์•„๋ฌดํŠผ ์ด์ œ ๊ฐ ํฌ์ง€์…˜ ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด ํฌ์ง€์…˜๋“ค์„ ๋ชจ๋‘ ํ•ฉ์ณ์„œ ์„ ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

data ๋ผ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์— ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„๋“ค์„ ์ €์žฅํ•˜๊ณ  ํŒ๋‹ค์Šค์˜ concat() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ–‰ ๋ฐฉํ–ฅ์œผ๋กœ ํ•ฉ์ณค๋‹ค.

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๋ณ„๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ignore_index ์†์„ฑ์„ True ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์„œ ๊ฐ ์ธ๋ฑ์Šค๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ํ–ˆ๋‹ค.

์ด ๋•Œ ๊ฐ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์ปฌ๋Ÿผ์ด ๋‹ค๋ฅด๋ฉด ์ปฌ๋Ÿผ ๋ถ€๋ถ„์— ๋‹ค๋ฅธ ์ปฌ๋Ÿผ์ด ์ถ”๊ฐ€๋˜๊ณ  ๊ฐ’์ด ์—†๋Š” ์ปฌ๋Ÿผ์€ ๋นˆ ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

data = [libero,left,right,center,setter]
player = pd.concat(data,ignore_index=True)
player.index += 1

player.to_csv('C:\\...\\player.csv',encoding='utf-8-sig')

 

 

์„ ์ˆ˜ ๋ฐ์ดํ„ฐ์ธ player.csv ํŒŒ์ผ์„ ๋ณด๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž˜ ํ•ฉ์ณ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ด๋ฒˆ์—๋Š” ์ด๋ ‡๊ฒŒ ํ”„๋กœ์ ํŠธ์— ์“ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋‹ค๋ค„๋ณด์•˜๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ค„ ๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

 

728x90
Comments