파이썬으로 beautifulshop을 이용해서 크롤링을 하고 있었습니다. 그런데, 특정 사이트가 웹 브라우저가 아니라고 자꾸 418 client 에러를 뱉어냅니다.
결국, 크롬 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' 카테고리의 다른 글
워드프레스 블로그 홈페이지 1분만에 자동 목차 차례 만들고 적용하기 - 플러그인으로 가장 쉽게 하기 (9) | 2024.08.28 |
---|---|
파이썬(python3) 실행파일(exe) 만드는 법 - pyinstaller 설치부터 생성까지 (29) | 2024.07.22 |
구글 애드센스 최초로 가입하는 법과 티스토리 계정 연결 ( 가족 명의로 가입 하기) (16) | 2024.05.20 |
파이썬에서 DB 프로시저 호출하기 - pyodbc에서 procedure 호출 (1) | 2024.05.14 |
레디스(Redis) AOF(Append Only File)을 통해 데이터를 유지하는 방법 (59) | 2024.05.03 |