Passa al contingut principal

Enviar peticiones POST a sitios Web con Python

Enviar peticiones POST a sitios Web con Python: Hola, muy buenos días a todos ! En esta mini guía o tutorial, vengo a explicar una cosa sencilla de Python, pero que muy pocos utilizan. Me refiero a enviar datos mediante la petición POST.
Primero que nada, quiero mostrar las diferentes formas de llevar a cabo estas peticiones, una de ellas, es mediante la librería "httplib", la otra es mediante la librería urllib o urllib2.

Una ventaja aparente que veo yo al utilizar la librería httplib, es que podemos manejar los códigos de error que nos devuelven las peticiones que hagamos. Por si no manejan dichos códigos de error, acá les dejo un listado de los principales :

  • 200 : OK, documento entregado correctamente.
  • 202 : Aceptada, pero la petición no es completada con éxito.
  • 204 : Sin contenido.
  • 301 : Movido permanentemente.
  • 302 : Movido Temporalmente.
  • 304 : No modificado.
  • 401 : No autorizado.
  • 403 : Prohibido, el conocido Forbidden
  • 404 : No encontrado.
  • 500 : Error interno.
  • 501 : No implementado.

Bueno, volviendo al tema... Para enviar una petición POST, debemos saber la URL a la que deseamos enviar los datos, eso es bastante fácil, ya que generalmente solo debemos mirar el código de fuente y buscar <form ... y ubicar el action="ACÁ LA URL". Una vez encontrado ello, debemos saber que datos tenemos que enviarle a la URL, para ello deberás buscar los <input type="text" o type="hidden".

Ahora, si no te quieres complicar la vida buscando en el código de fuente, puedes usar otra herramienta proporcionada por mi, que detecta formulario y campos a enviar mediante el POST:

Código :


# -*- coding: utf-8 -*-
# Autor: JaAViEr (0x5d)
# Twitter: 0x5d
import re,urllib,sys
try:
var = urllib.urlopen(raw_input("URL ::> ")).read()
except:
print "No es posible conectar..."
sys.exit(1)
url_enviar=""
for url in re.findall("<form (.*)>",var):
if "action" in url.lower():
for web in url.split():
if re.findall("action=(.*)",web):
url_enviar=web.replace("action=","")
url_enviar = url_enviar.replace("\"","")
datos_r = []
for campos in re.findall("<input (.*)>",var):
if "name" in campos.lower():
for cam in campos.split():
if re.findall("name=(.*)",cam):
datos_r.append(cam.replace('"',""))
print "URL a enviar POST:",url_enviar.replace(">","")
print "Campos Detectados:"
for s in datos_r:
print s.replace("name=","")



Solo basta con ingresar la URL para saber a que URL apunta el formulario & los datos que tenemos que enviar, podría ser buena herramienta para esta ocasión.

Ahora que ya tenemos todos nuestros datos necesarios y fundamentales, manos a la obra !
Veamos que tal nos va con el famoso httplib y urllib para poder codificar los datos y que el navegador los comprenda, primero los importamos:

Código :


import httplib, urllib



Para poder crear una conexión utilizamos:

Código :


parametros = urllib.urlencode({'campo1': 'valor uno','campo2':'valor2'})



En este caso, estamos enviando campo1 con el valor: valor uno y campo2 con el valor: valor2
Y Bueno, necesitamos enviar la cabecera necesaria para poder realizar con éxito nuestra petición, Content-type : application/x-www-form-urlencoded, que en Python es:

Código :


cabeceras = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}



Bien, una vez ya tenemos todo esto en nuestro código, debemos especificar a que host nos queremos conectar y con que puerto :

Código :


abrir_conexion = httplib.HTTPConnection("rootcodes.com:80")



Con eso ya abrimos nuestra conexión a rootcodes.com vía puerto 80 (HTTP). Por lo tanto, ahora necesitamos especificar la URL o el archivo en el servidor que nos receptará los datos:

Código :


abrir_conexion.request("POST", "/archivo_cualquiera.php", parametros, cabeceras)



Genial ! , ya tenemos nuestra conexión establecida con rootcodes.com y le acabamos de enviar los datos "campo1" y "campo2" con sus respectivos valores ! , pero falta algo, saber si nuestra apreciada petición fue realizada con éxito:

Código :


respuesta = abrir_conexion.getresponse()
print respuesta.status



Ahí es donde entran en juego los códigos de error que les dejé más arriba.
PD: respuesta.status devolverá el código de error en número, mientras que:

Código :


print respuesta.reason


Nos devolverá en texto, en caso de ser una respuesta válida, el status será 200 y el reason "OK"
Ya una vez finalizado todo, podemos obtener el código de fuente & posteriormente cerrar la conexión:

Código :


ver_source = respuesta.read()
abrir_conexion.close()



Bien, código final:

Código :


import httplib, urllib
parametros = urllib.urlencode({'campo1': 'valor uno','campo2':'valor2'})
cabeceras = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
abrir_conexion = httplib.HTTPConnection("rootcodes.com:80")
abrir_conexion.request("POST", "/archivo_cualquiera.php", parametros, cabeceras)
respuesta = abrir_conexion.getresponse()
print respuesta.status
ver_source = respuesta.read()
#Esto es opcional -> print ver_source
abrir_conexion.close()




Bien, eso es con la "famosa" httplib, qué tal si vemos ahora como hacerlo con urllib ?

