๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํด์๋ ์ ์ผ ์ฒ์ ์์ด์ผ ํ๋๊ฒ์ด ์ด๋ฏธ์ง ์๋๊น์?
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ธ์์ ์ด๋ฏธ์ง๋ฅผ ์ฐ์์ธ๋ง๋ค ํด๋๋ฅผ ๋ง๋ค์ด์ ์ ์ฅํ๋ ๊ณํ์ ์์ ์ต๋๋ค.
import requests
from bs4 import BeautifulSoup
import urllib
count2=1
for i in range(10):
# ๊ฒ์ํ ํค์๋ ์
๋ ฅ
keyword = "๋ฐฐ์ฐ ์ฅ๊ธฐ์ฉ ์ธ๋ฌผ์ฌ์ง"
# ๊ฒ์ URL ์ฃผ์ ์
๋ ฅ
url = f"https://www.google.com/search?q={keyword}&source=lnms&tbm=isch&start=100"
# HTTP ์์ฒญ ๋ณด๋ด๊ธฐ
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"}
html = requests.get(url, headers=header).text
# HTTP ์๋ต์์ ์ด๋ฏธ์ง ๋งํฌ ์ถ์ถ
soup = BeautifulSoup(html, "html.parser")
img_tags = soup.find_all("img")
# ์ด๋ฏธ์ง ๋ค์ด๋ก๋
count = 0
for img in img_tags:
try:
count2+=1
img_url = img["src"]
if img_url.startswith("http"):
img_name = f"image_{count}_{count2}.jpg"
urllib.request.urlretrieve(img_url, img_name)
print(f"๋ค์ด๋ก๋ ์๋ฃ: {img_name}")
count += 1
except Exception as e:
print(f"์ค๋ฅ ๋ฐ์: {e}")
๊ทธ๋ ๋ค๋ฉด GET๋ฐฉ์์ด๋ ๋ฌด์์ผ๊น์?
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ๋ณด๋ฅผ ์์ฒญํ ๋ URL์ ํน์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ ๋ฐฉ์์ ๋๋ค.
GET ๋ฐฉ์์ ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, URL์ ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋์ด ์์ด ์ด๋ฅผ ์ฌ์ฉํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ด๋ฐ ํน์ฑ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์ฃผ์์ฐฝ์ URL์ ๋ณ๊ฒฝํ์ฌ ๋ค์ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ณ์ keyword๋ ๊ฒ์ํ๊ณ ์ถ์ ๋ฐฐ์ฐ๋ ๊ฐ์์ ์ด๋ฆ๋ฑ์ url์ f์คํธ๋ง์ ํ์์ผ๋ก ๋ฃ์๊ณ ๊ทธ ์ด์ ๋
์ถํ์ ๋ฐ๋ณต๋ฌธ์ ํตํด์ ๋ฆฌ์คํธ์ ์ฐ์์ธ์ ์ด๋ฆ์ ๋ฃ๊ณ ์ด๋ฆ์ ๋ฐ๋ณตํ๊ธฐ ์ํด์ ์ ๋๋ค.
๊ทธ๋ฌ๋ฉด์ URL์์ ์ฝ์ด์จ ์น์ ์ ๋ณด๋ฅผ BeautifulSoup์ ํตํด์ ์นํ์ด์ง์ ์ฝ๋๋ฅผ ํด์ํ์ฌ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(DOM, Document Object Model)๊ณผ ์ ์ฌํ ๊ตฌ์กฐ๋ก ๋ณํํ๊ฒ์ soup์ ๋ด์ต๋๋ค.
๋ณํํ๊ฒ์ ํตํด์ soup.find_all("img")
๋ฅผ ํตํด์ ์ด๋ฏธ์ง๋ง ์ฐพ์ต๋๋ค.
์ด์ < img >ํ๊ทธ์ ๋ํ ๋ฐ๋ณต๋ฌธ์ ์ํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง ์์ง์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ฉด ๋ฉ์ถ๋๊ฒ ์๋๋ผ
try ์ except๋ฅผ ํตํด์ ์๋ฌ์ ๋ฉ์ธ์ง๋ง์ ์ถ๋ ฅํ๊ณ ๋ฉ์ถ์ง ์๊ฒ ํ์์ต๋๋ค.
img_url = img["src"]
๊ฐ < img > ํ๊ทธ์ "src" ์์ฑ๊ฐ์ ๊ฐ์ ธ์ img_url ๋ณ์์ ์ ์ฅํฉ๋๋ค. "src"๋ ์ด๋ฏธ์ง ํ์ผ์ URL๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
if img_url.startswith("http"):
์ด๋ฏธ์ง URL์ด "http"๋ก ์์ํ๋์ง ํ์ธํ๊ณ , ๊ทธ๋ ๋ค๋ฉด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ธฐ ์ํด ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
urllib.request.urlretrieve(img_url, img_name)
์ด๋ฏธ์ง URL์์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฏธ์ง ํ์ผ์ ์ด๋ฆ์ธ img_name์ผ๋ก ์ ์ฅํฉ๋๋ค.
์์ ์ฝ๋๋ก ์ด๋ฏธ์ง๋ ๋ค์ด์ด ๋ฐ์์ก์ง๋ง ์ฐ์์ธ์ ์ฌ์ง ๋ฟ๋ง์๋๋ผ ์ฌ์ง์ ํฌ์คํ ํ๊ณณ์ ๋ก๊ณ ๋ ๊ธฐํ ํ์์๋ ์ด๋ฏธ์ง ๊น์ง ์ ์ฅ์ด ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํฌ๋กคํด์ ์ด๋ฏธ์ง๊ฐ ์ถ๊ฐ๋ก ๋ก๋๋๋ ํ์์ด๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค๊ธฐ๋ฅ๋ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
๊ทธ๊ฒ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฅธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ต๋๋ค.
import os
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from PIL import Image
import io
import time
# ํฌ๋กฌ๋๋ผ์ด๋ฒ ์์น ์ค์
DRIVER_PATH = '/usr/local/bin/chromedriver'
# ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์ต์
์ค์
listm=['๊ฐ์ ๋ฐฑ์๋ฆฐ', '๊ฐ์ ์ด์๋ผ','๊ฐ์ ์ค์๋ฐฐ์ฐ', '๋ฐฐ์ฐ ๋ฏผํจ๋ฆฐ','๋ฐฐ์ฐ ์ ๋ฏผ์','๋ฐฐ์ฐ ์์ ','๋ฐฐ์ฐ ์ํ์ง๊ฐ์', '๊ฐ์ ์ก๊ฐ์ธ','๊ฐ๊ทธ์ฐ๋จผ ์ ๋ด์ ','๊ฐ๊ทธ์ฐ๋จผ ์ด์์']
for i in listm:
options = Options()
options.add_argument('--headless') # ์ฐฝ ์๋์ฐ๊ธฐ
options.add_argument('--no-sandbox') # ๋ฆฌ๋
์ค ํ๊ฒฝ์์ ํ์ํ ์ต์
options.add_argument('--disable-dev-shm-usage') # ๋ฆฌ๋
์ค ํ๊ฒฝ์์ ํ์ํ ์ต์
# ๊ฒ์์ด ์ค์
search_name = i
# ๊ฒ์์ด๋ฅผ ์ด์ฉํ ๊ตฌ๊ธ ์ด๋ฏธ์ง ๊ฒ์ url
url = f'https://www.google.com/search?q={search_name}&source=lnms&tbm=isch'
# ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์คํ
service = Service(DRIVER_PATH)
driver = webdriver.Chrome(service=service, options=options)
# url ์ ์
driver.get(url)
# ํ์ด์ง ๋ก๋๋ฅผ ์ํ ๋๊ธฐ ์๊ฐ
time.sleep(2)
# ์ด๋ฏธ์ง ๋ก๋ฉ์ ์ํ ์คํฌ๋กค ๋ค์ด
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(1)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# ์ด๋ฏธ์ง ๋งํฌ ์ถ์ถ
soup = BeautifulSoup(driver.page_source, 'html.parser')
img_tags = soup.find_all('img')
urls = []
for img in img_tags:
try:
url = img['src']
if 'http' in url:
urls.append(url)
except:
pass
# ์ด๋ฏธ์ง ๋ค์ด๋ก๋
os.makedirs(f'./images{search_name}', exist_ok=True)
count = 0
for url in urls:
try:
response = requests.get(url, stream=True)
# ์ด๋ฏธ์ง ์ฌ์ด์ฆ ํ์ธ
img = Image.open(io.BytesIO(response.content))
width, height = img.size
if width >= 20 and height >= 20:
file_name = f'./images{search_name}/{count}.jpg'
with open(file_name, 'wb') as out_file:
out_file.write(response.content)
print(f'{file_name} saved')
count += 1
if count == 200:
break
except:
pass
# ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์ข
๋ฃ
driver.quit()
์ฌ๊ธฐ์ selenium์ ์ด์ฉํด์ ์์์ ๋ง์๋๋ฆฐ ์คํฌ๋กค๋ฑ์ ๋ธ๋ผ์ฐ์ ์ ์๋ํ๋ฅผ ์งํํ์์ต๋๋ค.
์ด์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฒ์๊ฒ๊ณผ ๋ค๋ฅธ๊ฒ์ ํฌ๊ฒ ์์ต๋๋ค.
ํ์ง๋ง ๋ค๋ฅธ๊ฒ๋ค์ ํฌ๊ฒ 00์์ต๋๋ค.
time.sleep()
์ฌ๋ฆฝ์ ์ด์ฉํ๋ ์ด์ ๋ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
driver.execute_script()
์ด๋ ๊ฒ ์คํฌ๋กค์ ํตํด์ ๋์จ ๊ธธ์ด๊ฐ ๋๊ฐ๊ฐ ์๋ก ๊ฐ์ผ๋ฉด while๋ฌธ์ ๋ฉ์ถ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋์จ ํ์ด์ง ์ ์ฒด์ html์ ๊ฐ์ ธ์ค๊ฒ ๋๊ณ < img >ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.์ง๊ธ๊น์ง urls์ ๋ด๊ธด ๊ฒ๋ค์ด ๋๋ค์ ๋ฐ๋ณต๋ฌธ์ ํตํด์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ์ ํ์์ ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ผ๋ก ํ๊ฒ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ 1์ฐจ ์ฝ๋์์ ์ด๋ฏธ์ง๊ฐ ์ฒจ๋ถ๋์ด์๋ ๋ก๊ณ ๋ค๋ ๊ฐ์ด ๋ฐ์์ ธ ์ค๋๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ธก์ ํ์ฌ 20*20์ด ๋์ด์ผ ๋ค์ด๋ก๋๊ฐ ๋๋๋ก ์ค์ ํ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฒ์์ listm์ด๋ผ๋ ๋ฆฌ์คํธ์ ์๋ ๋ฐฐ์ฐ์ ์ฐ์์ธ์ ์ด๋ฆ๋ค์ ๋ํ ํด๋๊ฐ ๋ง๋ค์ด์ง๊ณ ๊ทธ ํด๋์ ํด๋น ์ฐ์์ธ์ ์ฌ์ง์ด 200์ฅ๊น์ง ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค.