Study_note(zb_data)/EDA
์คํฐ๋ ๋ ธํธ (BeautifulSoup + selenium)
KloudHyun
2023. 8. 14. 01:40
๐ BeautifulSoup + selenium
https://www.opinet.co.kr/searRgSelect.do
์ผ ์ฃผ์ ์ ์ฐพ๊ธฐ ์คํผ๋ท
www.opinet.co.kr
๐ฉ ๋ชฉํ ๋ฐ์ดํฐ
- ๋ธ๋๋
- ๊ฐ๊ฒฉ
- ์ ํ ์ฃผ์ ์ฌ๋ถ
- ์์น
๐ฉ selenium ์ผ๋ก ์ ๊ทผํ๊ธฐ
### selenium์ผ๋ก ์ ๊ทผ
from selenium import webdriver
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome()
driver.get(url)
๐ฉ ํ์ ์ฐฝ ํ๋ฉด ์ ํ ํ ๋ซ์์ฃผ๋ ๋ฐฉ๋ฒ - ์ฌ์์ฒญ
# ํ์
์ฐฝ ํ๋ฉด ์ ํ ํ ๋ซ์์ฃผ๊ธฐ
import time
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome()
driver.get(url)
time.sleep(5)
# ํ์
์ฐฝ์ผ๋ก ์ ํ
driver.switch_to_window(driver.window_handles[-1])
# ํ์์ฐฝ ๋ซ์์ฃผ๊ธฐ
driver.close()
# ๋ฉ์ธ ํ๋ฉด ์ฐฝ ์ ํ
driver.switch_to_window(driver.window_handles[-1])
# ์ ๊ทผ url ์ฌ์์ฒญ
driver.get(url)
๐ฉ ์/๋ ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
- ์ฌ์ดํธ ํ์ธํด๋ณด๋ฉด ์ or ๋๋ฅผ ์ ํํด์ผํ๋ ๋ฒํผ์ด ์๋ค
- ๋ฒํผ์ ์์ค๋ฅผ ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ํ์ธํด๋ณด์
# ์ง์ญ : ์/๋
sido_list_raw = driver.find_element(By.ID, 'SIDO_NM0')
sido_list_raw
>>>>
<selenium.webdriver.remote.webelement.WebElement (session="879ddded5355d220345ff8dcdf185802", element="868E43D9EDC6FA4D08A403C8D0EDD5E2_element_124")>
- ๊ฒฐ๊ณผ ๊ฐ์ด ์ด์ํด์ text๋ก ํ์ธํด๋ณด๋ ๋ฐ์ดํฐ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธ์ด ๊ฐ๋ฅ
sido_list = sido_list_raw.find_elements(By.TAG_NAME, 'option')
# SIDO_NM0 ์์ ์๋ option Tag๋ฅผ ํ์ธ
sido_list[1].text
# 1๋ฒ์งธ index ํ์ธ
>>>>
'์์ธ'
sido_list[1].get_attribute("value")
# option ํ๊ทธ์ ์์ธ๋ก ํ๊ธฐ๋์ด ์๋ ๊ฒ์ ํ์ธํ ๋ค get_attribute ๋ก class "value" ๊ฐ์ ํ์ธ
>>>>
'์์ธํน๋ณ์'
๐ฉ ์/๋ ์ด๋ฆ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
# 1
sido_names = [] # ๋น ๋ฆฌ์คํธ ์์ฑํ๊ธฐ
for option in sido_list: # ์/๋ ๋ฆฌ์คํธ
sido_name = option.get_attribute('value') # ํ๊ฐ์ฉ ๊ฐ์ ๋นผ์ค๋ฉด์ sido_name์ ํ ๋นํ๋ค
sido_names.append(sido_name) # ํ ๋นํ ๊ฐ์ sido_names ๊ฐ์ append
sido_names # ๊ฒฐ๊ณผ ๊ฐ ์ถ๋ ฅ
>>>>
['',
'์์ธํน๋ณ์',
'๋ถ์ฐ๊ด์ญ์',
'๋๊ตฌ๊ด์ญ์',
'์ธ์ฒ๊ด์ญ์',
'๊ด์ฃผ๊ด์ญ์',
'๋์ ๊ด์ญ์',
'์ธ์ฐ๊ด์ญ์',
'์ธ์ข
ํน๋ณ์์น์',
'๊ฒฝ๊ธฐ๋',
'์ถฉ์ฒญ๋ถ๋',
'์ถฉ์ฒญ๋จ๋',
'์ ๋ผ๋ถ๋',
'์ ๋ผ๋จ๋',
'๊ฒฝ์๋ถ๋',
'๊ฒฝ์๋จ๋',
'์ ์ฃผํน๋ณ์์น๋',
'๊ฐ์ํน๋ณ์์น๋']
# 2
sido_names = [option.get_attribute('value') for option in sido_list]
>>>>
['',
'์์ธํน๋ณ์',
'๋ถ์ฐ๊ด์ญ์',
'๋๊ตฌ๊ด์ญ์',
'์ธ์ฒ๊ด์ญ์',
'๊ด์ฃผ๊ด์ญ์',
'๋์ ๊ด์ญ์',
'์ธ์ฐ๊ด์ญ์',
'์ธ์ข
ํน๋ณ์์น์',
'๊ฒฝ๊ธฐ๋',
'์ถฉ์ฒญ๋ถ๋',
'์ถฉ์ฒญ๋จ๋',
'์ ๋ผ๋ถ๋',
'์ ๋ผ๋จ๋',
'๊ฒฝ์๋ถ๋',
'๊ฒฝ์๋จ๋',
'์ ์ฃผํน๋ณ์์น๋',
'๊ฐ์ํน๋ณ์์น๋']
sido_names = sido_names[1:] # ๋งจ ์ ๋น์ด์๋ ๊ฐ ์ง์ฐ๊ธฐ
sido_names
>>>>
['์์ธํน๋ณ์',
'๋ถ์ฐ๊ด์ญ์',
'๋๊ตฌ๊ด์ญ์',
'์ธ์ฒ๊ด์ญ์',
'๊ด์ฃผ๊ด์ญ์',
'๋์ ๊ด์ญ์',
'์ธ์ฐ๊ด์ญ์',
'์ธ์ข
ํน๋ณ์์น์',
'๊ฒฝ๊ธฐ๋',
'์ถฉ์ฒญ๋ถ๋',
'์ถฉ์ฒญ๋จ๋',
'์ ๋ผ๋ถ๋',
'์ ๋ผ๋จ๋',
'๊ฒฝ์๋ถ๋',
'๊ฒฝ์๋จ๋',
'์ ์ฃผํน๋ณ์์น๋',
'๊ฐ์ํน๋ณ์์น๋']
๐ฉ ์/๋ ์ด๋ฆ ํค ๊ฐ ๋ณด๋ด๊ธฐ
sido_list_raw.send_keys(sido_names[0])
๐ฉ ๊ตฌ ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
# ๊ตฌ
gu_list_law = driver.find_element(By.ID, 'SIGUNGU_NM0')
gu_list_law.text
- ์/๋ ์ด๋ฆ ๊ตฌํ ๋ ์ฒ๋ผ get_attributes ํ์ฉ
gu_list = gu_list_law.find_elements(By.TAG_NAME, 'option')
gu_list[1].text, len(gu_list)
>>>>
('๊ฐ๋จ๊ตฌ', 26)
gu_list[1].get_attribute('value')
>>>>
'๊ฐ๋จ๊ตฌ'
๐ฉ ๊ตฌ ์ด๋ฆ ๋ฆฌ์คํธํ
gu_names = [option.get_attribute('value') for option in gu_list]
gu_names
>>>>
['',
'๊ฐ๋จ๊ตฌ',
'๊ฐ๋๊ตฌ',
'๊ฐ๋ถ๊ตฌ',
'๊ฐ์๊ตฌ',
'๊ด์
๊ตฌ',
'๊ด์ง๊ตฌ',
'๊ตฌ๋ก๊ตฌ',
'๊ธ์ฒ๊ตฌ',
'๋
ธ์๊ตฌ',
'๋๋ด๊ตฌ',
'๋๋๋ฌธ๊ตฌ',
'๋์๊ตฌ',
'๋งํฌ๊ตฌ',
'์๋๋ฌธ๊ตฌ',
'์์ด๊ตฌ',
'์ฑ๋๊ตฌ',
'์ฑ๋ถ๊ตฌ',
'์กํ๊ตฌ',
'์์ฒ๊ตฌ',
'์๋ฑํฌ๊ตฌ',
'์ฉ์ฐ๊ตฌ',
'์ํ๊ตฌ',
'์ข
๋ก๊ตฌ',
'์ค๊ตฌ',
'์ค๋๊ตฌ']
gu_names = gu_names[1:]
gu_names
>>>>
['๊ฐ๋จ๊ตฌ',
'๊ฐ๋๊ตฌ',
'๊ฐ๋ถ๊ตฌ',
'๊ฐ์๊ตฌ',
'๊ด์
๊ตฌ',
'๊ด์ง๊ตฌ',
'๊ตฌ๋ก๊ตฌ',
'๊ธ์ฒ๊ตฌ',
'๋
ธ์๊ตฌ',
'๋๋ด๊ตฌ',
'๋๋๋ฌธ๊ตฌ',
'๋์๊ตฌ',
'๋งํฌ๊ตฌ',
'์๋๋ฌธ๊ตฌ',
'์์ด๊ตฌ',
'์ฑ๋๊ตฌ',
'์ฑ๋ถ๊ตฌ',
'์กํ๊ตฌ',
'์์ฒ๊ตฌ',
'์๋ฑํฌ๊ตฌ',
'์ฉ์ฐ๊ตฌ',
'์ํ๊ตฌ',
'์ข
๋ก๊ตฌ',
'์ค๊ตฌ',
'์ค๋๊ตฌ']
๐ฉ ๊ตฌ ์ด๋ฆ ํค ๊ฐ ๋ณด๋ด๊ธฐ
gu_list_law.send_keys(gu_names[3])
๐ฉ ๋ฐ์ดํฐ ์์ ๋ก ์ ์ฅํ๊ธฐ
- ์์ ์ ์ฅ ํ์ธ ๋ฐ html ์์ค ํ์ธํ๊ธฐ
# ์์
์ ์ฅ
elements_save_excel = driver.find_element(By.ID, 'glopopd_excel').click()
- for๋ฌธ ์ฌ์ฉํ๊ธฐ
import time
from tqdm import tqdm_notebook
for gu in tqdm_notebook(gu_names): # gu_names list
element = driver.find_element(By.ID, 'SIGUNGU_NM0') # ์ฒ์ selectํ ๊ณณ ์ง์
element.send_keys(gu) # gu name์ ํ๋์ฉ ์ง์
time.sleep(3) # 3์ด ๋๊ธฐ
elements_save_excel = driver.find_element(By.ID, 'glopopd_excel').click() # ์์
์ ์ฅ ํด๋ฆญ
time.sleep(3) # 3์ด ๋๊ธฐ
# gu_names์ list๊ฐ ๋๋ ๋๊น์ง ์งํ