Selenium 크롤링, KoNLPy 사용 중 발생한 오류들과 해결

timo·2021년 7월 7일
0

troubleshooting

목록 보기
1/11
post-thumbnail
post-custom-banner

BeautifulSoup에서 Selenium으로

처음에는 BeautifulSoup을 사용하여 데이터를 크롤링하려고 했다. 내가 크롤링하고자 했던 데이터는 '침착맨'님의 Youtube 영상 제목과 조회수였다.
하지만 원하는 데이터가 변수에 저장되지 않았다. 시도하기 전 구글링결과 BeautifulSoup으로 Youtube에서의 데이터를 크롤링했다는 게시물을 몇 발견했기 때문에 나의 코드 잘못이라고 생각했다.
좀 더 구글링해보니 StackOverflow에서 비교적 최근 게시물 하나를 발견했다.

https://stackoverflow.com/questions/67099127/scraping-new-youtube-videos-with-beautifulsoup

게시물 전체를 자세히 읽어보진 않았지만, 첫번째 답변에서 대강 구글에서 제공하는 YouTube API를 사용하지 않으면 데이터를 얻기 쉽지 않다는 내용을 확인할 수 있었다.
과제를 진행하는 기간이 길지 않았고, 과제 수준이 깊지 않기 때문에 해당 API를 공부하기 보단 Selenium을 사용하기로 결정했다.

Selenium의 스크롤 문제

Youtube 웹페이지 특성 상 채널의 동영상 탭에서 스크롤을 해야 과거의 동영상들이 로드된다. 따라서 '침착맨'님의 페이지, 동영상 탭에 진입한 후, 의도적으로 스크롤을 많이 내리는 코드를 작성해야 했다.

https://hello-bryan.tistory.com/194

관련 코드 지식은 해당 블로그의 글을 참고했다. 하지만 문제가 발생했는데 페이지 끝까지 스크롤을 내리는

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

이 코드에서 document.body.scrollHeight이 코드를 넣으니 스크롤이 전혀 움직이지 않았다.

Youtube 웹 페이지 특성인지 원인은 아직까지 잘 모르겠지만, 해당 코드 대신 200000과 같은 큰 숫자를 넣는 것은 잘 작동하였다.

import datetime

# whileSeconds초 동안 페이지를 스크롤하는 함수.
def doScrollDown(whileSeconds):
    start = datetime.datetime.now()
    end = start + datetime.timedelta(seconds=whileSeconds)
    while True:
        driver.execute_script('window.scrollTo(0, 200000);')
        time.sleep(1)
        if datetime.datetime.now() > end:
            break

따라서 위와 같은 함수를 작성하여 내가 원하는 초를 넣으면 그 시간동안 스크롤을 내리도록 하였다.

KoNLPy 관련 오류

예전 학교 수업에서 KoNLPy를 사용해볼 땐 맥북에서 과제를 진행했었다. 맥 OS에선 해당 패키지를 설치하는데 큰 과정이 필요없기 때문에 오류 없이 수월하게 과제를 수행했던 기억이 있다.
하지만 이번 과제는 이런저런 사정으로 윈도우 데스크탑으로 진행하게 되었고 새롭게 KoNLPy를 설치해야했다.

https://konlpy.org/ko/latest/install/#id2

해당 공식 웹사이트에서 설치 절차를 확인할 수 있다. 윈도의 경우 본 패키지 설치 전 크게 JDKJPype1의 설치가 필요했다. JDK는 기존에 설치되어있었기 때문에 큰 문제가 없었지만, JPype1가 쉽지 않았다.

JPype1 whl 파일 설치 오류

공식 웹사이트에서 whl파일을 다운받아 설치하라고 적혀있었지만, 해당 유형의 파일을 처음 설치해본 탓에 설치법 자체도 낯설었다.

https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

해당 사이트에서 whl파일을 다운받고 적절한 경로에 위치시킨 뒤 pip install JPype1~~.whl 식의 코드로 설치할 수 있었다.

하지만 fileName.whl is not a supported wheel on this platform.
이라는 오류 메세지가 발생했다.
구글링 결과 whl파일 이름에서 cp가 Python의 버전과 관련된 정보를 담고 있었다.
예를 들어 cp35는 Python 3.5버전에 맞다는 의미이다.

3.9버전을 사용하고있는 나는 JPype1-1.1.2-cp39-cp39-win_amd64.whl을 다운받아 다시 시도했고, 설치가 가능했다.

ImportError

Jpipe1를 설치하면 마지막으로 KoNLPy를 설치한다.

pip install konlpy

정상적으로 작동하는지 확인하기위해 import konlpy코드를 실행해보았다. 하지만
ImportError: DLL load failed while importing _jpype: DLL 초기화 루틴을 실행할 수 없습니다. 라는 에러 메세지와 함께 import가 불가능했다.

구글링 결과
https://youngwonhan-family.tistory.com/66
해당 블로그 글을 통해 문제를 해결할 수 있었다.

visual c++ redistribution for visual studio 2015의 설치 유무, JAVA_HOME환경설정 여부, Jpype1까지 모두 정상적이었기 때문에 블로그의 방법대로 기존 Jpype1을 삭제하고 다시 설치하기로했다.

pip uninstall JPype1
pip install JPype1-py3


이후 정상적으로 import된 것을 확인할 수 있었다.

convertString 관련 오류

import konlpy는 해결했지만, 이어서

from konlpy.tag import Okt
twitter_tag = Okt()

Okt()를 호출하니 TypeError: startJVM() got an unexpected keyword argument 'convertStrings' 이라는 오류메세지를 확인할 수 있었다.

https://gyulogs.tistory.com/130

해당 블로그 글을 통해 해결할 수 있었다. jvm.py 파일을 수정하고 ipynb파일을 다시 로드하니 정상적으로 실행되었다.

profile
Backend Developer
post-custom-banner

0개의 댓글