예전에 짰던 크롤링 코드를 colab 버전으로 필요해서 다시 정리해두었다.
구글에 검색하면 이것저것 많은데 다 이전 selenium 버전으로 되어 있는 등 오류를 잡을 수가 없었다.
그래서 그냥 찾아서 짜버린 코드를 공유한다. (2023년 09월 기준 코드)
colab에서 selenium 크롤링 코드를 돌리는 방법은 다음과 같은 단계를 따른다.
- 구글 드라이브 마운트
- Selenium 설치 & 내 구글 드라이브에 chromedriver 설치 (chromedriver는 최초 1회)
- 실행준비 - chrome_options 설정 등
- 이미지 크롤링
from google.colab import drive
drive.mount('/content/drive')
가장 먼저 개인의 구글 드라이브와 코드를 연결하자. 이미지 크롤링 저장 위치와 chromedriver 로딩을 위함이다. 위 코드를 실행해서 뜨는 팝업창으로 드라이브 마운트를 완료한다.
!pip install selenium
!apt-get update
# (최초 1회)
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver '/content/drive/MyDrive/Colab Notebooks' #
!pip install chromedriver-autoinstaller
colab은 연결할 때마다 다시 패키지를 설치해줘야 한다.
selenium을 제외하고 chromedriver는 내 노트북에 1회 복사해서 저장해주면 된다.
"/content/drive/MyDrive/Colab Notebooks" 대신 본인이 저장하고 싶은 위치를 넣어주면 된다.
!python --version
import selenium
print(selenium.__version__)
패키지가 잘 설치 되었다면 위 처럼 확인해볼 수 있다.
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import sys
from selenium.webdriver.common.keys import Keys
import urllib.request
import os
from urllib.request import urlretrieve
import time
import pandas as pd
import chromedriver_autoinstaller # setup chrome options
필요한 라이브러리들을 임포트 해준다.
혹시나 패키지가 없다고 뜨면 !pip install <패키지명> 으로 설치하면 된다.
chrome_path = "/content/drive/MyDrive/Colab Notebooks/chromedriver"
옵션을 설정하기 전에 위에서 설치한 chromedriver의 경로를 알려줘야 한다.
sys.path.insert(0,chrome_path)
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') # ensure GUI is off
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage') # set path to chromedriver as per your configuration
chrome_options.add_argument('lang=ko_KR') # 한국어
chromedriver_autoinstaller.install() # set the target URL
옵션들을 설정해주자.
colab은 새 창을 지원하지 않기 때문에 --headless 옵션이 필요하다. (로컬에서 하면 상관 없다.)
def selenium_scroll_option():
SCROLL_PAUSE_SEC = 3
# 스크롤 높이 가져옴
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 끝까지 스크롤 다운
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 10초 대기
time.sleep(SCROLL_PAUSE_SEC)
# 스크롤 다운 후 스크롤 높이 다시 가져옴
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
크롤링해서 이미지를 더 많이 얻기 위해 자동으로 스크롤 다운하게 만들어주기 위한 함수이다. 레퍼런스가 되는 깃헙의 코드를 가져왔다.
url = "https://www.google.com/" # set up the webdriver
driver = webdriver.Chrome(options=chrome_options)
일단 난 구글에서 크롤링을 할 예정이기 때문에 base url을 구글로 잡았다.
# driver 작동 테스트
driver.get(url)
driver.implicitly_wait(3) # element가 로드될 때까지 지정한 시간만큼 대기할 수 있도록 설정
# driver.get_screenshot_as_file('google_screen.png')
driver.close()
print(driver)
이 코드를 실행해보면 해당 url에 대하여 잘 작동하는지 알 수 있다.
작동이 잘 되면 위 처럼 session이 만들어진다.
courbet = "/content/drive/MyDrive/Colab Notebooks/"
테스트로 쿠르베 그림을 다운받을 것이라서 변수명을 검색할 단어와 똑같이 지었다.
# 키워드 검색하기
base_url = "https://www.google.co.kr/imghp?hl=ko" # 구글 이미지 검색
keyword=input("검색할 키워드를 입력 : ")
# print(type(a))
image_name = input("저장할 이미지 이름 : ")
driver = webdriver.Chrome(options=chrome_options)
driver.get(base_url)
# driver.find_element("xpath",'//*[@id="APjFqb"]') # 검색창 /html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/textarea
# browser = driver.find_element(By.ID, "APjFqb")
browser = driver.find_element(By.NAME, "q")
browser.clear()
browser.send_keys(keyword)
browser.send_keys(Keys.RETURN)
# 클래스를 찾고 해당 클래스의 src 리스트를 만들자
selenium_scroll_option() # 스크롤하여 이미지를 많이 확보
'''이미지 src요소를 리스트업해서 이미지 url 저장'''
images = driver.find_elements(By.CSS_SELECTOR,".rg_i.Q4LuWd") # 클래스 네임에서 공백은 .을 찍어줌
images_url = []
for i in images:
if i.get_attribute('src')!= None :
images_url.append(i.get_attribute('src'))
else :
images_url.append(i.get_attribute('data-src'))
driver.close()
# 겹치는 이미지 url 제거
print("전체 다운로드한 이미지 개수: {}\n동일한 이미지를 제거한 이미지 개수: {}".format(len(images_url), len(pd.DataFrame(images_url)[0].unique())))
images_url=pd.DataFrame(images_url)[0].unique()
if image_name == 'courbet' :
for t, url in enumerate(images_url, 0):
urlretrieve(url, courbet + image_name + '_' + str(t) + '.jpg')
# driver.close()
중요한 것은 내가 검색할 사이트의 검색창 element (html 맞아요)를 찾아서 검색할 수 있도록 코드에서 넣어주는 것인데 몇가지 방법이 있다.
(1) xpath 찾기
(2) By.ID 찾기
(3) By.NAME 찾기
(4) 기타
위 코드에서 주석처리해둔 부분은 구글 기본 url에 대한 정보들이니 참고하시길. 그 중에서 나는 By.NAME으로 검색 입력창을 찾았다.
최종적으로 코드를 실행하면 구글 검색창에서 키워드를 입력하고 검색될 수 있도록 했다.
# 자원회수 - 코드 실행 마지막에 quit driver
driver.quit()
마지막으로 자원을 회수해야하면 끝!
[1] https://nariyoo.com/python-how-to-run-selenium-in-google-colab/
[2] https://github.com/inhovation97/Image_classification_pipeline_Project/blob/main/pytorch/pytorch_project-crawling.ipynb
큰 도움 되었습니다 감사합니다.