본문 바로가기
활동 일지/캡스톤디자인프로젝트

[캡스톤디자인프로젝트 | 스타트] Chrome 이미지 크롤링

by seoyamin 2022. 11. 11.

본격적으로 YOLO 모델을 학습시키기 위해 이미지 크롤링을 진행하였다.

다양한 방법들이 있었는데, 나는 아래의 자료를 참고하여 실습해보았다.

https://www.youtube.com/watch?v=1b7pXC1-IbE&t=247s 

 

 

1. 작업하고자 하는 폴더 생성

crawling이라는 폴더 생성

 

2. vscode로 해당 폴더 열기

 

3. 파이썬 가상 환경 만들기 (venv)

※ 주의
터미널이 cmd여야 한다!
계속 powershell로 진행하다가는 activate 명령어가 실행되지 않는 문제가 있었다.

 

3-1. 터미널에서 명령어 입력

python -m venv selenium

* 공식 문서에는 python3 -m venv /path/to/new/virtual/environment 명령어로 소개되어 있지만, 내 pc에는 PYTHON으로 환경변수가 설정되어 있고, 작업 폴더 안에 selenium 폴더를 만들어주기 위해서 명령어를 수정하였다.

 

잠시 기다리면 selenium 폴더가 생성된다.

 

3-2. selenium/Scripts 폴더로 이동

cd selenium/Scripts

 

 

3-3. 가상환경 실행

activate

 

실행하면 (selenium)이 뜨면서 가상 환경이 실행된다.

 

4. 가상환경 설정

※ 주의
방금 실행한 (selenium) 가상환경에서 설치하는 것임을 주의하자!

 

4-1. Selenium 설치

pip install selenium

 

조금 기다리면 설치가 완료된다.

 

4-2. Selenium 웹브라우저 설정 및 실행

이번 실습에서는 chrome 브라우저를 사용할 것이다.

 

(1) chrome driver 설치

자신의 chrome 버전과 운영체제에 맞는 드라이버 설치 후, 압축을 풀어준다.

- 크롬 버전 확인법 : 브라우저 우측 상단 점떙땡/도움말/Chrome 정보

 

(2) chromedriver.exe 파일을 우리가 만든 sequelize 폴더로 이동

 

(3) sequelize 폴더 아래에 google.py 파일 만들기

※ chromedriver와 google.py 파일이 동일한 경로에 있어야 한다.

 

 

(4) google.py 코드 작성

아래의 코드를 복붙해준다. (sequelize 공식 문서 예제 그대로)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://www.python.org")
# assert "Python" in driver.title
# elem = driver.find_element(By.NAME, "q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

(5) 테스트 실행

> cd ..  (selenium 폴더로 이동)
> python google.py

 

 

5. 크롤링 코드 작성

(1) 이미지 1개 다운받기

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import urllib.request


driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko")       # 검색창 주소로 이동
elem = driver.find_element(By.NAME, "q")                 # 가져올 html 태그 (q)
elem.send_keys("cockroach")                              # 검색어 입력
elem.send_keys(Keys.RETURN)                              # 겁색어 입력 후 엔터 처리
driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")[0].click() # 하나의 이미지 선택 - 가져올 html 태그 (rg_i Q4LuWd)
time.sleep(3)  # 이미지 가져올 때까지 3초 delay
imgUrl = driver.find_element(By.CSS_SELECTOR, ".n3VNCb").get_attribute("src")  # 선택한 큰 이미지 src 주소 가져오기

urllib.request.urlretrieve(imgUrl, "test.jpg")  # 해당 src 이미지 다운

 

실행 결과, 이미지가 잘 다운되었다 ! 신기방기

 

(2) 검색 결과 모든 이미지 다운받기

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import urllib.request


driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko")       # 검색창 주소로 이동
elem = driver.find_element(By.NAME, "q")                 # 가져올 html 태그 (q)
elem.send_keys("cockroach")                              # 검색어 입력
elem.send_keys(Keys.RETURN)                              # 겁색어 입력 후 엔터 처리



# 스크롤 먼저 내려놓기
SCROLL_PAUSE_TIME = 1

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")

    # 스크롤이 끝까지 내려간 경우
    if new_height == last_height:                               
      try:
        driver.find_element(By.CSS_SELECTOR, ".mye4qd").click()   # 결과 더보기 버튼 있으면 클릭 
      except:
        break                                                     # 결과 더보기 버튼 없으면 break
    last_height = new_height



images = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")   # 가져올 html 태그 (rg_i Q4LuWd)


count = 1    # 이미지 파일명 설정용 변수

for image in images:
  try:
    image.click()
    time.sleep(2)  # 이미지 가져올 때까지 2초 delay
    imgUrl = driver.find_element(By.CSS_SELECTOR, ".n3VNCb").get_attribute("src")  # 선택한 큰 이미지 src 주소 가져오기
    opener=urllib.request.build_opener()
    opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
    urllib.request.install_opener(opener)
    urllib.request.urlretrieve(imgUrl, str(count) + ".jpg")
    count = count + 1
  except:
    pass



driver.close()  # 웹 브라우저 닫기

자동으로 화면이 제어되면서 이미지가 다운받아진다 !