본격적으로 YOLO 모델을 학습시키기 위해 이미지 크롤링을 진행하였다.
다양한 방법들이 있었는데, 나는 아래의 자료를 참고하여 실습해보았다.
https://www.youtube.com/watch?v=1b7pXC1-IbE&t=247s
1. 작업하고자 하는 폴더 생성
2. vscode로 해당 폴더 열기
3. 파이썬 가상 환경 만들기 (venv)
※ 주의
터미널이 cmd여야 한다!
계속 powershell로 진행하다가는 activate 명령어가 실행되지 않는 문제가 있었다.
3-1. 터미널에서 명령어 입력
python -m venv selenium
* 공식 문서에는 python3 -m venv /path/to/new/virtual/environment 명령어로 소개되어 있지만, 내 pc에는 PYTHON으로 환경변수가 설정되어 있고, 작업 폴더 안에 selenium 폴더를 만들어주기 위해서 명령어를 수정하였다.
3-2. selenium/Scripts 폴더로 이동
cd selenium/Scripts
3-3. 가상환경 실행
activate
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() # 웹 브라우저 닫기
'활동 일지 > 캡스톤디자인프로젝트' 카테고리의 다른 글
[캡스톤디자인프로젝트] YOLOv5 & Flask (0) | 2023.04.19 |
---|---|
[캡스톤디자인프로젝트 | 그로쓰] Tencent Cloud GPU 서버 접속 (0) | 2023.04.11 |
[캡스톤디자인프로젝트 | 스타트] 라즈베리파이 & 카메라 모듈 개발 환경 설정 (1) | 2022.11.22 |
[캡스톤디자인프로젝트 | 스타트] Yolo 사용해보기 (0) | 2022.10.11 |
[캡스톤디자인프로젝트 | 스타트] 주제 구체화 (0) | 2022.10.11 |