๐ŸŒฑ โ†’ ๐ŸŒณ

๋ชจ๊ฐ์ฝ” ํŒŒ์ด์ฌ ํฌ๋กค๋ง 14์ผ์ฐจ ๋ณธ๋ฌธ

Server/Python

๋ชจ๊ฐ์ฝ” ํŒŒ์ด์ฌ ํฌ๋กค๋ง 14์ผ์ฐจ

thals0 2022. 4. 8. 17:02
728x90

#14. ๋™์  ํฌ๋กค๋ง โ‘ฃ

๐Ÿ“Œ ํฌ๋กค๋ง ๋Œ€์ƒ ์‚ฌ์ดํŠธ ์‚ดํŽด๋ณด๊ธฐ

์ฝ”๋ฎค๋‹ˆํ‹ฐ ์นดํŽ˜์— ์ ‘์†ํ•˜์—ฌ ์‹ ๊ทœ ํšŒ์› ๊ฒŒ์‹œํŒ์˜ ๋‚ด์šฉ ์ˆ˜์ง‘ 

 

1๏ธโƒฃ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

 

๐Ÿ‘‰ [๋„ค์ด๋ฒ„: ๋กœ๊ทธ์ธ]

 

๊ทธ๋ฆผ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ, ์•„์ด๋”” ์ž…๋ ฅ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์ˆœ์„œ๋กœ ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ธฐ์กด์—๋Š” ์ž๋™์œผ๋กœ ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•ด, send_keys ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ์ง€๋งŒ

๋„ค์ด๋ฒ„๋Š” ์ž๋™ํ™” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ง‰๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,

send_keys ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด

์•„๋ž˜์™€ ๊ฐ™์ด ์ž๋™์ž…๋ ฅ๋ฐฉ์ง€ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ, selenium์—์„  execute_script๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ž…๋ ฅ๋ฐ›์€ JavaScript ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

driver.execute_script("JS ์Šคํฌ๋ฆฝํŠธ")

 

์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์œผ๋‹ˆ, 

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์˜ ํƒœ๊ทธ๋งŒ ์•Œ์•„๋ณด์•˜๋‹ค. 

 

ํƒœ๊ทธ๋Š” button, class๋Š” btn_login์ด์ง€๋งŒ id๊ฐ’์ด log.login์ด๋‹ค.

 

์‹ค์ œ ํƒœ๊ทธ์™€ ์„ ํƒ์ž ์กฐํ•ฉ์€ button#log.login.btn_login์ด์ง€๋งŒ

selenium์—์„œ๋Š” ์ ( . )์„ ํด๋ž˜์Šค๋กœ ์—ฌ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—,

์„ ํƒ์ž์™€ ํƒœ๊ทธ ์กฐํ•ฉ์— log.login์ด๋ผ๋Š” id๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.

 

์ด ๊ฒฝ์šฐ find_element ํ•จ์ˆ˜์—์„œ By.CSS_SELECTOR ๋Œ€์‹  By.ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

driver.find_element(By.ID, "id")

 

css selector๊ฐ€ ํƒœ๊ทธ์™€ ์„ ํƒ์ž ์กฐํ•ฉ์„ ์ธ์ž๋กœ ๋ฐ›์•˜๋‹ค๋ฉด,

id๋Š” ๋ง ๊ทธ๋Œ€๋กœ id๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

id๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ์œ ์ผํ•œ ์š”์†Œ๋ผ๋Š”๊ฑธ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

2๏ธโƒฃ ์‹ ๊ทœํšŒ์› ๊ฒŒ์‹œํŒ์˜ id

 

๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด, ์ฝ”๋ฎค๋‹ˆํ‹ฐ์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://cafe.naver.com/codeuniv

 

์‹ ๊ทœ ํšŒ์› ๊ฒŒ์‹œํŒ ๋ฒ„ํŠผ์˜ ํƒœ๊ทธ์™€ ์„ ํƒ์ž๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด,

 

 

 

์‹ ๊ทœ ํšŒ์› ๊ฒŒ์‹œํŒ ๋˜ํ•œ menuLink90์ด๋ผ๋Š” id๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์นœ๊ตฌ ์—ญ์‹œ find_element ํ•จ์ˆ˜์— By.ID๋ฅผ ์ด์šฉํ•ด

์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

3๏ธโƒฃ ๊ฒŒ์‹œ๊ธ€์˜ XPath

 

์ด์ œ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์„ ํด๋ฆญํ•ด์„œ ๊ธ€์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•ด ๋ด์•ผํ•˜๋Š”๋ฐ

