profile-img
The merit of an action lies in finishing it to the end.
slide-image

๋ฌดํ•œ์Šคํฌ๋กค ํŽ˜์ด์ง€์—์„œ ํฌ๋กค๋ง์„ ํ•  ์ผ์ด ์ƒ๊ฒผ๋‹ค.

๋ฌดํ•œ์Šคํฌ๋กค ํŽ˜์ด์ง€์—์„œ ํ•ญ๋ชฉ์˜ ๋ชฉ๋ก์„ ๋ชจ๋‘ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šคํฌ๋กค ๋ฐ”๋ฅผ ๋งจ ๋๊นŒ์ง€ ๋‚ด๋ ค์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€๋ฅผ ๋‚ด๋ ค๋„ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์ด ๋กœ๋”ฉ๋˜๋Š” ๋ฌดํ•œ์Šคํฌ๋กค ์›นํŽ˜์ด์ง€์—์„œ ์Šคํฌ๋กค ๋ฐ”๋ฅผ ๊ณ„์†ํ•ด์„œ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

 

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, Keys.PAGE_DOWN๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. ํ•„์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

 

2. Keys.PAGE_DOWN์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋งจ ๋์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์Šคํฌ๋กค ๋ฐ”๋ฅผ ๋‚ด๋ฆฐ๋‹ค.

last_count = len(driver.find_elements(By.CSS_SELECTOR, 'a.contents__title'))  # ํ˜„์žฌ ํŽ˜์ด์ง€์— ๋กœ๋“œ๋œ ๋ฆฌ๋ทฐ ๋งํฌ ์ˆ˜

