ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인프런 동영상 웹 스크래핑하기 - 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('', '')

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

Designed by Tistory.