ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인프런 동영상 웹 스크래핑하기 - 1: 준비 과정
    개발/웹크롤링 2022. 1. 8. 15:40

    놀랍게도 첫 포스팅입니다. 앞으로는 이곳에 저의 발자취를 남길 것입니다.

    오늘 해볼 코딩은 인프런 강의 영상을 스크래핑하는 법에 대한 것입니다. 강의 영상을 오프라인으로 다운로드받아야 할 일이 있는데, 인프런에서 제공해주지 않아서 파이썬을 이용하여 추출해봤습니다.

    참고로 이렇게 얻은 강의 영상을 상업적으로 이용하거나 무단 배포할 시 처벌 받을 수 있으니 조심하시기 바랍니다.

     

    우선 도구부터 소개합니다.

     

    1. 파이썬
      기본적인 도구죠. 필수적으로 필요합니다. 3.x 가급적 최신 버전으로 준비해주세요. 저는 3.8.8 버전을 이용했습니다.
    2. 셀레니움 (selenium)
      브라우저를 이용해 웹 크롤링 등에 활용합니다. 저는 이 중에서도 seleniumwire라는 라이브러리를 다운 받아 사용했습니다. pip를 통해 selenium, seleniumwire 둘 다 다운로드 받아주세요
      pip install selenium
      pip install selenium-wire​
    3. 크롬 드라이버
      셀레니움에서 크롬을 사용하기 위해 필요합니다. https://chromedriver.chromium.org/downloads에서 다운로드 가능합니다. 자신의 버전에 맞는 크롬을 다운로드 받아서 사용하시면 됩니다. 프로젝트가 있는 폴더에 위치시켜주세요(혹은 sys.path에 해당하는 폴더)
      크롬 버전 확인 : 크롬 우측 상단 메뉴 클릭 -> 도움말 -> Chrome 정보 클릭

    준비를 마쳤으면 바로 분석해봅시다. 우선 셀레니움을 통해서 크롬부터 켜봅시다. 파이썬 인터프리터 창을 엽니다.

    >>> from selenium import webdriver
    >>> driver = webdriver.Chrome()

    이렇게 하면 크롬 창이 뜹니다. 이제 인프런 홈페이지로 가보겠습니다.

    >>> driver.get('https://inflearn.com')

    driver.get(url) -> 브라우저가 url로 이동합니다.

     

    한 번 로그인 창을 띄워보도록 할까요?

    로그인 버튼을 선택하고 싶은데요. 개발자 모드(F12)를 엽니다.

    signin 클래스를 가진 a 태그네요. 다음과 같이 클래스로 선택할 수 있습니다.

    >>> loginbtn = driver.find_element('class name', 'signin')

    이렇게 얻었으면 click 메서드를 통해 click 이벤트를 발생시킬 수 있습니다.

    >>> loginbtn.click()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\src\anaconda\lib\site-packages\selenium\webdriver\remote\webelement.py", line 81, in click
        self._execute(Command.CLICK_ELEMENT)
      File "C:\src\anaconda\lib\site-packages\selenium\webdriver\remote\webelement.py", line 710, in _execute
        return self._parent.execute(command, params)
      File "C:\src\anaconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
        self.error_handler.check_response(response)
      File "C:\src\anaconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
      (Session info: chrome=97.0.4692.71)

    이런. 에러가 나는군요. element not interactable이라고 하네요. 클릭할 수 없다고 말하고 있습니다. 그런데 분명히 클릭이 가능할텐데... 이럴 때에는 find_elements로 찾아줍니다. 사실 자바스크립트를 써서 dom 객체로 먼저 테스트해보면 가장 좋기는 합니다. 그러나 이렇게 시행착오를 겪으면서 하는 것도 좋죠. 아니면 나중에 설명하겠지만 xpath를 활용하면 코드 한 줄로 가능합니다.

    >>> loginbtns = driver.find_elements('class name', 'signin') # 리스트로 받아오기
    >>> loginbtn = None # 로그인 버튼을 미리 할당
    >>> for btn in loginbtns:
    >>>   # 로그인이라는 글자가 있으면 로그인 버튼 할당하기
    >>>   if '로그인' in btn.text: # (element).text를 통해서 innertext에 접근
    >>>     loginbtn = btn
    >>> loginbtn.click()

    로그인 창을 띄우는 데 성공했습니다. 다음 시간에는 사용자에게 아이디 비밀번호를 받아서 자동으로 로그인하는 기능을 만들겠습니다.

Designed by Tistory.