Bueno, empiezo de 0 con urllib, lo bueno es que esto es muchísimo más sencillo, ya verán ;)
Primero, importamos la librería :

Código :


import urllib



Para establecer los campos a enviar, es igual al anterior:

Código :


campos = urllib.urlencode({"campo":"valor"})



Y para establecer la web a la cuál enviar los datos:

Código :


sitio = urllib.urlopen("http://rootcodes.com/el_archivo.php", campos)
print sitio.read()




Basta con eso, para enviar el campo: "nombre" con valor: JaAViEr.
Sencillo no ? , pues claro, el único problema es que tendríamos que utilizar expresiones regulares para detectar si nuestra petición fue realizada con éxito o no, por lo que es mejor utilizar httplib, cosa que yo no hago :P

De yapa les dejaré una mini clase que hice en Python, para enviar datos por POST fácilmente:

Código :


    # -*- coding: utf-8 -*-
import urllib

class enviar_datos:

def conectar(self,host,campo,valor):
self.variables=[]
self.valores=[]
self.campo = campo
self.valor = valor
self.host = host
self.datos = {}
for campo_variables,valor_variables in zip(self.campo.split(":"),self.valor.split(":")):
self.variables.append(campo_variables)
self.valores.append(valor_variables)
for variable,valor in zip(self.variables,self.valores):
self.datos['%s'%variable] = valor
try:
return urllib.urlopen(self.host,urllib.urlencode(self.datos)).read()
except:
return "No se puede conectar a %s"%(self.host)

url = raw_input("Inserta la URL ::> ")
variables = raw_input("Inserta las variables, separadas por ':' ::> ")
valores = raw_input("Inserta los valores, separados por ':' ::> ")
conec = enviar_datos()

print conec.conectar(url,variables,valores)



Un ejemplo de uso:

Código :


Inserta la URL ::> http://sitio web
Inserta las variables, separadas por ':' ::> campo1:campo2
Inserta los valores, separados por ':' ::> valor1:valor2
ACÁ IRÁ LA SALIDA




Espero no haber sido muy enredado en mi explicación, es mi primer tutorial y exclusivo para Cristalab.

Saludos, Javier.

Enviar comentario



Comentaris

Entrades populars d'aquest blog

Learn Composition from the Photography of Henri Cartier-Bresson

“Do you see it?” This question is a photographic mantra. Myron Barnstone , my mentor, repeats this question every day with the hopes that we do “see it.” This obvious question reminds me that even though I have seen Cartier-Bresson’s prints and read his books, there are major parts of his work which remain hidden from public view. Beneath the surface of perfectly timed snap shots is a design sensibility that is rarely challenged by contemporary photographers. Henri Cartier-Bresson. © Martine Franck Words To Know 1:1.5 Ratio: The 35mm negative measures 36mm x 24mm. Mathematically it can be reduced to a 3:2 ratio. Reduced even further it will be referred to as the 1:1.5 Ratio or the 1.5 Rectangle. Eyes: The frame of an image is created by two vertical lines and two horizontal lines. The intersection of these lines is called an eye. The four corners of a negative can be called the “eyes.” This is extremely important because the diagonals connecting these lines will form the breakdown ...

El meu editor de codi preferit el 2024, que això ja se sap que va canviant 😄

Visual Code Visual Code és un editor de codi font lleuger, però potent que s’executa al teu escriptori i està disponible per a Windows, macOS i Linux. Compta amb suport integrat per a JavaScript, TypeScript i Node.js i té un ric ecosistema d’extensions per a altres llenguatges i entorns d’execució (com C++, C#, Java, Python, PHP, Go, .NET).  És una eina ideal per a desenvolupar i depurar aplicacions web i en el núvol. Per què Visual Code? Visual Code té molts avantatges com a editor de codi font, com per exemple: És gratuït, ràpid i fàcil d’instal·lar i actualitzar. Té un ampli ecosistema d’extensions que et permeten afegir funcionalitats i personalitzar la teva experiència de desenvolupament. Té un suport integrat per a molts llenguatges i entorns d’execució, i et permet depurar i executar el teu codi des del mateix editor. Té una interfície senzilla i elegant, amb diferents temes i modes de visualització. Té un sistema de sincronització de configuracions que et permet guardar les...

Las Mejores Aplicaciones Gratis para iPad de 2012

Las Mejores Aplicaciones Gratis para iPad de 2012 : ¿No tienes ni un duro? No te preocupes, pues hoy os traemos una extensa selección de las mejores apps gratuitas que puedes conseguir en la App Store para que llenes tu iPad de calidad, sin gastar nada de nada.   ¿Estás buscando juegos o apps gratis para tu iPad? En la App Store hay más de 500,000 apps y juegos, y una gran cantidad de ellos está disponible de forma totalmente gratuita. Aquí vamos con la selección de las mejores Apps gratis para iPad (todos los modelos), organizada por categoría. ¿Estás preparado? Las Mejores Apps Gratis de Redes Sociales para iPad Nombre Facebook Gratis Categoría Redes sociales Facebook es la red social más famosa del mundo , con casi mil millones de usuarios. Su app para iPad ha tardado, pero aquí está. Nombre Twitter Gratis Categoría Redes sociales Twitter es la red de microblogging por excelencia. La forma más rápida y directa de informar y mantenerse informado de las cosa...