Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Python y Raspberry Pi
  3. Al asalto de la Web con la Raspberry Pi
Extrait - Python y Raspberry Pi Aprenda a desarrollar en su nano-ordenador
Extractos del libro
Python y Raspberry Pi Aprenda a desarrollar en su nano-ordenador Volver a la página de compra del libro

Al asalto de la Web con la Raspberry Pi

Webscraping fácil con los módulos urllib y HTMLParser

Python es un potencial lenguaje para la programación en red, así como la programación web, principalmente gracias a su amplio panel de librerías disponibles. Webscrapping es una técnica que permite recuperar una página de un sitio web y analizar su contenido. Dos módulos son los protagonistas: urllib y html. Estos dos módulos sirven fundamentalmente para manipular las páginas web, es decir, recuperarlas desde un servidor y extraer de ellas la información pertinente.

Con el módulo urllib, la recuperación del contenido de una página y la petición al servidor se realizan en apenas, tres líneas. Es evidente que la Raspberry Pi debe estar conectada a Internet antes de empezar a utilizar el módulo y realizar peticiones a los sitios web. La URL (Uniform Resource Locator) de la página solicitada es el artículo sobre España (en español) del sitio web www.wikipedia.org:


>>> import urllib.request  
>>> respuesta =   
urllib.request.urlopen('https://es.wikipedia.org/wiki/España')  
>>> page = respuesta.read()
 

Aquí, la variable page almacena el contenido del artículo. Preste atención porque el valor devuelto por read() es una secuencia de tipo bytes, que será necesario convertir en una cadena de caracteres Unicode con la función decode():


>>> type(page)  
<class 'bytes'>  
>>> page = page.decode('UTF-8')  
>>> type(page)  
<class 'str'>
 

La página se puede mostrar tal y como es, aunque generalmente en un enorme flujo de texto. También se puede guardar en un archivo .html para leerla más tarde:


>>> open('espania.html' , 'w', encoding='UTF-8').write(page)
 

Esta lógica se puede resumir en un script (Capitulo_9/webscrapping_1.py):


  1 #!/usr/bin/env python3  
 2 from urllib.request import urlopen  
 3 url = 'https://es.wikipedia.org/wiki/España'  
 4   
 5 def main():  
 6     with urlopen(url) as u:  
 7         content = u.read().decode('UTF-8')  
 8      ...

Desarrollar un servidor HTTP con el módulo http.server

Python le permite escribir su propio servidor HTTP gracias a las clases proporcionadas con la distribución básica. En Python 3, estas clases se encuentran en el módulo http y, en pocas líneas, transforman la Raspberry Pi en un servidor web capaz de hospedar el contenido. Lo demostraremos con el siguiente código (Capitulo_9/servidorhttp_1.py):


 1 #!/usr/bin/env python3  
 2 from http.server import BaseHTTPRequestHandler, HTTPServer  
 3 puerto = 8080  
 4 ip = '127.0.0.1'  
 5   
 6 class HTTPi(BaseHTTPRequestHandler):  
 7     def do_GET(self):  
 8         self.send_response(200)  
 9         self.send_header("Content-type", "text-html;   
charset=UTF-8")  
10         self.end_headers()  
11         content = """  
12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  
13 "http://www.w3.org/TR/html4/strict.dtd">  
14 <html>  
15 <head>  
16 <meta http-equiv="Content-Type" content="text/html;   
charset=UTF-8">  
17 <title>Hello Pi!</title>  
18 </head>  
19 <body>  
20   <h1>Hello Pi!</h1>  
21 </body>  
22 </html>"""  
23         body = content.encode('UTF-8')  
24         self.wfile.write(body)  
25   
26 def main():  
27     try:  
28         servidor = HTTPServer((ip, port), HTTPi)  
29         print("Inicio del servidor HTTPi: http://%s:%s" %  
30               (ip, port))  
31         servidor.serve_forever()  
32     except KeyboardInterrupt:  
33         servidor.socket.close()  
34   
35 if __name__ == '__main__':  ...

Ejecutar scripts con el módulo cgi

CGI significa Common Gateway Interface. Se describe en la RFC 3875 y es una interfaz destinada a los servidores HTTP. Esta interfaz agrega una funcionalidad adicional: la interpretación de scripts, en particular scripts Python, en el caso de un servidor HTTP Python. A diferencia de lo que sucede con un servidor tradicional, que se contenta sencillamente con leer una página web y devolver el contenido al cliente que ha pedido la página, con CGI el servidor HTTP ejecuta un script que, una vez ejecutado, devuelve el resultado al cliente. La interfaz CGI también explota el intercambio entre el cliente y el servidor a través del método HTTP POST, implementado habitualmente mediante un formulario. La interfaz CGI no es específica del lenguaje Python y existe en otros muchos lenguajes de programación.

En la práctica, añadir una interfaz CGI a un servidor HTTP Python requiere programar un administrador HTTP conforme al protocolo CGI. Una vez no crea hábito, y la librería estándar contiene un administrador listo para su uso: CGIHTTPRequestHandler. El código de este servidor HTTP/CGI es muy parecido al de un servidor HTTP clásico (Capitulo_9/servidorcgi_1.py):


 1 #!/usr/bin/env python3  
 2 from http.server import CGIHTTPRequestHandler, HTTPServer  
 3 import os, sys  
 4 puerto = 8080  
 5 ip = '127.0.0.1'  
 6 directorio = '/home/pi/www'  
 7   
 8 def main():  
 9     try:         
10         os.chdir(directorio)  
11         servidor = HTTPServer((ip, port), CGIHTTPRequestHandler) 
12         print("Inicio del servidor CGI: http://%s:%s" %  
13               (ip, port))  
14         servidor.serve_forever()  
15     except FileNotFoundError as e:  
16         sys.stderr.write("ERROR. La carpeta '%s' no existe 
.\n" % (directorio))  
17         raise e  
18     except...

Enviar correos electrónicos con el módulo smtplib

La distribución de e-mails, también llamados correos electrónicos, es un aspecto importante de la programación web y de red. Para entender mejor cómo debe formarse y enviarse un correo electrónico, hay dos RFC esenciales para este capítulo:

  • la RFC 822 - Internet Message Format, que define la estructura y los encabezados de un correo electrónico.

  • la RFC 5321 - Simple Mail Transfer Protocol, que define el protocolo SMTP, el más utilizado para el intercambio y envío de correos electrónicos en Internet.

Lo principal que hay que entender de estas dos RFC se resume en la estructura de un correo electrónico, elemento clave para poder enviar mensajes válidos a su interlocutor. Ocurre igual que con una respuesta HTTP, un correo electrónico se compone de varios encabezados. Los cuatro más conocidos son los siguientes:

  • From: que designa a la persona que envía.

  • To: que designa al destinatario.

  • Date: que indica la fecha de envío del mensaje.

  • Subject: que indica el asunto del mensaje.

Hay otros encabezados que se utilizan algunas veces (habitualmente), como Cc: para poner en copia a un destinatario y Bcc: para poner en copia oculta a un destinatario. De esta manera, con esta información el envío de un correo consiste en unir estos encabezados y transferir el resultado a un servidor SMTP. En realidad, la librería smtplib resuelve...

Conclusión

La programación web se ha convertido en algo imprescindible. Este capítulo presenta brevemente las capacidades de la Raspberry Pi con el objetivo de responder a las expectativas de los programadores web principiantes y experimentados.