์ด๋ฒˆ์—๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์˜ ํƒœ๊ทธ๋‚˜ ์„ ํƒ์ž ๋ง๊ณ  XPath๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค.

 

XPath๋ž€, ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ ์ตœ ์ƒ๋‹จ๋ถ€ํ„ฐ ํƒœ๊ทธ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€, 

ํ•ด๋‹น html ์š”์†Œ๊ฐ€ ์–ด๋””์— ์กด์žฌ ํ•˜๋Š” ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ๋กœ์˜ ์ผ์ข…

 

์‹ค์ œ๋กœ, ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์˜ XPath๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

/html/body/div[1]/div/div[4]/table/tbody/tr[1]/td[1]/div[3]/div/a

html ํƒœ๊ทธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, body, div[1], ...๋ฅผ ํƒ€๊ณ  ๊ฐ€๋‹ค ๋ณด๋ฉด,

๋งˆ์ง€๋ง‰ aํƒœ๊ทธ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์„ ์˜๋ฏธ

 

์ด ๋˜ํ•œ selenium์˜ find_elementํ•จ์ˆ˜์˜ By.XPATH๋ฅผ ํ†ตํ•ด

HTML ์š”์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4๏ธโƒฃ ๊ฒŒ์‹œ๋ฌผ์˜ ํƒœ๊ทธ

ํƒœ๊ทธ๋Š” div์ด๊ณ , se-module, se-module-text๋ผ๋Š” ๋‘ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๐Ÿ“Œ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑ

1๏ธโƒฃ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import

# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

 

2๏ธโƒฃ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ ‘์†

chrome_driver = ChromeDriverManager().install()
service = Service(chrome_driver)
driver = webdriver.Chrome(service=service)

# ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ ‘์†
login_url = 'https://nid.naver.com/nidlogin.login'
driver.get(login_url)

# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(2)

3๏ธโƒฃ ์•„์ด๋”” & ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ

 

๋„ค์ด๋ฒ„์— ๋กœ๊ทธ์ธํ•  ๊ฒฝ์šฐ 'send_keys()' ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ 

'execute_script()' ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

# ๋ณธ์ธ์˜ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ๊ฐ ๋ณ€์ˆ˜์— ์ €์žฅ
# ex) ์•„์ด๋”” : comu, ๋น„๋ฐ€๋ฒˆํ˜ธ : 12345
my_id = 'comu'
my_pw = '12345'

# ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
driver.execute_script("document.getElementsByName('id')[0].value = \\'" + my_id + "\\'")
driver.execute_script("document.getElementsByName('pw')[0].value = \\'" + my_pw + "\\'")

# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(1)

execute_script ํ•จ์ˆ˜์— ์ ์–ด๋‘” document.~~ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•

 

ํŒŒ์ด์ฌ์—์„œ ๊ฐ’์„ ๋„˜๊ฒจ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ,

๋ธŒ๋ผ์šฐ์ €์—์„œ JS๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด์•ˆ์„ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

 

4๏ธโƒฃ '๋กœ๊ทธ์ธ' ๋ฒ„ํŠผ ํด๋ฆญ

# '๋กœ๊ทธ์ธ' ๋ฒ„ํŠผ ํด๋ฆญ
button = driver.find_element(By.ID, 'log.login')
button.click()
# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(1)

 

5๏ธโƒฃ ์ฝ”๋ฎค๋‹ˆํ‹ฐ ์ ‘์†

 

๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์ฝ”๋ฎค๋‹ˆํ‹ฐ๋กœ ์ ‘์†

'get()' ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๋™ํ™”๋œ ํฌ๋กฌ ์ฐฝ์„ ์ด๋™ ์‹œ์ผœ ์ฃผ์—ˆ๋‹ค. 

# ์ฝ”๋ฎค๋‹ˆํ‹ฐ ์ ‘์†
comu_url = 'https://cafe.naver.com/codeuniv'
driver.get(comu_url)
# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(1)

 

6๏ธโƒฃ '์‹ ๊ทœํšŒ์›๊ฒŒ์‹œํŒ' ํด๋ฆญ

# '์‹ ๊ทœํšŒ์›๊ฒŒ์‹œํŒ' ํด๋ฆญ
menu = driver.find_element(By.ID, 'menuLink90')
menu.click()
# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(1)

 

7๏ธโƒฃ ํ”„๋ ˆ์ž„ ์ „ํ™˜

ํฌ๋กค๋ง์„ ํ•˜๋‹ค ๋ณด๋ฉด, ๋ถ„๋ช…ํžˆ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ํ™”๋ฉด์— ์žˆ๊ณ ..

HTML ์ฝ”๋“œ์—์„œ๋„ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š”๋ฐ,

