1. ์ค๊ณ ๊ณผ์
์ฐ์ ๋ชจ๋ ๋ฎ์๊ผด๋ก ๋์ค๋ ์ธ๋ฌผ์ ๋ชจ๋ ์ฐ์์ธ์ผ๋ก ํ๊ธฐ์๋ ๋๋ฌด ๊ด๋ฒ์ํ๋ค๊ณ ์๊ฐ๋์ด, ๋น์ ์ ํํ ๋๋ผ๋ง์ธ '๋ ๊ธ๋ก๋ฆฌ'์ ๋ฑ์ฅ์ธ๋ฌผ๋ก๋ง ์ค์ ํ๊ธฐ๋ก ํ๋ค.
์๊ฐํด ๋ณธ ์์ ์์๋ ์๋์ ๊ฐ๋ค:
- ๋๊ธ๋ก๋ฆฌ ๋ฑ์ฅ์ธ๋ฌผ์ ์ฌ์ง ํฌ๋กค๋ง
- ์ฌ์ง ์ ์ฒ๋ฆฌ ์์ ๋ฐ data augmentation
- ๋ชจ๋ธ ์ ์
- ๋ชจ๋ธ ํ์ต
- ํ ์คํธ ๋ฐ ์น ์ฐ๊ฒฐ
2. ํฌ๋กค๋ง
๋ฌผ๋ก ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต๊ฐ๋ ์คํ์์ค๋ค์ด ์์์ง๋ง, ํฌ๋กค๋ฌ๋ ์ง์ ๊ตฌํํด ๋ณด๊ณ ์ถ์๋ค. (๋ง์ ๋ฆฌ์์ค๊ฐ ๋๋ ๊ฒ์ ์๋๋๊น..)
ํ์ฌ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ ๋ฑ์ฅ์ธ๋ฌผ๋ค์ ์ด๋ฏธ์ง์ด๊ธฐ ๋๋ฌธ์, ๊ตฌ๊ธ ์ด๋ฏธ์ง ์ฌ์ดํธ (https://www.google.co.kr/imghp?hl=ko)์ ๊ธฐ์ค์ผ๋ก ํฌ๋กค๋งํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
์ฐ์ ์ต์ข ์ ์ผ๋ก ๊ตฌํํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import urllib.request
import ssl
import os
# ssl certification ์ค๋ฅ ํด๊ฒฐ
ssl._create_default_https_context = ssl._create_unverified_context
keyword = input("๊ฒ์ํ ์ด๋ฆ์ ์
๋ ฅํ์ธ์: ")
# ํ์ผ๋ช
์์ด๋ก ๋ณ๊ฒฝ
keyword_to_english = ""
if keyword == "์กํ๊ต":
keyword_to_english = "shg"
elif keyword == "์ด๋ํ":
keyword_to_english = "idh"
elif keyword == "์์ง์ฐ":
keyword_to_english = "ijh"
elif keyword == "์ ์์":
keyword_to_english = "she"
elif keyword == "์๋ช
์ค":
keyword_to_english = "smo"
# selenium option
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# ์ ์ฅํ ๋๋ ํ ๋ฆฌ๋ช
save_path = "/Users/jang-youngjoon/dev-projects/youtuber-look-alike/crawled-image"
# ์ ์ผ ์๋๊น์ง ์คํฌ๋กค -> ํญ๋ชฉ ๋์ด๊ธฐ
def selenium_scroll_option():
SCROLL_PAUSE_SEC = 2
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(SCROLL_PAUSE_SEC)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
driver.get("https://www.google.co.kr/imghp?hl=ko")
elem = driver.find_element(By.NAME, "q")
elem.send_keys(keyword)
elem.send_keys(Keys.RETURN)
time.sleep(1)
# ๋๋ณด๊ธฐ ๋ฒํผ ๋๋ฅด๋ ์ฝ๋
selenium_scroll_option()
images = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")
count = 1
images_url_list = []
for image in images:
if image:
# image.send_keys(Keys.ENTER) #.click() ๋ง๊ณ send_keys(Keys.ENTER)๋ก ๋ณ๊ฒฝ
driver.execute_script("arguments[0].click();", image)
time.sleep(3)
imageUrl = driver.find_element(
By.XPATH,
'//*[@id="Sva75c"]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div/div/div/div[3]/div[1]/a/img[1]',
)
if imageUrl:
if imageUrl.get_attribute("src") == None:
images_url_list.append(imageUrl.get_attribute("data-src"))
else:
images_url_list.append(imageUrl.get_attribute("src"))
else:
continue
else:
break
for image_url in images_url_list:
file_name = f"{keyword_to_english}_{count:06d}.jpg"
file_place = os.path.join(save_path, file_name)
urllib.request.urlretrieve(image_url, file_place)
print(f"Image saved: {count}")
count += 1
driver.close()
์ฝ๋์ ๊ดํด ์ค๋ช ํ์๋ฉด, ์คํ ์ ํฌ๋กค๋งํ๊ณ ์ ํ๋ ์ธ๋ฌผ์ ์ด๋ฆ์ ์ ๋ ฅ๋ฐ๊ฒ ํ๋ค. ๋ฌผ๋ก ์ ๋ ฅ๋ฐ์ ์ธ๋ฌผ์ ์ด๋ฆ์ด ๋์ด๋๋ฉด ์ฒ์์ ์ค์ ํด ๋ 'keyword' ๋ถ๋ถ์ if๋ฌธ์ ๋ณ๊ฒฝํด์ผ ํ์ง๋ง, ์ฐ์ ์ด๋ ๊ฒ ์์ฑํ๋ค. (ํ์ ํด๋น ๋ถ๋ถ์ ์๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํด ๋ด์ผ๊ฒ ๋ค.)
์ดํ์๋ ๊ตฌ๊ธ ์ด๋ฏธ์ง ์ฌ์ดํธ๋ก ์ด๋ํ์ฌ ์ ๋ ฅ๋ฐ์ ๋ฑ์ฅ์ธ๋ฌผ์ ์ด๋ฆ์ ๊ฒ์ํ๋ค. ๋ค๋์ ์ฌ์ง์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค์ด ๊ผญ ํ์ํ๋๋ฐ, html ๋ฌธ๋ฒ์ ์๊ณ ์์ด์์๋์ง ์์ฝ๊ฒ ๋ง๋ค์๋ค. ํด๋น ์ฌ์ดํธ๋ ๋ฌดํ ์คํฌ๋กค ๋ฐฉ์์ผ๋ก ๊ตฌํ์ด ๋ผ์๊ธฐ ๋๋ฌธ์, ์คํฌ๋กค์ ๋์ด๋ฅผ ์๋๋ก ๋ด๋ฆผ์ผ๋ก์จ ๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ์ด ๋ฐ๋๋๊ฒ ํ ์ ์์๋ค.
์ดํ, '๋ ๋ณด๊ธฐ' ๋ฒํผ์ด ๋์ค๋ฉด ๋ฒํผ์ ๋๋ฌ์ผ ๋ ๋ง์ ์ฌ์ง์ ๋ณผ ์ ์์์ง๋ง, ๊ทธ ๋ฒํผ์ด ๋์ค๋ ์๊ฐ ์ ์ด๋ 200์ฅ์ ์ด๋ฏธ์ง๋ ํ๋ณด๋ ๊ฒ์ด๋ ํด๋น ๋ฒํผ์ ๋๋ฅด๋ ๊ธฐ๋ฅ๊น์ง๋ ๊ตฌํํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ ๊ฒ ์ด๋ฏธ์ง๋ฅผ ํ๋์ฉ ๊ฐ์ ธ์, ์ธ๋ฌผ์ ์ด๋์ ๊ณผ ์ด๋ฏธ์ง ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ ๋ด ์ปดํจํฐ์ ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ์ธ๋ฌผ๋ค์ ์ด๋ฏธ์ง๋ฅผ ํฌ๋กค๋ฌ๋ฅผ ์ง์ ๊ตฌํํ์ฌ ํฌ๋กค๋งํด๋ณด์๋ค.
3. ๊ฐ์ ์ฌํญ
์ด๋ ๊ฒ ์ง์ ํฌ๋กค๋ฌ๋ฅผ ๊ตฌํํด์ ํฌ๋กค๋งํด ๋ณด์๋๋ฐ, ์ ๋ง ์ค์ง์ ์ธ ์ฉ๋๋ก ์ด ํฌ๋กค๋ฌ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ํํ๊ณ ๊ฐ์ ํด์ผ ํ ๋ถ๋ถ์ด ๋ง๋ค๋ ์๊ฐ์ด ๋ค์๋ค:
- ์ด๋ฆ์ ์ ๋ ฅ๋ฐ๋ ๋ฐฉ์: ์ฌ์ฉ์๊ฐ txt ํ์ผ์ ํฌ๋กค๋งํ ์ด๋ฆ์ ๋ฌธ๋จ์ ๊ตฌ๋ถํ์ฌ ์จ ๋๊ณ , ์์คํ ๋ด๋ถ์์ ์๋์ผ๋ก ํ ์ค์ฉ ์ฝ๊ฒ ํ์ฌ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์์ ํ ์ ์์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค.
- ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณํ๋ ๊ตฌ๊ธ ์ฌ์ดํธ์ HTML element: ์ด ํฌ๋กค๋ฌ๋ฅผ ๋์ค์ ์ฌ์ฉํ๋ ค๊ณ ๋ณด๋, ๊ตฌ๊ธ ์ด๋ฏธ์ง ๊ฒ์ ์ฌ์ดํธ์ html element๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณํด์ ํฌ๋กค๋งํ๊ธฐ ์ด๋ ค์ ๋ค. ์ด ๋ถ๋ถ์,, ์ฃผ๊ธฐ์ ์ผ๋ก ๋ด๊ฐ ํ์ธํ๊ณ element ๋ถ๋ถ์ ๋ณ๊ฒฝํ๊ฑฐ๋, ์ฌ์ดํธ์์ ๊ท์น์ฑ์ ์ฐพ์ ์ ๋ฐ์ดํธ์์ผ์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์๋ค. (ํ์ง๋ง ํ์๋ ๋๋ฌด ์๊ฐ๋, ๋ฆฌ์์ค๋ ๋ง์ด ๋ค ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค...)
- ์ธ์ฆ์ ๋ฌธ์ : ๊ฐ๋์ฉ ์คํํ ๋ ์ธ์ฆ์ ๊ด๋ จ (ssl ๊ด๋ จ์ธ ๋ฏํ๋ค.) ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
๊ฐ์ ํด์ผ ํ ์ ๋ ๋ง์์ง๋ง, ๊ทธ๋๋ ์ง์ ํฌ๋กค๋ฌ๋ฅผ ๊ตฌํํ์ฌ ๋ค๋์ ์ฌ์ง ๋ฐ์ดํฐ๋ฅผ ์๊ฒ ๋์ด ๊ธฐ๋ปค๋ค. ๋ค์์ ํด๋น ์ฌ์ง๋ค์ ๋ํ ์ ์ฒ๋ฆฌ๋ฅผ ํด ๋ณผ ์์ ์ด๋ค.
'๐ป ํ๋ก์ ํธ > ๐งธ TOY-PROJECTS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DeepLook] 5. ๋ฐฑ์๋ ์ฐ๊ฒฐ (0) | 2023.06.21 |
---|---|
[DeepLook] 4. ๋ชจ๋ธ ์ ์ ๋ฐ ํ์ต (0) | 2023.06.21 |
[DeepLook] 3. ์ ์ฒ๋ฆฌ (haar-cascade ์๊ณ ๋ฆฌ์ฆ) (0) | 2023.06.20 |
[DeepLook] 1. ์์ํ๊ฒ ๋ ๊ณ๊ธฐ / ํ๋ก์ ํธ IA (0) | 2023.06.20 |
[ํ ์ดํ๋ก์ ํธ-NETFLIX CLONE] Next.js ๋ฅผ ํ์ฉํ Netflix Clone ํ๋ก์ ํธ (0) | 2023.06.20 |