본문 바로가기
TOP
데이터 스킬업/웹크롤링

[파이썬:웹크롤링] #20 셀레니움과 input으로 로그인 하기 for 인스타그램

by 티챠림 2022. 1. 16.

[왕초보 웹크롤링 무작정 따라하기] 로그인 하기, 로그인 실패 시 재입력, 입력값 지우기, 셀레니움, 동적페이지, 셀레니움 파싱, for반복문, input


업무지옥을 탈출한 건에 대하여(feat.업무자동화) 

#20 셀레니움과 input으로 로그인 하기 for 인스타그램


 


이전에 셀레니움을 통해서 인스타그램 피드 데이터 크롤링을 성공했다. 하지만 이전 코드에서는 아이디와 비밀번호가 고정되어 있었고, 모든 피드의 데이터를 내려받게 되어있었다. 아이디와 비밀번호가 고정되어 있으면 다른 계정을 크롤링 하려고 할때 마다 코드를 수정해 줘야한다는 점이 불편하다. 그리고 전체 피드 데이터를 받는 것은 너무 시간이 많이 들기 때문에 개수를 지정하면 더 활용도가 좋을 것이다.

 

코드를 실행하면 값을 직접 입력할 수 있도록 하는 함수 input()을 활용해보자!

print("아이디와 비밀번호를 입력하세요.")
id = input("ID: ")    #아이디 입력받기
password = input("PASSWORD: ")    #비밀번호 입력받기

우선 사용할 모듈을 활성화 시키고 인스타그램 로그인 창을 띄워준다.

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from openpyxl import Workbook
import datetime

# 01.웹 열기
dr = webdriver.Chrome()  # 웹드라이버 실행 코드 지정
wait = WebDriverWait(dr, 5)  # 대기 코드 지정
dr.set_window_size(414, 800)  # 웹창 크기 지정
dr.get('https://www.instagram.com/')  # 인스타그램 사이트 열기
dr.implicitly_wait(2)  # 창이 뜰때까지 기다림

 

이번에는 def를 사용해 로그인 정보를 입력하는 함수를 만들어 주기로 했다. 이렇게 하면 나중에 코드를 훨씬 더 깔끔하게 정리할 수 있다. 

def ilogin():
    #02.로그인

    #요소 지정
    id_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(1) > div > label > input")   #ID입력창
    password_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(2) > div > label > input") #password 입력창
    login_button = dr.find_element_by_css_selector('#loginForm > div > div:nth-child(3) > button')  #로그인 버튼


    #동작 실행하기
    act = ActionChains(dr) #동작 실행 코드 지정

    print("아이디와 비밀번호를 입력하세요.")
    id = input("ID: ")    #아이디 입력받기
    password = input("PASSWORD: ")    #비밀번호 입력받기
    act.send_keys_to_element(id_box, '{}'.format(id)).send_keys_to_element(password_box, '{}'.format(password)).click(login_button).perform()
    time.sleep(3)
    
    
   #테스트 코드
   ilogin()

테스트 코드를 돌려 보니 정상적으로 로그인 창이 뜨고, 파이참 실행화면에 ID와 PASSWORD를 입력하라는 지시가 나온다. 아이디와 비밀번호를 입력하면 로그인 되는 것을 확인할 수 있다.

 

로그인 성공 시 vs 실패 시, 브라우저 화면


위 코드만으로는 아이디나 비밀번호가 틀리면 코드를 다시 실행시켜야하는 불편함이 있다. 그렇다면 로그인 실패시 아이디와 비밀번호를 재입력 할 수 있도록 while 반복문을 만들어 주자.

def ilogin():
    #02.로그인

    #요소 지정
    id_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(1) > div > label > input")   #ID입력창
    password_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(2) > div > label > input") #password 입력창
    login_button = dr.find_element_by_css_selector('#loginForm > div > div:nth-child(3) > button')  #로그인 버튼


    #동작 실행하기
    act = ActionChains(dr) #동작 실행 코드 지정

    print("아이디와 비밀번호를 입력하세요.")
    id = input("ID: ")    #아이디 입력받기
    password = input("PASSWORD: ")    #비밀번호 입력받기
    act.send_keys_to_element(id_box, '{}'.format(id)).send_keys_to_element(password_box, '{}'.format(password)).click(login_button).perform()
    time.sleep(3)

    while True:
        fail_login = dr.current_url
        if fail_login == 'https://www.instagram.com/':
            print("아이디 또는 비밀번호를 잘못 입력하였습니다. 다시 입력해주세요.")

            #로그인 초기화
            id_box.send_keys(Keys.CONTROL + "a")
            id_box.send_keys(Keys.DELETE)
            password_box.send_keys(Keys.CONTROL + "a")
            password_box.send_keys(Keys.DELETE)

            # 다시 입력하기
            act = ActionChains(dr)  # 동작 실행 코드 지정

            id = input("ID: ")  # 아이디 입력받기
            password = input("PASSWORD: ")  # 비밀번호 입력받기
            act.send_keys_to_element(id_box, '{}'.format(id)).send_keys_to_element(password_box,'{}'.format(password)).click(login_button).perform()
            time.sleep(3)

        else:
            break #반복 종료
                    
 #테스트 코드
 ilogin()

테스트 코드를 실행하고 잘못된 정보를 입력하면 로그인에 실패하게 되고, 다시 입력하라는 지시가 로그인에 성공할 때까지 반복된다.

 

잘못된 아이디와 비밀번호를 입력했을 경우의 실행창


 

다음에는 크롤링할 피드 갯수를 정해 내려받는 코드를 만들어 보기로 하자. 

 


 

[system]

input 사용법을 깨달았습니다.

def 숙련도가 올라갑니다.

 

현재 클래스 :  Class 3




댓글