ํŒŒ์ด์ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์—†๊ฑฐ๋‚˜, ํฌ๋กค๋ง์ด ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ•œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์นดํŽ˜๊ฐ€ ๋ฐ”๋กœ ์œ„์˜ ๊ฒฝ์šฐ์ธ๋ฐ์š”!

์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋จผ์ € ํ”„๋ ˆ์ž„์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

 

ํ”„๋ ˆ์ž„์€ HTML ๋‚ด๋ถ€์— ๋˜ ๋‹ค๋ฅธ HTML์„ ์ง‘์–ด๋„ฃ์–ด ๋‘” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๊ฐœ๋ฐœ์ž ๋„๊ตฌ(ctrl F)์—์„œ iframe์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋„ค์ด๋ฒ„ ์นดํŽ˜๊ฐ€ ํ”„๋ ˆ์ž„์œผ๋กœ ๊ตฌ์„ฑ๋œ ์›นํŽ˜์ด์ง€ ์˜€๋Š”์ง€ ํ™•์ธ

 

ํ”„๋ ˆ์ž„์œผ๋กœ ๊ตฌ์„ฑ๋œ ์›น ํŽ˜์ด์ง€๋ฅผ ํฌ๋กค๋งํ•˜๊ธฐ ์œ„ํ•ด์„ 

selenium์˜ ํƒ์ƒ‰ ์œ„์น˜๋ฅผ ํ”„๋ ˆ์ž„ ๋‚ด๋ถ€๋กœ ์ „ํ™˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€, switch_to.frame ์ด๋‹ค.

 

driver.switch_to.frame("ํ”„๋ ˆ์ž„์˜ ์ด๋ฆ„")

 

์„ ํƒ์ž ์ค‘ 'name'์„ ์‚ฌ์šฉํ•˜์—ฌ selenium์˜ ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ ์ฃผ์—ˆ๋‹ค. 

# ํ”„๋ ˆ์ž„ ์ „ํ™˜
driver.switch_to.frame('cafe_main')
# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(1)

 

8๏ธโƒฃ ์ฒซ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ ํด๋ฆญ

xpath = "/html/body/div[1]/div/div[4]/table/tbody/tr[1]/td[1]/div[3]/div/a"

# ์ฒซ๋ฒˆ์งธ ๊ธ€ ํด๋ฆญ
writing = driver.find_element(By.XPATH, xpath)
writing.click()
# ์‹œ๊ฐ„์  ์—ฌ์œ  ์›ํ•˜๋Š” ๋งŒํผ
time.sleep(1)

 

9๏ธโƒฃ ๊ธ€ ๋‚ด์šฉ ์ถœ๋ ฅ

# ๊ธ€ ๋‚ด์šฉ ์ถœ๋ ฅ
content = driver.find_element(By.CSS_SELECTOR, "div.se-component-content").text
print(content)
# ํฌ๋กฌ ์ฐฝ ๋‹ซ๊ธฐ
driver.close()

 

๐Ÿ“Œ ์ตœ์ข… ์ฝ”๋“œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

chrome_driver = ChromeDriverManager().install()
service = Service(chrome_driver)
driver = webdriver.Chrome(service=service)

login_url = "https://nid.naver.com/nidlogin.login"
driver.get(login_url)

time.sleep(2)

my_id = "comu"
my_pw = "12345"

driver.execute_script("document.getElementsByName('id')[0].value = '" + my_id + "'")
driver.execute_script("document.getElementsByName('pw')[0].value = '" + my_pw + "'")

time.sleep(1)

button = driver.find_element(By.ID, "log.login")
button.click()
time.sleep(1)

comu_url = "https://cafe.naver.com/codeuniv"
driver.get(comu_url)
time.sleep(1)

menu = driver.find_element(By.ID, "menuLink90")
menu.click()
time.sleep(1)

driver.switch_to.frame("cafe_main")
time.sleep(1)

xpath = "/html/body/div[1]/div/div[4]/table/tbody/tr[1]/td[1]/div[3]/div/a"

writing = driver.find_element(By.XPATH, xpath)
writing.click()
time.sleep(1)

content = driver.find_element(By.CSS_SELECTOR, "div.se-component-content").text
print(content)

driver.close()

 

๐Ÿ‘‰ ์‹คํ–‰ ๊ฒฐ๊ณผ

 

 

 

 

 

โ€‹โญ์ •๋ฆฌํ•˜๊ธฐโญ

โœ” 'execute_script()' ํ•จ์ˆ˜

โœ” XPath

โœ” ํ”„๋ ˆ์ž„ ์ „ํ™˜

 

728x90