[colab] 에서 웹 크롤링하기 - selenium

kiteday·2024년 2월 7일
1

Web

목록 보기
2/4

예전에 짰던 크롤링 코드를 colab 버전으로 필요해서 다시 정리해두었다.
구글에 검색하면 이것저것 많은데 다 이전 selenium 버전으로 되어 있는 등 오류를 잡을 수가 없었다.
그래서 그냥 찾아서 짜버린 코드를 공유한다. (2023년 09월 기준 코드)

Colab notebook code는 여기를 클릭하세요.

colab에서 selenium 크롤링 코드를 돌리는 방법은 다음과 같은 단계를 따른다.

  1. 구글 드라이브 마운트
  2. Selenium 설치 & 내 구글 드라이브에 chromedriver 설치 (chromedriver는 최초 1회)
  3. 실행준비 - chrome_options 설정 등
  4. 이미지 크롤링

1. 구글 드라이브 마운트

from google.colab import drive
drive.mount('/content/drive')

가장 먼저 개인의 구글 드라이브와 코드를 연결하자. 이미지 크롤링 저장 위치와 chromedriver 로딩을 위함이다. 위 코드를 실행해서 뜨는 팝업창으로 드라이브 마운트를 완료한다.

2. Selenium 설치 & 내 구글 드라이브에 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__)

패키지가 잘 설치 되었다면 위 처럼 확인해볼 수 있다.

3. 실행 준비

3.1. 라이브러리 임포트

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 <패키지명> 으로 설치하면 된다.

3.2. chrome_options 설정

 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 옵션이 필요하다. (로컬에서 하면 상관 없다.)

3.3. 자동 스크롤 함수

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

크롤링해서 이미지를 더 많이 얻기 위해 자동으로 스크롤 다운하게 만들어주기 위한 함수이다. 레퍼런스가 되는 깃헙의 코드를 가져왔다.

4. 이미지 크롤링!

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

profile
공부

1개의 댓글

comment-user-thumbnail
2024년 7월 2일

큰 도움 되었습니다 감사합니다.

답글 달기