[ํ”„๋กœ์ ํŠธ] (1) ๐Ÿ‘พ ๋„ค์ด๋ฒ„ ์ง€๋„ ํฌ๋กค๋งํ•˜๊ธฐ

jeeenyยท2025๋…„ 5์›” 9์ผ

โœ…ย ํฌ๋กค๋ง ๋ชฉ์ 

ํ•œ๋ผ๋ชจ์•„์—์„œ๋Š” ์‹๋‹น ์ถ”์ฒœ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์‹๋‹น ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • ์‹๋‹น์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ, ์˜์—… ์‹œ๊ฐ„, ๋ฉ”๋‰ด์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋‚จ์€ ์˜ˆ์‚ฐ ๋‚ด์—์„œ ์ ์ ˆํ•œ ์‹๋‹น์„ ์ถ”์ฒœํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ‰๊ท  ์Œ์‹ ๊ฐ€๊ฒฉ์ด๋ผ๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋„ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € ๊ณต๊ณต๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋ณด์•˜์œผ๋‚˜ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋„ค์ด๋ฒ„ ์ง€๋„์—์„œ ํฌ๋กค๋ง์„ ํ†ตํ•ด ์‹๋‹น ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํ™œ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

โœ…ย ํฌ๋กค๋งํ•  ๋ฐ์ดํ„ฐ

๊ฐ€๊ฒŒ ์ƒ์„ธ ์ •๋ณด

  • ๊ฐ€๊ฒŒ๋ช…
  • ์Œ์‹ ์ข…๋ฅ˜
  • ๊ฐ€๊ฒŒ ์ฃผ์†Œ
  • ๋Œ€ํ‘œ ์ด๋ฏธ์ง€
  • ์˜์—…์‹œ๊ฐ„
    • ์š”์ผ
    • ์‹œ๊ฐ„
  • ํ‰๊ท  ๊ฐ€๊ฒฉ
  • ๋ฉ”๋‰ด๋“ค
    • ๋ฉ”๋‰ด ์ด๋ฆ„
    • ๋ฉ”๋‰ด ์†Œ๊ฐœ
    • ๋ฉ”๋‰ด ์ด๋ฏธ์ง€
    • ๊ฐ€๊ฒฉ
    • ๋Œ€ํ‘œ ์—ฌ๋ถ€

โœ…ย ํฌ๋กค๋ง ๋„๊ตฌ ์„ ํƒ : Selenium

ํฌ๋กค๋ง์—๋Š” ์ •์  ํฌ๋กค๋ง๊ณผ ๋™์  ํฌ๋กค๋ง์ด ์žˆ๋‹ค. ๋„ค์ด๋ฒ„ ์ง€๋„์—์„œ ์‹๋‹น ์ •๋ณด๋ฅผ ์ƒ์„ธํžˆ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒ€์ƒ‰ํ•œ ์‹๋‹น์„ โ€œํด๋ฆญโ€ํ•˜๊ณ , ๋ฉ”๋‰ด๋ฅผ ๋ณด๋ ค๋ฉด ๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ โ€œํด๋ฆญโ€ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๋“ฏ ๋„ค์ด๋ฒ„ ์ง€๋„๋Š” ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์— ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋‚˜์™€์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ํฌ๋กค๋ง์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ Selenium์„ ์ด์šฉํ•˜๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™์œผ๋กœ ์ œ์–ดํ•˜์—ฌ ๋™์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โœ…ย ๋„ค์ด๋ฒ„ ์ง€๋„ Iframe ๋ถ„์„

Iframe : ์›น ํŽ˜์ด์ง€ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์›น ํŽ˜์ด์ง€๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” HTML ์š”์†Œ

โ€œ์ถฉ๋ฌด๋กœ ์Œ์‹์ โ€์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์‹๋‹น ์ •๋ณด๋“ค์ด ์ฃผ๋ฅด๋ฅต ๋‚˜์—ด๋˜๊ณ , ๊ฐ๊ฐ์˜ ์‹๋‹น์„ ๋ˆŒ๋Ÿฌ ์‹๋‹น์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋“ค์€ ๊ฐ๊ฐ searchIframe, entryIframe์ด๋ผ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ Iframe ๋‚ด์— ์œ„์น˜ํ•œ๋‹ค.

