Inicie sesión en el sitio web utilizando solicitudes de python

Estoy intentando iniciar sesión en https://www.voxbeam.com/login utilizando solicitudes para raspar datos. Soy un principiante de python y he hecho sobre todo tutoriales, y algunos raspado web por mi cuenta con BeautifulSoup.

Mirando el HTML:

     

Entiendo que debería estar usando el método de envío y el envío de nombre de usuario y contraseña

Estoy intentando esto:

 import requests import webbrowser url = "https://www.voxbeam.com/login" login = {'userName': 'xxxxxxxxx', 'password': 'yyyyyyyyy'} print("Original URL:", url) r = requests.post(url, data=login) print("\nNew URL", r.url) print("Status Code:", r.status_code) print("History:", r.history) print("\nRedirection:") for i in r.history: print(i.status_code, i.url) # Open r in the browser to check if I logged in new = 2 # open in a new tab, if possible webbrowser.open(r.url, new=new) 

Estoy esperando, luego de un inicio de sesión exitoso para ingresar la URL al panel de control, así puedo comenzar a raspar los datos que necesito.

Cuando ejecuto el código con la información de autenticación en lugar de xxxxxx y aaaa, obtengo el siguiente resultado:

 Original URL: https://www.voxbeam.com/login New URL https://www.voxbeam.com/login Status Code: 200 History: [] Redirection: Process finished with exit code 0 

Me meto en el navegador una nueva pestaña con www.voxbeam.com/login

¿Hay algo mal en el código? ¿Me falta algo en el HTML? Está bien esperar obtener la URL del tablero de mandos en r, o redirigirnos y tratar de abrir la URL en una pestaña del navegador para verificar visualmente la respuesta, ¿o debería estar haciendo las cosas de otra manera?

He estado leyendo muchas preguntas similares aquí durante un par de días, pero parece que cada proceso de autenticación del sitio web es un poco diferente, y comprobé http://docs.python-requests.org/en/latest/user/authentication/, que describe otros métodos, pero no he encontrado nada en el HTML que sugiera que debería usar uno de esos en lugar de publicar

Lo intenté también

 r = requests.get(url, auth=('xxxxxxxx', 'yyyyyyyy')) 

Pero tampoco parece funcionar.

Como se dijo anteriormente, debe enviar valores de todos los campos de formulario. Aquellos que se pueden encontrar en el inspector web de navegador. Este formulario envía 2 valores ocultos adicionales:

 url = "https://www.voxbeam.com//login" data = {'userName':'xxxxxxxxx','password':'yyyyyyyyy','challenge':'zzzzzzzzz','hash':''} # note that in email have encoded '@' like uuuuuuu%40gmail.com session = requests.Session() r = session.post(url, headers=headers, data=data) 

Además, muchos sitios tienen protección de un bot como campos de formulario ocultos, js, enviar valores codificados, etc. Como variantes, usted podría:

1) Utilice cookies de inicio de sesión manual:

 url = "https://www.voxbeam.com" headers = {'user-agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36"} cookies = {'PHPSESSID':'zzzzzzzzzzzzzzz', 'loggedIn':'yes'} s = requests.Session() r = s.post(url, headers=headers, cookies=cookies) 

2) Utilizar el módulo de selenium:

 from selenium import webdriver from selenium.webdriver.common.keys import Keys url = "https://www.voxbeam.com//login" driver = webdriver.Firefox() driver.get(url) u = driver.find_element_by_name('userName') u.send_keys('xxxxxxxxx') p = driver.find_element_by_name('password') p.send_keys('yyyyyyyyy') p.send_keys(Keys.RETURN) 

Intente especificar la URL más claramente de la siguiente manera:

  url=https://www.voxbeam.com//login?id=loginForm 

Esto establecerá Focus en el formulario de inicio de sesión para que las aplicaciones del método POST

Es muy complicado dependiendo de cómo maneja el sitio web el proceso de inicio de sesión, pero lo que hice fue que usé Charles, que es una aplicación proxy y escuché las solicitudes que mi navegador envió al servidor del sitio web mientras estaba iniciando sesión manualmente. Luego copié exactamente el mismo encabezado y cookie que se mostró en Charles en mi propio código de Python, ¡y funcionó! Asumo que la cookie y el encabezado se utilizan para evitar el inicio de sesión del bot.

 from webbot import Browser web = Browser() # this will navigate python to browser link = web.go_to('enter your login page url') #remember click the login button then place here login = web.click('login') #if you have login button in your web , if you have signin button then replace login with signin, in my case it is login id = web.type('enter your Id/Username/Emailid',into='Id/Username/Emilid',id='txtLoginId') #id='txtLoginId' this varies from web to web find this by inspecting the Id/Username/Emailid Button, in my case it is txtLoginId next = web.click('NEXT', tag='span') passw = web.type('Enter Your Password', into='Password', id='txtpasswrd') #id='txtpasswrd' (this also varies from web to web similiarly inspect the Password Button)in my case it is txtpasswrd home = web.click('NEXT', id="fa fa-home", tag='span') # id="fa fa-home" (Now inspect all necessary Buttons and move accordingly) in my case it is fa fa-home next11 = web.click('NEXT', tag='span')