본문 바로가기
IT

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

by developer's warehouse 2024. 8. 17.

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

결국, 크롬 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