while True:
    body = driver.find_element(By.TAG_NAME, 'body')
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(1)

    new_count = len(driver.find_elements(By.CSS_SELECTOR, 'a.contents__title'))
        
    # ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๋งํฌ๊ฐ€ ๋” ์ด์ƒ ๋กœ๋“œ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ข…๋ฃŒ
    if new_count == last_count:
        print("๋” ์ด์ƒ ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
        break
    
    last_count = new_count  # ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ

 

body = driver.find_element(By.TAG_NAME, 'body')๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ body๋ฅผ ์„ ํƒํ•œ ์ดํ›„, send_keys ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ page down ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์ค€๋‹ค.

์ด๋•Œ, ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ณ„์†ํ•ด์„œ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ๋ฃจํ”„ ํƒˆ์ถœ ์กฐ๊ฑด์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋‚˜๋Š” ์Šคํฌ๋กค์„ ๋‚ด๋ ค๋„ content์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์˜€๋‹ค.

time.sleep(1)์€ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์— ๋”œ๋ ˆ์ด๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ค์ •ํ•œ ๊ฐ’์ด๋‹ค.

 

'CS study/ํŒŒ์ด์ฌ ๊ธฐ์ดˆ' Related Articles +

class & self

class(ํด๋ž˜์Šค)๋ž€, ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์ด ํ•จ๊ป˜ ๋ฌถ์—ฌ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ‹€์ด๋‹ค. ์ด ํ‹€์„ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ object(๊ฐ์ฒด)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š” ๋…๋ฆฝ์ ์ด์–ด์„œ ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด์ž.

ํด๋ž˜์Šค๋Š” ์ดˆ์ฝœ๋ฆฟ์„ ๋งŒ๋“œ๋Š” ํ‹€๊ณผ ๊ฐ™๋‹ค. ๋…น์€ ์ดˆ์ฝœ๋ฆฟ์„ ํ‹€์— ๋ถ€์–ด ์ดˆ์ฝœ๋ฆฟ์„ ๋ฌดํ•œ์ • ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ‹€๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ๊ฐ์˜ ์ดˆ์ฝœ๋ฆฟ์„ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ๊ฐ์˜ ์ดˆ์ฝœ๋ฆฟ์€ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ ์ดˆ์ฝœ๋ฆฟ์— ์–ด๋–ค ๋ฐ์ฝ”๋ ˆ์ด์…˜์„ ์˜ฌ๋ฆฌ๋”๋ผ๋„ ๋‹ค๋ฅธ ์ดˆ์ฝœ๋ฆฟ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค. ์ผ๊ธฐ์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ผ๊ธฐ์žฅ์„ ๋งŒ๋“ค์–ด์ค„ ๋•Œ ์ด๊ฑธ ์ผ์ผ์ด ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์‹œ๊ฐ„๋‚ญ๋น„, ๊ทธ๋ฆฌ๊ณ  ์ž์›๋‚ญ๋น„(!)์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํด๋ž˜์Šค์™€ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

class chocoMaker:
	pass
    
a = chocoMaker() # a ๊ฐ์ฒด ์ƒ์„ฑ
b = chocoMaker() # b ๊ฐ์ฒด ์ƒ์„ฑ

์•„์ง chocoMaker๋ผ๋Š” ํด๋ž˜์Šค์— ์•„๋ฌด ๊ฐ’์ด๋‚˜ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.

ํด๋ž˜์Šค์— ํ•จ์ˆ˜๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

class chocoMaker:
    def decorate(self, color, type):
    	self.color = color
        self.type = type
        
a = chocoMaker()
a.decorate('white', 'sprinkle')

ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜๋Š” method(๋ฉ”์„œ๋“œ)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋Œ€๊ฐœ self๋ฅผ ์“ด๋‹ค. self์˜ ์—ญํ• ์€ ๊ฐ์ฒด ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด.๋ฉ”์„œ๋“œ(...) ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜€๋˜ self๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๊ฐ์ฒด.๋ฉ”์„œ๋“œ(...)์—์„œ ๊ฐ์ฒด๊ฐ€ self๋กœ ์ž๋™์œผ๋กœ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ ์ด ๋ฐฉ๋ฒ•์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค.

a = chocoMaker()
chocoMaker.decorate(a, 'white', 'sprinkle')

decorate ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰๋ฌธ์„ ์‚ดํŽด๋ณด์ž.

a.decorate('white', 'sprinkle')๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด, a๋ผ๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์— color, type ๊ฐ์ฒด๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , 'white', 'sprinkle'๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

ํด๋ž˜์Šค๋กœ ๋งŒ๋“  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ์ฒด ๊ฐ„์—” ๋…๋ฆฝ์„ฑ์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ, ํ•œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๊ฐ์ฒด๋ณ€์ˆ˜ ๊ฐ’์ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

 

init/์ƒ์„ฑ์ž

chocoMaker ํด๋ž˜์Šค์— ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

class chocoMaker:
    def decorate(self, color, type):
    	self.color = color
        self.type = type
    def plate(self):
    	res = self.color + self.type
        return res

plate ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

b = chocoMaker()
b.plate()

์ด์œ ๋Š” ์•ž์„œ ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ decorate ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋Š” plate ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ decorate ์ˆ˜ํ–‰ ํ›„ plate๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋ฉด ๋ถˆํŽธํ•˜๋‹ค. ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ?

์šฐ๋ฆฌ๋Š” ์ด๋Ÿด ๋•Œ ์ƒ์„ฑ์ž(constructor)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. __init__์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

class chocoMaker:
    def __init__(self, color, type):
        self.color = color
        self.type = type
    def decorate(self, color, type):
    	self.color = color
        self.type = type
    def plate(self):
    	res = self.color + self.type
        return res

c = chocoMaker('pink', 'decopen')

c๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, decorate๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ํ•„์š” ์—†์ด chocoMaker์™€ ํ•จ๊ป˜ ์›ํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ƒ์†

์ฝ”๋“œ๋ฅผ ์งœ๋‹ค ๋ณด๋ฉด ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ–๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ‰๊น”๊ณผ ๋ฐ์ฝ”๋ ˆ์ด์…˜์˜ ์ข…๋ฅ˜๋งŒ์„ ๊ฐ–๋Š” chocoMaker ํด๋ž˜์Šค์—์„œ ๋ฐ์ฝ”๋ ˆ์ด์…˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ธฐ์กด์˜ chocoMaker ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“œ๋Š” ํŽธ์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๋‹ค. ์ด๋Ÿด ๋•Œ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด super().__init__๋ฅผ ์ด์šฉํ•œ ์ƒ์†์ด๋‹ค.

class superChocoMaker(chocoMaker):
    def __init__(self, color, type, num): # num ์ถ”๊ฐ€
        super().__init__(color, type)
        self.num = num
        
    def superPlate(self): # ๊ธฐ์กด ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†
        super().plate()

ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํด๋ž˜์Šค ์˜† ๊ด„ํ˜ธ ์•ˆ์— ์ƒ์†ํ•  ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ ์–ด๋‘” ๋‹ค์Œ, super().__init__์˜ input์œผ๋กœ ์ƒ์†ํ•  ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์š”์†Œ์˜ ์ด๋ฆ„์„ ์ ์–ด์ค€๋‹ค.

๋•Œ๋กœ๋Š” ์ƒˆ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค์—์„œ ๊ธฐ์กด์˜ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ์—๋Š” ๊ทธ๋ƒฅ ์ƒ์†๋ฐ›์€ (์ƒˆ๋กœ ๋งŒ๋“ ) ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

๊ธฐ์กด ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ๋Š” super().๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

'CS study/ํŒŒ์ด์ฌ ๊ธฐ์ดˆ' Related Articles +
1