์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํƒœ๊ทธ์— ์–ด๋–ค HTML ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•ด๋ณด์ž.

  • searchIframe : ๊ฐ€๊ฒŒ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํŒŒ์•…

    ํ•ญ๋ชฉ์„ค๋ช…
    ๊ฐ€๊ฒŒ ๋ฆฌ์ŠคํŠธ<div class = โ€œRyr1Fโ€>
    ๊ฐ€๊ฒŒ ๋ฆฌ์ŠคํŠธ ์ƒ์„ธ ์ •๋ณด<div class = โ€œplace_bluelink.N_KDL>
    ๊ฐ€๊ฒŒ ์ด๋ฆ„<div class="TYaxT">
    ์นดํ…Œ๊ณ ๋ฆฌ<div class=โ€KCMntโ€>
  • entryIframe : ๊ฐ๊ฐ์˜ ๊ฐ€๊ฒŒ ์ƒ์„ธ ์ •๋ณด ๊ตฌ์กฐ ํŒŒ์•…

    ํ•ญ๋ชฉ์„ค๋ช…
    ์ฃผ์†Œ<span class = โ€œLDgIHโ€>
    ์˜์—… ์‹œ๊ฐ„<div class = โ€œgKP9i RMgN0">
    ์˜์—… ์‹œ๊ฐ„ ์ƒ์„ธ ์ •๋ณด<span class="i8cJw"> , <div class=โ€H3ua4โ€>
    ๊ฐ€๊ฒŒ ์ด๋ฏธ์ง€<div class = โ€œCB8aPโ€>
    ๊ฐ€๊ฒŒ ์ด๋ฏธ์ง€ ์ƒ์„ธ ์ •๋ณด<div class = โ€œuDR4i>
    ๋ฉ”๋‰ด ์ƒ์„ธ ์ •๋ณด<span class = โ€œlPzHiโ€>, <span class = โ€œkPogFโ€>, <em>, <img src = โ€œhttps://โ€>

โœ…ย Selenium ํ™œ์šฉํ•œ ๋™์  ํฌ๋กค๋ง ์ง„ํ–‰

ํฌ๋กค๋ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

  1. ์›น ๋ธŒ๋ผ์šฐ์ € ๋„์šฐ๊ธฐ
  2. ์ถฉ๋ฌด๋กœ ์Œ์‹์  ๊ฒ€์ƒ‰
  3. searchIframe ์ง„์ž… ๋ฐ ์Šคํฌ๋กค ์กฐ์ž‘
  4. ๊ฐ€๊ฒŒ ๋ฆฌ์ŠคํŠธ ์ˆ˜์ง‘
  5. ์‹๋‹น ํด๋ฆญ ๋ฐ entryIframe ์ „ํ™˜
  6. ๊ฐ€๊ฒŒ ์ƒ์„ธ ์ •๋ณด ์ˆ˜์ง‘

์•„๋ž˜๋Š” ํฌ๋กค๋ง์„ ํ•˜๋ฉด์„œ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„๋“ค์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

โ˜‘๏ธย ์Šคํฌ๋กค ์กฐ์ž‘

๋„ค์ด๋ฒ„ ์ง€๋„๋Š” ์Šคํฌ๋กค์„ ๋‚ด๋ฆด ๋•Œ๋งˆ๋‹ค ๋™์ ์œผ๋กœ ์ง€์—ฐ ๋กœ๋”ฉ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. lazyload-wrapper ์•ˆ์— ์‹๋‹น ์ •๋ณด๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ๋‹ค. ํฌ๋กค๋ง์„ ํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์ฒซ ๋‚œ๊ด€์ด์—ˆ๋‹ค ๐Ÿซ 

Selenium์˜ driver.execute_script() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋†’์ด๋ฅผ ์กฐ์ ˆํ•ด์คŒ์œผ๋กœ์จ ์ง์ ‘ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํŽ˜์ด์ง€์˜ ๋งจ ์•„๋ž˜๊นŒ์ง€ ์Šคํฌ๋กคํ•˜์—ฌ ์‹๋‹น ์ •๋ณด๊ฐ€ HTML์— ์ฑ„์›Œ์ง€๊ฒŒ ํ•œ๋‹ค.

def scroll(driver, scroll_container, px):
    last_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container)
    while True:
        driver.execute_script("arguments[0].scrollTop += arguments[1]", scroll_container, px)
        time.sleep(0.5)
        current_height = driver.execute_script("return arguments[0].scrollTop", scroll_container)
        if current_height == last_height:
            break
        last_height = current_height

โ˜‘๏ธย NoSuchElementException

driver.find_element(By.ID, "searchIframe") // ๐Ÿงจ
WebDriverWait(driver, 60).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "searchIframe"))) // ๐Ÿ‘

์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋กœ๋”ฉ ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋А๋ ธ๋‹ค. ํŽ˜์ด์ง€์˜ ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ๋„ ์ „์— find_element ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์œ„์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ WebDriverWait์„ ์‚ฌ์šฉํ•˜์ž. WebDriverWait์€ ํŠน์ • ์‹œ๊ฐ„๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

