개발/웹크롤링

인프런 동영상 웹 스크래핑하기 - 2: 자동로그인 기능 - 1

제이든초이 2022. 1. 8. 16:46

이제부터는 인터프리터가 아닌, 프로젝트로 관리하겠습니다. 저는 파이참을 이용해서 진행할 예정입니다.

 

우선, inf-video라는 프로젝트를 만들어주었습니다.

프로젝트 생성

참고로 아나콘다 3.9로 하니 seleniumwire가 pip에서 찾을 수 없는 상황이 발생했습니다. 그러니 애초부터 높은 버전의 아나콘다 대신 기존에 쓰던 파이썬을 이용하거나 설정을 통해서 잘 설치해주시면 됩니다. 제 경우에는 이렇게 해결했습니다.

 

[설정 방법]

다른 인터프리터를 사용했습니다.

그리고 프로젝트 폴더에 버전에 맞는 크롬드라이버를 설치해주셔야 합니다. https://chromedriver.chromium.org/downloads를 통해서 설치할 수 있습니다.

chromedriver.exe를 넣어주세요.

자, 시작해봅시다. 우선 video_scrapper.py를 만들어주세요.

from seleniumwire import webdriver

DEST_PATH = r'C:\src\inflearn' # 파일을 저장할 디렉토리
page_url = 'https://www.inflearn.com/' # 인프런 주소


class VideoScrapper:

    def __init__(self):
        self._driver = webdriver.Chrome()

위와 같이 기본적으로 사용할 변수를 선언하고, VideoScrapper라는 클래스를 만들어줬습니다. 이제 로그인 메서드를 만들어봅시다. 로그인 메서드의 동작 순서는 다음과 같습니다.

  1. 페이지 접속
  2. 로그인 버튼 클릭해서 로그인 창 띄우기
  3. 입력받은 아이디, 비밀번호 입력
  4. 로그인 버튼 클릭해서 로그인하기
  5. 로그인 후 강의목록으로 들어가기

우선 1번까지 구현해봅시다.

class VideoScrapper:

    def __init__(self):
        self._driver = webdriver.Chrome()

    def login(self, loin_id, pwd):
        self._driver.get(page_url)

이렇게 인스턴스 메서드로 선언해줍니다. 그 다음에는 이전 시간에 했던 로그인 버튼 클릭해서 로그인 창 띄우는 것까지 구현하겠습니다.

    def login(self, loin_id, pwd):
        self._driver.get(page_url)

        # 로그인 창을 띄우는 팝업 버튼
        popup_buttons = self._driver.find_elements('class name', 'signin')
        for btn in popup_buttons:
            if '로그인' in btn.text:
                btn.click()

처음 보는 표현이네요. xpath로 엘레멘트를 구해봤습니다. 문서에 있는 a 태그 중 '로그인'을 innerText로 갖고 있는 엘레멘트를 구하라는 뜻입니다. 자세한 것은 xpath에 대해서 다른 문서를 읽어주세요. 그나저나 첫 번째 파라미터를 문자열 그대로 치는 게 불편하니 selenium에서 임포트해줍시다.

from seleniumwire import webdriver
from selenium.webdriver.common.by import By
...
...
# 로그인 창을 띄우는 팝업 버튼
        popup_btn = self._driver.find_elements(By.CLASS_NAME, 'signin')
...

이렇게 쓸 수 있습니다.

이제 로그인 창까지 잘 가는지 테스트해봐야겠죠? 맨 아래에 실행 코드를 작성합니다.

if __name__ == '__main__':
    vs = VideoScrapper()
    vs.login('', '')

지금까지 작성한 전체 코드입니다.

from seleniumwire import webdriver
from selenium.webdriver.common.by import By

DEST_PATH = r'C:\src\inflearn'
page_url = 'https://www.inflearn.com/'


class VideoScrapper:

    def __init__(self):
        self._driver = webdriver.Chrome()

    def login(self, loin_id, pwd):
        self._driver.get(page_url)

        # 로그인 창을 띄우는 팝업 버튼
        popup_buttons = self._driver.find_elements(By.CLASS_NAME, 'signin')
        for btn in popup_buttons:
            if '로그인' in btn.text:
                btn.click()


if __name__ == '__main__':
    vs = VideoScrapper()
    vs.login('', '')

잘 작동하는군요. 다음 글에서는 로그인 입력을 받고, 페이지에 넣어서 로그인해보겠습니다.