Java) 크롤링 에러모음

박우영·2023년 6월 4일
0

트러블 슈팅

목록 보기
14/19

개요


java, spring boot, selenium,Spring batch 을 활용하여 크롤링 할때 겪은 에러 모음 입니다.

프로젝트 에서 발생한 에러들의 모음입니다.

에러처리

1. InterruptedException

  • 에러발생요인
    Tread.sleep 으로

크롤링을 자동화 하기위해서 while문을 활용했는데 무분별하게 한다면 화면도 나오지않고 지속적인 요청을 하여 실행하기때문에 불필요하게 많은 요청을 날려 Ip 가 차단될 수 있습니다. 따라서 Tread.sleep 을 적용하게 되었고(화면 응답시간 대기) 당연히 InterruptedException 이 발생하게 되었습니다. 물론 try-catch 를 통해 InterruptedException 처리를 잡아 주어서 batch가 실패되진 않지만 동시성 문제를 해결해야함.

2. StaleElementReferenceException

  • 에러 발생요인
    StaleElementReferenceException 에러는 Web Element에 접근할 때, DOM에 해당 Element가 존재하지 않을 때 발생하는 에러이다. 페이지가 완전히 로딩되기 전에 참조한다거나 다른 Webdriver의 Element를 참조할 때 발생하기 쉽다.

3. UnexpectedRollbackException

에러로그

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:752)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:152)

4. WebDriverException

org.openqa.selenium.WebDriverException: unknown error: unhandled inspector error: {"code":-32000,"message":"No node with given id found"}
  (Session info: chrome=114.0.5735.90)
Build info: version: '4.8.3', revision: 'e5e76298c3'
System info: os.name: 'Mac OS X', os.arch: 'aarch64', os.version: '13.1', java.version: '17.0.6'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [0821c08142e7449a79aec524432deb75, findChildElement {id=960B296000B7F791BDD9196B06FC46BC_element_28, using=tag name, value=a}]
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 114.0.5735.90, chrome: {chromedriverVersion: 114.0.5735.90 (386bc09e8f4f..., userDataDir: /var/folders/dm/kzd96t2j09j...}, goog:chromeOptions: {debuggerAddress: localhost:63024}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: MAC, proxy: Proxy(), se:cdp: ws://localhost:63024/devtoo..., se:cdpVersion: 114.0.5735.90, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 0821c08142e7449a79aec524432deb75
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

🤔 발생원인은 뭘까?
사실 이 에러의 원인은 정확하게 파악하지 못했지만 네트워크 오류라고 생각 하고있다.
a 태그를 찾는 곳에서 에러가 발생한거같은데

로컬과 배포 환경차이

Dockerfile을만들어 배포하다보니 로컬에선 정상적으로 작동하지만

다음과같은 파일의 경로를 못읽는것같다. 그래서 도커 내부에 크롬과 크롬드라이버를 설치 할 수있도록 Dockerfile을 설정 해줬다. 기존 jdk 에서 데비안 계열의 slim 으로 변경해줬다.

FROM openjdk:17.0.1-jdk-slim
RUN apt-get -y update

RUN apt -y install wget

RUN apt -y install unzip

RUN apt -y install curl



RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

#RUN apt -y install ./google-chrome-stable_current_amd64.deb
RUN dpkg -i ./google-chrome-stable_current_amd64.deb || true
RUN apt-get install -f

RUN wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip

RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/bin

ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} ${JAVA_TIMEZ} ${JAVA_ACTIVE} -jar /app.jar"]
  • 문제 1
    크롤링까진 정상 작동하지만
    2023-06-07 12:41:02 qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory

  • 2023-06-07T12:41:05.060+09:00 WARN 7 --- [ scheduling-1] o.o.selenium.remote.RemoteWebDriver : Support for Legacy Capabilities is deprecated; You are sending the following invalid capabilities: [ignoreProtectedModeSettings]; Please update to W3C Syntax: https://www.selenium.dev/blog/2022/legacy-protocol-support/
    2023-06-07 12:41:05 2023-06-07T12:41:05.112+09:00 ERROR 7 --- [ scheduling-1] com.goodjob.batch.BatchConfiguration : Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
    2023-06-07 12:41:05 Host info: host: '7be89368208e', ip: '172.17.0.2'

위 두가지 에러가 발생했습니다 문제를 확인한 결과 selenium 이 4.3 이후 업그레이드 되면서 deprecated 됐던 코드가 포함되어있었습니다.

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--headless=new");
        chromeOptions.addArguments("--no-sandbox");
        chromeOptions.addArguments("--disable-dev-shm-usage");
        chromeOptions.addArguments("--disable-gpu");
        chromeOptions.setCapability("ignoreProtectedModeSettings", true);

위 코드에서 setCapability 코드가 deprecated 코드입니다. 근데 왜 intellij 로 실행한 로컬에선 정상 작동했던걸까요??

참조


셀레니움 홈페이지

0개의 댓글