โ˜‘๏ธย ์‹๋‹น ํด๋ฆญ

์‹๋‹น ๋ณ„๋กœ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” click()์„ ๋ฐœ์ƒ์‹œ์ผœ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์‹๋‹น ์„ธ๋ถ€ ์ •๋ณด๋Š” entryIframe์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— searchIframe์—์„œ ๋‚˜์™€์„œ ์ƒˆ๋กœ์šด entryIframe์œผ๋กœ ์ง„์ž…ํ•ด์•ผ ํ•œ๋‹ค. Selenium์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋งŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

driver.execute_script("arguments[0].click();", restaurant)
            
driver.switch_to.default_content()

WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '//*[@id="entryIframe"]')))
iframe = driver.find_element(By.XPATH, '//*[@id="entryIframe"]')
driver.switch_to.frame(iframe)

Iframe ์ „ํ™˜ํ•  ๋•Œ WebDriverWait ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ ์žŠ์ง€ ๋ง์ž

โ˜‘๏ธย ์—ฌ๋Ÿฌ ์˜ˆ์™ธ ์ผ€์ด์Šค

ํฌ์žฅ ๊ฐ€๋Šฅํ•œ ์‹๋‹น ์ผ๋ฐ˜ ์‹๋‹น
์ด๋ฏธ์ง€ 1 ์ด๋ฏธ์ง€ 2

