Tutorial 19, Comunicación con webs en python.

Hola a tod@s, siento este largo periodo en el cual no he podido escribir nada, pero es que me encontraba fatal en cama, hoy ya estoy mejor incluso iré a clase y todo.

Esta vez os voy a hablar sobre las formas que nos proporciona python para comunicarnos con webs, para ello existen unos módulos muy interesantes, como son urllib y urllib2, estos se usan para leer datos a través de una URL, urllib es un módulo ya bastante antiguo por lo que hablaré sobretodo de urllib2.



El módulo urllib2, cuenta con métodos read, readline, readlines y close que se usan de forma similar a como lo hacíamos en el tratamiento de ficheros (leer tutorial 16 antes de seguir), para abrir una URL se usa el método "urlopen":

import urllib2
blog=urllib2.urlopen("http://www.aprendepythonvolando.blogspot.com")

Ya está, en este caso abre la URL del blog que estáis leyendo ahora mismo, pero...¿Para que vale esto?, pues lo que hacemos al abrir la URL, es enviar una petición http a este blog, el servidor http, envia el documento html y lo guarda con el nombre "blog", como si fuese un archivo de texto plano cualquiera, al cual podemos aplicarle los métodos que ya conocéis como: read, readline y readlines, eso si, aquí no existe el método "seek" por lo cual para volver a poner el cursor al principio del archivo tendréis que volver a abrir la URL.

import urllib2
blog=urllib2.urlopen("http://www.aprendepythonvolando.blogspot.com")
print blog.read()

Lo que se vería en este caso, sería todo el código fuente de la portada de este blog,  que es código html (eso ya no es de este curso), podríamos hacer:

 
import urllib2
blog=urllib2.urlopen("http://www.aprendepythonvolando.blogspot.com")
print blog.readline()

Y solo mostraría la primera línea, y para cerrar la url:

blog.close()

Al igual que en los ficheros y ya esta, pero.....¿Y si tengo una URL a la cual le debo de pasar datos de tipo POST  o GET?, Pues muy sencillo, el módulo urllib2 también soporta este tipo de datos pasándoselos como segundo argumento:

import urllib2
web=urllib2.urlopen("http://www.ejempl/login.php","mipass=contrase%A4a&nombre=francisco")
print web.read()

Como véis tan sólo se le pasan los datos como segundo argumento y ya esta, eso si en el formato en que se envié la petición, si no sabemos escribir los datos en el formato en que se envía a la URL o simplemente queremos que sea mas sencillo, para eso existe un método que lo hace por nosotros, que se encuentra en el módulo urllib:

import urllib, urllib2

datos=urllib.urlencode({"nombre": "francisco", "contraseña": "mipass"})
web=urllib2.urlopen("http://www.ejempl/login.php", datos)
print web.read()

Lo que hacemos es pasarle al método urlencode un diccionario con los valores de cada clave, guardamos lo que devuelva en "datos" y luego lo usamos en urlopen.

En caso de que la petición sea GET  y no POST, tan sólo hay que concatenar "?" a la cadena:

import urllib, urllib2

datos=urllib.urlencode({"nombre": "francisco", "contraseña": "mipass"})
web=urllib2.urlopen("http://www.ejempl/login.php" + "?" + datos)
print web.read()

Bueno, estas son las formas mas sencillas de interactuar con webs, no es super avanzado, tan sólo es una forma de enviar y recibir peticiones http, enviar datos GET y POST, no voy a entrar en cookies ni nada avanzado ya que esto cubre las necesidades de un usuario normal, espero que os haya gustado el tutorial de hoy, mañana empezaré a explicar un concepto completamente nuevo que son los threads, el cual abarcará varios tutoriales, un abrazo a tod@s y hasta mañana.








6 comentarios:

Dan dijo...

Muy interesante Francisco.
Esto es una especie de internet en linea de comandos ¿no?

Francisco Dominguez Lerma dijo...

Es una forma de comunicar python con internet, ya expliqué los sockets pero es un concepto antiguo que sirve para comunicar programas en python, pero esto sirve digamos que para interactuar con paginas web, no es nada avanzado ya lo he dicho, no me he metido en cookies ni nada complejo.

Un saludo y me alegro que te haya gustado, mañana hablaré sobre los threads.

Dan dijo...

Parece interesante

Dr Coloso dijo...

Buenisimo esto mas o menos lo sabia, espero threads.

Francisco Dominguez Lerma dijo...

Gracias Dr Coloso, mañana tendrás threads jaja.

Un saludo.

Anónimo dijo...

Me aparece error 502 y ya he realizado el còdigo con las librerias de urllib, urllib2, request y en todas me sale error.

#!/usr/bin/python
#Nombre de Fichero:urllib2_1.py

import urllib2
import sys
import cjson
import os
import requests
import urllib

f=open('/usr/local/etc/service/cfdi_files/edb2b5c2-577a-4862-b43d-b01d369b4107.xml')
xml=f.read()
f.close()

abc = cjson.encode(xml)

xyz = abc.encode('hex')
print xyz

data = urllib.urlencode({"xyz" :" xml"})
print data

f=urllib2.urlopen("https://172.16.150.187/py/index.py" + "?" + data)
print f.read()

ese es mi còdigo con urllib2