크롤링 시 문제 해결

Joey Lee·2020년 6월 10일
0

Web-crawling

목록 보기
4/5

아래 내용은 wanted 사이트 크롤링을 하면서 발생한 문제 해결한 방법이다.

1. Non-UTF-8 code 에러 해결방법

html로 된 일부 자료를 다시 편집해서 html 변수에 담아 사용하려고 했더니, 아래와 같은 에레 메시지가 떳다. html 변수에 한글이 있었는데 그게 오류를 일으킨 것이다.

> python wanted_main_category.py
  File "wanted_main_category.py", line 5
SyntaxError: Non-UTF-8 code starting with '\xed' in file wanted_main_category.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

해결책은 아래와 같은 코드를 추가해 주는 것이었다.
문서가 utf-8이라고 주석으로 선언해 주고, os, sys를 임포트 했다.

# coding=utf-8
import os, sys

2. StaleElementReferenceException 에러

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

따라서 상당히 많은 경우 아래처럼 해당 소스가 뜰 수 있을 때까지 충분한 시간을 주면 문제는 해결할 수 있다.

1> time.sleep(sec)
2> driver.implicitly+wait(sec)

3> WebDriverWait(driver, sec).untill(EC.presence_of_located((by.ID, ID)))

1번과 2번은 직관적이다. sec만큼 명시적으로 개발자가 선언한 만큼 강제로 동작을 일시정지한다. 3번은 처음보면 다소 난해한데.. 개념만 보면 가장 이상적인 로딩 대기방법이다. 특정 Element가 로딩되거나, 어떤 상태가 되는 것을 (클릭 가능한 상태, focus된 상태 등) 최대 sec만큼까지만 기다리는 것이다. 어떤 상태가 만족되면 sec를 모두 기다리지 않고도 다음 동작을 수행한다.

3. Selenium에서 html로 자료 가져오기

Selenium을 사용하다가 특정 소스의 html 형식으로 정보를 가져오고 싶으면 어떻게 해야 할까?

css_selector로 그냥 가져오면 WebElement 객체로 변수에 담긴다. 만약 html 태그 전체를 가져오고 싶다면, get_attribute 메소드를 사용하면 된다.

article = driver.find_element_by_css_selector('경로')
# WebElement로 리턴이 됨

article = driver.find_element_by_css_selector('경로').get_attribute("innerHTML")
# html 소스로 리턴이 됨
profile
안녕하세요!

0개의 댓글