【Selenium】 Google 이미지 검색을 스크래핑 할 수 없다면 크롤링하고 썸네일 이미지 만 수집합니다.
소개
기계 학습 등 대량의 화상 데이터가 필요할 때 의지한다고 하면 스크래핑이군요. 구글을 시작해 야후나 빙 등 다양한 사이트에서 이미지를 데려오는 기사는 이미 많이 있습니다만, 이번에는 구글 이미지 검색에 대해 쓰려고 합니다.
Google 이미지 검색에서 이미지를 모으는 프로그램은 많이 소개되고 있습니다만, 사양 변경이 많은지, 혹은 스크래핑 대책인가 지금 현재도 제대로 이미지를 모을 수 있는 것은 적습니다.
실제로 requests나 Beautiful Soup을 사용하여 Google 이미지 검색의 검색 결과를 스크레이프해 보면 알 수 있습니다만, 소득한 정보에는 20건분 정도밖에 이미지 데이터가 포함되어 있지요.
직접 스크레이프 할 수 없다면 크롤링으로 실제로 브라우저를 경유하면?
라고 말하는 것으로, 본제의 Selenium의 등장입니다.
Selenium을 사용하여 검색 결과의 페이지를 표시하면 HTML 등의 내용도 당연히 표시 내용에 맞추어 (인과가 반대입니다) 많은 사진의 데이터를 포함한 것에 다시 씁니다.
이 상태로 가져가고 나서 다시 스크레이프하는 것으로 대량의 화상을 얻을 수 있는 것입니다.
그러나 구글, 좀처럼 강력하고, 이 상태에서 얻을 수 있는 것은 섬네 이미지뿐입니다. 뭐 원래 사이즈의 화상 데이터가 수백장분 매입되어 있으면 힘든 데이터량이 되기 때문에 Google이든 상관없이 당연합니다만.
여기에서 개별 이미지를 클릭하여 1장씩 원래 크기로 저장하는 것도 가능합니다만, 원래 이미지 크기가 클 필요가 없는 경우에는 이대로 썸네일마저 모아 버리면 승리입니다.
Chromedriver의 다운로드 등, Selenium을 사용할 준비가 되어 있다고 해서,
그럼 가자.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import os
import time
import requests
import shutil
import base64
options = Options()
options.add_argument("--disable-gpu")
options.add_argument("--disable-extensions")
options.add_argument('--proxy-server="direct://"')
options.add_argument("--proxy-bypass-list=*")
options.add_argument("--start-maximized")
#options.add_argument("--headless")
DRIVER_PATH = "chromedriver.exe" #chromedriverの場所
driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)
query = input('Search word? :')
url = ("https://www.google.com/search?hl=jp&q=" + "+".join(query.split()) + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
driver.get(url)
#適当に下までスクロールしてる--
for t in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(1.5)
try:driver.find_element_by_class_name("mye4qd").click() #「検索結果をもっと表示」ってボタンを押してる
except:pass
for t in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(1.5)
srcs = driver.find_elements(By.XPATH, '//img[@class="rg_i Q4LuWd"]')
try:os.mkdir(query) #検索語と同じ名前のフォルダを作る、保存先
except:pass
#--
i = 0 #ファイル名に通し番号をつける用カウンタ
print("Downloading...")
for j, src in enumerate(srcs):
if j % 50 == 0 or j == len(srcs)-1:
print("|"+ ("■" * (20 * j // (len(srcs)-1)))+ (" -" * (20 - 20 * j // (len(srcs)-1)))+ "|",f"{100*j//(len(srcs)-1)}%") #ダウンロードの進捗示すやつ
file_name = f"{query}/{'_'.join(query.split())}_{str(i).zfill(3)}.jpg" #ファイル名とか場所とか
src = src.get_attribute("src")
if src != None:
#画像に変換--
if "base64," in src:
with open(file_name, "wb") as f:
f.write(base64.b64decode(src.split(",")[1]))
else:
res = requests.get(src, stream=True)
with open(file_name, "wb") as f:
shutil.copyfileobj(res.raw, f)
#--
i += 1
driver.quit() #ウィンドウを閉じる
print(f"Download is complete. {i} images are downloaded.")
결과
실행 후 검색어를 입력하고 조금 기다리면 400~1,000장 정도의 이미지가 검색어와 같은 이름의 폴더에 저장되어 있어야 합니다.
요약
2분 정도로 수백~천장의 이미지가 모이기 때문에 기계 학습이 가려질 것 같다(스스로 데이터 세트 만든 적은 없지만).
스크래핑, 크롤링은 최근 공부를 시작했을 뿐이므로, 개선점, 마즈이점등 있으면 교시해 주시면 도움이 됩니다.
참고로 한 사이트 등
Reference
이 문제에 관하여(【Selenium】 Google 이미지 검색을 스크래핑 할 수 없다면 크롤링하고 썸네일 이미지 만 수집합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Cartelet/items/2f54965850c201f4fb96
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
라고 말하는 것으로, 본제의 Selenium의 등장입니다.
Selenium을 사용하여 검색 결과의 페이지를 표시하면 HTML 등의 내용도 당연히 표시 내용에 맞추어 (인과가 반대입니다) 많은 사진의 데이터를 포함한 것에 다시 씁니다.
이 상태로 가져가고 나서 다시 스크레이프하는 것으로 대량의 화상을 얻을 수 있는 것입니다.
그러나 구글, 좀처럼 강력하고, 이 상태에서 얻을 수 있는 것은 섬네 이미지뿐입니다. 뭐 원래 사이즈의 화상 데이터가 수백장분 매입되어 있으면 힘든 데이터량이 되기 때문에 Google이든 상관없이 당연합니다만.
여기에서 개별 이미지를 클릭하여 1장씩 원래 크기로 저장하는 것도 가능합니다만, 원래 이미지 크기가 클 필요가 없는 경우에는 이대로 썸네일마저 모아 버리면 승리입니다.
Chromedriver의 다운로드 등, Selenium을 사용할 준비가 되어 있다고 해서,
그럼 가자.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import os
import time
import requests
import shutil
import base64
options = Options()
options.add_argument("--disable-gpu")
options.add_argument("--disable-extensions")
options.add_argument('--proxy-server="direct://"')
options.add_argument("--proxy-bypass-list=*")
options.add_argument("--start-maximized")
#options.add_argument("--headless")
DRIVER_PATH = "chromedriver.exe" #chromedriverの場所
driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)
query = input('Search word? :')
url = ("https://www.google.com/search?hl=jp&q=" + "+".join(query.split()) + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
driver.get(url)
#適当に下までスクロールしてる--
for t in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(1.5)
try:driver.find_element_by_class_name("mye4qd").click() #「検索結果をもっと表示」ってボタンを押してる
except:pass
for t in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(1.5)
srcs = driver.find_elements(By.XPATH, '//img[@class="rg_i Q4LuWd"]')
try:os.mkdir(query) #検索語と同じ名前のフォルダを作る、保存先
except:pass
#--
i = 0 #ファイル名に通し番号をつける用カウンタ
print("Downloading...")
for j, src in enumerate(srcs):
if j % 50 == 0 or j == len(srcs)-1:
print("|"+ ("■" * (20 * j // (len(srcs)-1)))+ (" -" * (20 - 20 * j // (len(srcs)-1)))+ "|",f"{100*j//(len(srcs)-1)}%") #ダウンロードの進捗示すやつ
file_name = f"{query}/{'_'.join(query.split())}_{str(i).zfill(3)}.jpg" #ファイル名とか場所とか
src = src.get_attribute("src")
if src != None:
#画像に変換--
if "base64," in src:
with open(file_name, "wb") as f:
f.write(base64.b64decode(src.split(",")[1]))
else:
res = requests.get(src, stream=True)
with open(file_name, "wb") as f:
shutil.copyfileobj(res.raw, f)
#--
i += 1
driver.quit() #ウィンドウを閉じる
print(f"Download is complete. {i} images are downloaded.")
결과
실행 후 검색어를 입력하고 조금 기다리면 400~1,000장 정도의 이미지가 검색어와 같은 이름의 폴더에 저장되어 있어야 합니다.
요약
2분 정도로 수백~천장의 이미지가 모이기 때문에 기계 학습이 가려질 것 같다(스스로 데이터 세트 만든 적은 없지만).
스크래핑, 크롤링은 최근 공부를 시작했을 뿐이므로, 개선점, 마즈이점등 있으면 교시해 주시면 도움이 됩니다.
참고로 한 사이트 등
Reference
이 문제에 관하여(【Selenium】 Google 이미지 검색을 스크래핑 할 수 없다면 크롤링하고 썸네일 이미지 만 수집합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Cartelet/items/2f54965850c201f4fb96
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
2분 정도로 수백~천장의 이미지가 모이기 때문에 기계 학습이 가려질 것 같다(스스로 데이터 세트 만든 적은 없지만).
스크래핑, 크롤링은 최근 공부를 시작했을 뿐이므로, 개선점, 마즈이점등 있으면 교시해 주시면 도움이 됩니다.
참고로 한 사이트 등
Reference
이 문제에 관하여(【Selenium】 Google 이미지 검색을 스크래핑 할 수 없다면 크롤링하고 썸네일 이미지 만 수집합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Cartelet/items/2f54965850c201f4fb96텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)