Login en Instagram con Python y Selenium (Automatización web)

Hoy veremos como crear un Login en Instagram con Python y Selenium. En futuras entradas también iré dejando como seguir personas, dejar de seguir, dar likes, publicar entradas y alguna cosa más.

Por cierto, PUEDES SEGUIRNOS EN INSTAGRAM 🙂

Login en Instagram con Python y Selenium
Login en Instagram con Python y Selenium
Índice()

    Aviso Importante

    Importante: este tipo de técnicas pueden ser penalizadas (en este caso por Instagram) y por lo tanto pueden llegar a suspender la cuenta, así que es preferible hacer pruebas con cuentas nuevas de prueba.

    Descargar GeckoDriver

    Las pruebas las haré con el navegador Mozilla, pero puedes cambiar a Chrome modificando algunas lineas en el código.

    Lo primero que debemos hacer es descargar GeckoDriver, y que es GeckoDriver? Para Mozilla Firefox hasta la versión 47, nunca necesitamos GeckoDriver. Pero Mozilla Firefox después de la versión 47, viene con Marionette, que es un controlador de automatización para Mozilla. Con ello podemos controlar de forma remota la interfaz de usuario o el JavaScript interno de una plataforma Gecko, como Firefox. Entonces, necesitamos GeckoDriver para FireFox. Si no lo usamos, no podremos crear una instancia del objeto de GeckoDriver y ejecutar Firefox. Esa es la razón por la que se necesita un GeckoDriver.

    Puedes descargarlo de aquí: https://github.com/mozilla/geckodriver/releases, en mi caso sería win64.zip, quizá tu necesites otra versión, chequea ésto antes de seguir.

    Descargar GeckoDriver - Login en Instagram con Python
    Descargar GeckoDriver

    Estructura del Proyecto

    Una vez tengamos descargado DeckoDriver, lo descomprimimos y lo alojamos en el directorio de nuestro proyecto, voy a mostrarles una imagen de como quedaría la estructura de nuestro proyecto.

    Estructura de Proyecto - Login en Instagram con Python
    Estructura de Proyecto - InstagramBot

    Una carpeta que la llame "InstagramBot" y dentro de ella el archivo geckodriver.exe y el archivo instagram_bot.py donde irá nuestro código para realizar el Login en Instagram. Si son observadores podrán ver que también hay una carpeta llamada venv, ésta carpeta se crea utilizando virtualenv (entorno virtual en python), si no tienes idea de que hablo te dejo una entrada que se creó hace tiempo sobre esto, pero para este ejemplo no le des importancia, puedes hacerlo sin utilizar un entorno virtual. Entornos virtuales en Python (virtualenv)

    Código en Python 3

    Dejaré todo el código aquí y más abajo iré explicando línea por línea. El módulo extra que necesitamos para que nuestro código funcione es selenium, así que si no lo tenemos instalado utilizaremos la consola para instalarlo con pip: pip install selenium

    from selenium import webdriver
    from selenium.webdriver.firefox.options import Options
    import time
    import random
    
    def login():
    	
    	# PATH DONDE SE ENCUENTRA ALOJADO FIREFOX.EXE
    	binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
    	options = Options()
    	options.binary = binary
    	
        # PATH DONDE SE ENCUENTRA WEBDRIVER/ EN ESTE CASO GECKODRIVER
    	browser = webdriver.Firefox(firefox_options=options, executable_path=r'C:\Users\Diego\Desarrollo\Proyectos Python\InstagramBot\geckodriver.exe')
    	browser.implicitly_wait(5)
    	browser.get('http://instagram.com/')
    	
    	# TIEMPO DE ESPERA PARA QUE INSTAGRAM NO NOS CONSIDERE UN ROBOT Y BLOQUEE NUESTRA CUENTA
    	sleep_random = random.randint(5, 10)
    	time.sleep(sleep_random)
    
    	# LLENAMOS LOS CAMPOS USUARIO Y CONTRASEÑA
    	username_input = browser.find_element_by_xpath("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[1]/div/label/input")
    	password_input = browser.find_element_by_xpath("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[2]/div/label/input")
    	username_input.send_keys("tucorreo@gmail.com")
    	password_input.send_keys("tucontraseña")
    
    	# PRESIONAMOS EL BOTON INICIAR SESION
    	login_button = browser.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div[1]/div/form/div/div[3]/button')
    	login_button.click()
    	time.sleep(5)
    
    	# ESTA OPCIÓN ES PARA CUANDO NOS APARECE EL CARTEL ¿Guardar tu información de inicio de sesión?
        # PRESIONAMOS SOBRE LA OPCION "AHORA NO"
    	try:
    		not_now_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/div/div/div/button")
    		not_now_button.click()
    		time.sleep(4)
    	except Exception:
    		pass
    
        # ESTA OPCIÓN ES PARA CUANDO NOS APARECE EL CARTEL DE SI QUEREMOS NOTIFICACIONES
    	# PRESIONAMOS QUE NO 
    	try:
    		no_notifications = browser.find_element_by_class_name("aOOlW.HoLwm ")
    		no_notifications.click()
    		time.sleep(7)
    	except Exception:
    		pass
    
    login()
    

    Análisis del Código

    Lo primero que hacemos es importar los módulos necesarios para trabajar: selenium, time y random

    Crearemos una única función login() porque en esta entrada solo se verá el Login a Instagram con Python. Veamos que tiene dentro:

    # PATH DONDE SE ENCUENTRA ALOJADO FIREFOX.EXE
    	binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
    	options = Options()
    	options.binary = binary
    	
        # PATH DONDE SE ENCUENTRA WEBDRIVER/ EN ESTE CASO GECKODRIVER
    	browser = webdriver.Firefox(firefox_options=options, executable_path=r'C:\Users\Diego\Desarrollo\Proyectos Python\InstagramBot\geckodriver.exe')
    	browser.implicitly_wait(5)
    	browser.get('http://instagram.com/')
    

    Si bien dejé comentarios en el código para que tengan una idea, paso a dejar algunos detalles.

    Necesitamos saber donde está firefox.exe en nuestro equipo (imagino sabrás buscarlo) más específicamente la ruta donde se encuentra (debería ser igual o parecida a la ruta que está en el código).

    Crearemos un objeto browser para manejar nuestro navegador (en este caso Firefox) y le pasaremos la opción de la ruta de nuestro navegador (options) que creamos más arriba y también le pasaremos el Path de donde se encuentra alojado el GeckoDriver (en este caso en la carpeta del proyecto). Luego con browser.get() lo que hacemos es abrir el navegador de forma automática.

    Si llegamos hasta acá sin errores vamos bien, ya tenemos bien las rutas de Mozilla y de GeckoDriver.

    # TIEMPO DE ESPERA PARA QUE INSTAGRAM NO NOS CONSIDERE UN ROBOT Y BLOQUEE NUESTRA CUENTA
    	sleep_random = random.randint(5, 10)
    	time.sleep(sleep_random)
    

    sleep_random es un número que se genera aleatorio entre 5 y 10 y time.sleep(sleep_random) será el tiempo que el programa quede en pausa y seguir con las demás lineas de código. Esto se pone para no hacer todo de forma apresurada y llamar la atención a los algoritmos de seguridad de Instagram.

    # LLENAMOS LOS CAMPOS USUARIO Y CONTRASEÑA
    	username_input = browser.find_element_by_xpath("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[1]/div/label/input")
    	password_input = browser.find_element_by_xpath("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[2]/div/label/input")
    	username_input.send_keys("tucorreo@gmail.com")
    	password_input.send_keys("contraseña")
    
    	# PRESIONAMOS EL BOTON INICIAR SESION
    	login_button = browser.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div[1]/div/form/div/div[3]/button')
    	login_button.click()
    	time.sleep(5)
    

    Si vino la parte divertida jejeje. Aquí ya tenemos que comenzar a inspeccionar las etiquetas HTML del sitio (en este caso Instagram) para encontrar donde necesitamos ingresar el usuario, la contraseña y el botón para iniciar sesión. Para el caso del usuario y la contraseña explicaré como obtener el HTML del usuario (lo mismo será para la contraseña.

    Para ésto vamos a abrir Instagram en el navegador y vamos a presionar sobre el TextBox (Input) de Usuario -> click derecho -> Inspeccionar elemento y deberíamos ver algo como lo muestro en la imagen.

    Inspeccionando elemento de nombre de usuario - Login en Instagram con Python
    Inspeccionando elemento de nombre de usuario

    ¿Qué es el Xpath y cómo lo obtenemos para acceder por ejemplo al username?

    Xpath se emplea para buscar elementos dentro de un documento XML y será la ruta para acceder a los elementos deseados (en este caso el username). Para obtenerlo basta con dar click derecho en la parte azul de la imagen superior (en el código HTML) del elemento a buscar (en este caso el username), seleccionamos copiar -> XPATH (imagen abajo)

    Accediendo al Xpath del username
    Accediendo al xPath del username

    Con esto obtendremos la ruta para llegar Textbox (input) del username y con la función username_input = browser.find_element_by_xpath (y la ruta del xPath) obtendremos el campo del formulario. Lo mismo hacemos para el password. Más adelante con la función username_input.send_keys("Nuestro Correo") llenamos el formulario (lo mismo para el password)

    Para capturar el botón hacemos lo mismo y luego con la función login_button.click() lo que hacemos es simular presionar el botón. Luego de presionar el botón con time.sleep() dejamos que Instagram se recargue para seguir con las siguientes acciones.

    Existen varias formas de llegar a un campo de un formulario o un elemento en particular de un sitio web, en esta parte del código utilizamos find_element_by_xpath, pero verás que en otras partes del código también podemos acceder mediante la clase del elemento HTML utilizando la función find_element_by_class_name, también se puede utilizar css, etc, lo importante es llegar al elemento deseado.

    Aleluya

    Si llegamos hasta acá deberíamos haber logrado el Login en Instagram así que felicitaciones. En caso de tener algún inconveniente puedes dejarlo en los comentarios que con gusto te ayudaré.

    # ESTA OPCIÓN ES PARA CUANDO NOS APARECE EL CARTEL ¿Guardar tu información de inicio de sesión?
        # PRESIONAMOS SOBRE LA OPCION "AHORA NO"
    	try:
    		not_now_button = browser.find_element_by_xpath("/html/body/div[1]/section/main/div/div/div/div/button")
    		not_now_button.click()
    		time.sleep(4)
    	except Exception:
    		pass
    
        # ESTA OPCIÓN ES PARA CUANDO NOS APARECE EL CARTEL DE SI QUEREMOS NOTIFICACIONES
    	# PRESIONAMOS QUE NO 
    	try:
    		no_notifications = browser.find_element_by_class_name("aOOlW.HoLwm ")
    		no_notifications.click()
    		time.sleep(7)
    	except Exception:
    		pass
    

    Si utilizan Instagram se darán cuenta que una vez logueados (por lo meno las primeras veces) nos aparecen dos carteles, el primero es si queremos guardar la información del inicio de sesión y la segunda es para ver si queremos acceder a las notificaciones. Como me ha pasado que a veces aparecen y a veces no, ésta parte del código la agrego dentro de un try : except ¿Por qué? porque si no aparecen los carteles, cuando esté buscando el xPath y quiera presionar el botón por ejemplo "Ahora no" va haber un error porque ese botón no existe y el programa se cerrará. En caso de que no exista, cae en la excepción y no hace nada (sigue con el siguiente código).

    Las dos partes del código son iguales, se busca el xPath, se presiona sobre el botón y se da un tiempo prudencial para que Instagram no sospeche.

    Y esto sería todo, espero te funcione de maravilla como a mí y no te olvides de dejar un comentario ante cualquier duda o sugerencia. Ahhhh y una cosa más: hemos creado una cuenta en Instagram 🙂 Puedes seguirnos AQUI

    Saludos, Diego

    dcaraballo

    Creador de @PythonDiario, amante de la Tecnología y la Naturaleza. Programador Python, C# . NET

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir
    Siguenos en Instagram

    Te has suscrito correctamente al boletín

    Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

    Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.