본문 바로가기
IT

우분투 리눅스(ubuntu linux)에서 selenium으로 웹 크롤링 하기

by developer's warehouse 2024. 8. 17.

파이썬으로 beautifulshop을 이용해서 크롤링을 하고 있었습니다. 그런데, 특정 사이트가 웹 브라우저가 아니라고 자꾸 418 client 에러를 뱉어냅니다.

결국, 크롬 selenium을 이용해서 실제 크롬 웹 브라우저를 띄우고 크롤링을 해야겠다는 생각으로 시도해 보았습니다.

결과는 매우 잘 되는 것을 확인할 수 있었고, 아래에 이러한 과정을 기록해 놓았습니다.

 

추가로 우분투에서 특정 사이트를 크롤링 하거나 로그인 하는 작업을 할때, request로 가능한 사이트가 있습니다. 하지만, 많은 사이트들은 파이썬의 일반 request를 이용하면 헤더를 보거나 다른 신호를 파악해서 에러를 반환합니다. 크롤링으로 너무 많은 작업을 요청하면 사이트에 문제가 생기거나  할 수 있어서 그렇습니다. 

파이썬의 request로 특정 사이트 로그인 하는 법 보러 가기

이럴때, 크롤링을 성공하기 위해서는 구글 크롬, 크롬 드라이버와 셀레니엄이라는 것을 통해서 실제 크롬을 띄워서 로그인하거나 크롤링 할 수 있는 방법이 있습니다.

오늘은 우분투의 /usr/local/bin/chromedriver 위치에 ChromeDriver를 설치하고 Selenium을 설치하는 방법과 selenium을 통해서 웹 크롤링을하는 법을 알아보도록 하겠습니다. 

 

필요하신 분들 참고하시면 좋을 것 같습니다.

우분투 리눅스(ubuntu linux)에서 selenium으로 웹 크롤링 하기

1. Selenium 설치

다음을 수행하여 selenium을 설치합니다.

lswhh@DESKTOP-HQPQNKV:~$ pip3 install selenium
....
Downloading sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB)
Downloading h11-0.14.0-py3-none-any.whl (58 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 58.3/58.3 kB 2.4 MB/s eta 0:00:00
Installing collected packages: sortedcontainers, websocket-client, typing_extensions, sniffio, PySocks, h11, exceptiongroup, attrs, wsproto, outcome, trio, trio-websocket, selenium
  Attempting uninstall: typing_extensions
    Found existing installation: typing_extensions 4.1.1
    Uninstalling typing_extensions-4.1.1:
      Successfully uninstalled typing_extensions-4.1.1
Successfully installed PySocks-1.7.1 attrs-24.2.0 exceptiongroup-1.2.2 h11-0.14.0 outcome-1.3.0.post0 selenium-4.23.1 sniffio-1.3.1 sortedcontainers-2.4.0 trio-0.26.2 trio-websocket-0.11.1 typing_extensions-4.12.2 websocket-client-1.8.0 wsproto-1.2.0

[notice] A new release of pip is available: 20.2.4 -> 24.2
[notice] To update, run: python3 -m pip install --upgrade pip

 

2. Chrome 및 ChromeDriver 설치

2.1 Chrome 설치

Chrome이 설치되어 있지 않다면, 다음 명령어로 설치합니다:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb

 

2.2 ChromeDriver 설치

ChromeDriver를 설치합니다. Chrome의 버전과 맞는 드라이버를 다운로드해야 합니다.

# Chrome 버전 확인
google-chrome --version

# ChromeDriver 다운로드 (버전은 확인한 Chrome 버전으로 변경)
wget https://chromedriver.storage.googleapis.com/<버전>/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver

하지만, 내 버전이 너무 높아서 최신은 위의 링크에 존재하지 않았습니다.

그 이상은 최신은 아래에서 받을 수 있었습니다.

Chrome for Testing availability (googlechromelabs.github.io)

 

Chrome for Testing availability

chrome-headless-shellmac-arm64https://storage.googleapis.com/chrome-for-testing-public/127.0.6533.99/mac-arm64/chrome-headless-shell-mac-arm64.zip200

googlechromelabs.github.io

저는 다음의 링크에서 다운 받았습니다.

https://storage.googleapis.com/chrome-for-testing-public/127.0.6533.99/linux64/chromedriver-linux64.zip

위에 없는 이하 버전은 아래에서 다운 가능합니다.

다운로드 | ChromeDriver | Chrome for Developers

다운이 완료되면 다음과 같이 압축 해제후 PATH에 포함된 경로에 넣어주고 실행 권한을 줍니다. 

unzip chromedriver_linux64.zip
sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
google-chrome-stable (127.0.6533.99-1) 설정하는 중입니다 ...
update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/x-www-browser (x-www-browser) in auto mode
update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/gnome-www-browser (gnome-www-browser) in auto mode
update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/google-chrome (google-chrome) in auto mode
libfile-basedir-perl (0.08-1) 설정하는 중입니다 ...
libfile-desktopentry-perl (0.22-1) 설정하는 중입니다 ...
libfile-mimeinfo-perl (0.29-1) 설정하는 중입니다 ...
Processing triggers for desktop-file-utils (0.24-1ubuntu3) ...
Processing triggers for mime-support (3.64ubuntu1) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu1) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for fontconfig (2.13.1-2ubuntu3) ...
lswhh@DESKTOP-HQPQNKV:~$ google-chrome --version
Google Chrome 127.0.6533.99

 

 

예제 코드

다음 예제 코드로 네이버 쇼핑에서 키워드로 검색 후 결과를 html로 얻어 올 수 있습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Chrome 옵션 설정
chrome_options = Options()
# chrome_options.add_argument("--headless")  # 브라우저를 보이지 않게 실행 (선택 사항)
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")

# Chrome 드라이버 서비스 설정
service = Service('/usr/local/bin/chromedriver')

# 웹 드라이버 초기화
driver = webdriver.Chrome(service=service, options=chrome_options)

# Naver 쇼핑 검색 페이지 열기
search_url = "https://search.shopping.naver.com/search/all?query=%ED%8E%AB%EB%A0%88%ED%84%B0%20%EB%AA%BD%EC%89%AC%EC%95%84%20%EB%B0%B0%EB%B3%80%ED%8C%A8%EB%93%9C%20%EC%A0%88%EC%95%BD%ED%98%95%20100%EB%A7%A4%20(50%20x%2040cm)"
driver.get(search_url)

# 페이지 로딩 대기 (ID로 요소가 로드될 때까지)
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "content"))
    )
except Exception as e:
    print("Error waiting for page to load:", e)

# ID가 "content"인 요소 가져오기
content_element = driver.find_element(By.ID, "content")

# 하위 항목의 HTML 텍스트 가져오기
html_content = content_element.get_attribute('innerHTML')

# HTML 내용 출력
print(html_content)

# 드라이버 종료
driver.quit()
facebook twitter kakaoTalk kakaostory naver band shareLink