๊ณ„์†ํ•ด์„œ 82์˜ฌ๋ฆฌ์–ธ์ฆˆ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ดค๋”๋‹ˆ ๋ฉ”๋‰ด๊ฐ€ ๋‹ค๋ฅธ ์‹๋‹น๋“ค๊ณผ ์ข€ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํฌ์žฅ ์ฃผ๋ฌธ์ด ๊ฐ€๋Šฅํ•œ ๋งค์žฅ์œผ๋กœ, ๋‹ค๋ฅธ ์‹๋‹น๋“ค๊ณผ ๋ฉ”๋‰ด์˜ ๊ตฌ์กฐ์™€ ํƒœ๊ทธ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค. ๋˜ํ•œ lazy ๋กœ๋”ฉ์ด ๊ฑธ๋ ค์žˆ์–ด ์Šคํฌ๋กค ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ์‹๋‹น๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Traceback (most recent call last):
  File "/app/crawling_restaurnats_detail.py", line 28, in crawling_restaurant_info
    iframe_src = iframe.get_attribute("src")
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/webelement.py", line 231, in get_attribute
    attribute_value = self.parent.execute_script(
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 528, in execute_script
    return self.execute(command, {"script": script, "args": converted_args})["value"]
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 429, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 232, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: script timeout
  (Session info: chrome=136.0.7103.59)

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด WebDriverWait์ด ํ•ด๋‹น ํƒœ๊ทธ๋“ค์„ ์ฐพ์„ ์ˆ˜ ์—†์–ด TimeoutException์ด ๋ฐœ์ƒํ•œ๋‹ค.

โ˜‘๏ธย ์„œ๋ฒ„ ์—๋Ÿฌ ๐Ÿงจ

์‹๋‹น ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํฌ๋กค๋งํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํฌ๋กค๋ง ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ–ˆ๋‹ค. ํ”„๋ฆฌํ‹ฐ์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ŠคํŽ™์ด micro์˜€๋Š”๋ฐ ์„ค๋งˆ ๊ณ ์ž‘ 70๊ฐœ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์ฃฝ๊ฒ ์–ด? ํ•˜๋Š” ์ƒ๊ฐ์œผ๋กœ ๋Œ๋ ธ๋Š”๋ฐ, ๋ฐ”๋กœ ์ฃฝ์–ด๋ฒ„๋ ธ๋‹ค.

์ฝ”๋“œ๋„ ๊ณ ์ณ๋ณด๊ณ  ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ป๋‹ค ์ผœ๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•„ ๊ฒฐ๊ตญ small๋กœ ์˜ฌ๋ ธ๋‹ค. ๋น„์šฉ์ด ๋ฌธ์ œ์ด๊ธดํ•˜๋‚˜ ์ด์ œ ์ตœ์ข…๋ฐœํ‘œ๊นŒ์ง€ 1๋‹ฌ ์กฐ๊ธˆ ๋„˜๊ฒŒ๋ฐ–์— ์•ˆ ๋‚จ์•˜์œผ๋‹ˆ ๊ทธ ์ •๋„๋Š” ๊ฐ์ˆ˜ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. (์ด ๋ฌธ์ œ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ํ•ด๊ฒฐํ•œ๋‹ค.)

โ˜‘๏ธย ๋„์ปค ์ด๋ฏธ์ง€

์ €๋ฒˆ ํ”„๋กœ์ ํŠธ๋•Œ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•  ํƒ€์ด๋ฐ์„ ๋†“์ณ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„ ๊ตฌ์ถ•ํ• ๋•Œ๋‚˜ ์„œ๋ฒ„ ๋‹ค์‹œ ์ƒ์„ฑํ• ๋•Œ๋‚˜ ๊ต‰์žฅํžˆ ํž˜๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์—๋Š” ๋„์ปค๋ฅผ ์ ๊ทน ํ™œ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

์„œ๋ฒ„์— ํฌ๋กค๋ง ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๊ณ ๋ณด๋‹ˆ python, selenium, webdriver ๋“ฑ๋“ฑ .. ์„ค์น˜ํ• ๊ฒŒ ํ•œ๊ฐ€๋“์ด๋‹ค. ๋„์ปค ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•ด์„œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ํ•œ ๋ฒˆ์— ๊ตฌ์„ฑํ•˜๊ณ , ์†์‰ฝ๊ฒŒ ์‹คํ–‰/๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ–ˆ๋‹ค.

// Python 3.10์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค ์ด๋ฏธ์ง€ ์‚ฌ์šฉ
FROM python:3.10-slim

// ํฌ๋กฌ ์„ค์น˜ ๋ฐ ์ธ์ฆ์„œ ๊ฒ€์ฆ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๋ฆฌ๋ˆ…์Šค ํŒจํ‚ค์ง€ ์„ค์น˜
RUN apt-get update && apt-get install -y \
    wget curl unzip gnupg ca-certificates fonts-nanum apt-transport-https \
    && rm -rf /var/lib/apt/lists/*

// Google Chrome์˜ ๊ณต์‹ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ตœ์‹  ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜
RUN mkdir -p /usr/share/keyrings && \
    curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg && \
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" \
    > /etc/apt/sources.list.d/google-chrome.list && \
    apt-get update && apt-get install -y google-chrome-stable && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY . .

// pip ์ตœ์‹ ํ™” ๋ฐ ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ์„ค์น˜
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

โœ…ย ํฌ๋กค๋ง ๊ฒฐ๊ณผ

๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์ถฉ๋ฌด๋กœ ์Œ์‹์ 
์ตœ์ข… ์ˆ˜์ง‘ ์‹๋‹น ์ˆ˜65๊ฐœ
์†Œ์š” ์‹œ๊ฐ„278์ดˆ
๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ์‹๋‹น ์ด๋ฆ„, ์ฃผ์†Œ, ์‹๋‹น์ด๋ฏธ์ง€, ์˜์—… ์‹œ๊ฐ„, ๋ฉ”๋‰ด ์ •๋ณด

๐Ÿ“šย ๋‚จ์€ ์ˆ™์ œ

  • ์‹๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€?
    • ์ง€๊ธˆ์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํฌ๋กค๋งํ•ด์˜จ ์‹๋‹น ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด DB์˜ ๋ชจ๋“  ์‹๋‹น ๋ฐ์ดํ„ฐ๋ฅผ deleteํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ insertํ•˜๊ณ  ์žˆ๋‹ค. ์›๋ž˜๋Š” ๋„ค์ด๋ฒ„ ์‹๋‹น ๊ณ ์œ  ID๊ฐ’์„ ํ™œ์šฉํ•ด DB์— ์‹๋‹น ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๋ฉด update, ์—†๋‹ค๋ฉด insertํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ๊ตฌํ˜„์ด ์‰ฝ์ง€ ์•Š์•„ ์ง€๊ธˆ์€ ์‹œ๊ฐ„๊ด€๊ณ„์ƒ ํŒจ์Šคํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ์‹๋‹น ์ •๋ณด๊ฐ€ ๋งŽ์•„์ง€๋ฉด ํŠธ๋žœ์žญ์…˜ ์˜ค๋ž˜ ์žก๊ณ  ์žˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋” ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ โ€ฆ ?!
  • ์นดํ…Œ๊ณ ๋ฆฌ โ†’ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—… ์ฒ˜๋ฆฌ
    • ex) ๋„ค์ด๋ฒ„ ์ง€๋„์— ํ‘œ๊ธฐ๋œ ์‹๋‹น ์นดํ…Œ๊ณ ๋ฆฌ : ๊ณฐํƒ• โ†’ ํ•œ์‹ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋งคํ•‘
profile
๋‚˜์˜ ์„ฑ์žฅ ๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€