파이썬으로 beautifulshop을 이용해서 크롤링을 하고 있었습니다. 그런데, 특정 사이트가 웹 브라우저가 아니라고 자꾸 418 client 에러를 뱉어냅니다.
결국, 크롬 selenium을 이용해서 실제 크롬 웹 브라우저를 띄우고 크롤링을 해야겠다는 생각으로 시도해 보았습니다.
결과는 매우 잘 되는 것을 확인할 수 있었고, 아래에 이러한 과정을 기록해 놓았습니다.
추가로 우분투에서 특정 사이트를 크롤링 하거나 로그인 하는 작업을 할때, request로 가능한 사이트가 있습니다. 하지만, 많은 사이트들은 파이썬의 일반 request를 이용하면 헤더를 보거나 다른 신호를 파악해서 에러를 반환합니다. 크롤링으로 너무 많은 작업을 요청하면 사이트에 문제가 생기거나 할 수 있어서 그렇습니다.
파이썬의 request로 특정 사이트 로그인 하는 법 보러 가기
이럴때, 크롤링을 성공하기 위해서는 구글 크롬, 크롬 드라이버와 셀레니엄이라는 것을 통해서 실제 크롬을 띄워서 로그인하거나 크롤링 할 수 있는 방법이 있습니다.
오늘은 우분투의 /usr/local/bin/chromedriver 위치에 ChromeDriver를 설치하고 Selenium을 설치하는 방법과 selenium을 통해서 웹 크롤링을하는 법을 알아보도록 하겠습니다.
필요하신 분들 참고하시면 좋을 것 같습니다.
Table Of Contents
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)
저는 다음의 링크에서 다운 받았습니다.
위에 없는 이하 버전은 아래에서 다운 가능합니다.
다운로드 | 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()
'IT' 카테고리의 다른 글
리눅스(우분투 20.04)에서 커맨드라인으로 구글 크롬(google-chrome) 설치하기 (1) | 2024.09.23 |
---|---|
워드프레스 블로그 홈페이지 1분만에 자동 목차 차례 만들고 적용하기 - 플러그인으로 가장 쉽게 하기 (9) | 2024.08.28 |
파이썬(python3) 실행파일(exe) 만드는 법 - pyinstaller 설치부터 생성까지 (29) | 2024.07.22 |
구글 애드센스 최초로 가입하는 법과 티스토리 계정 연결 ( 가족 명의로 가입 하기) (16) | 2024.05.20 |
파이썬에서 DB 프로시저 호출하기 - pyodbc에서 procedure 호출 (1) | 2024.05.14 |