Programación web
Servicios web
1. REST
Un servicio web es una funcionalidad que permite un intercambio de datos entre aplicaciones, que pueden ser heterogéneas. Este intercambio puede tener lugar en la intranet o en Internet y se realiza de manera síncrona.
La lista de las tecnologías implementadas es muy variada en varios dominios.
REST es una tecnología que define un estilo de arquitectura aplicativa y también es una manera de representar un recurso susceptible de poder consultarse y recibir argumentos.
El transporte se realiza a través de HTTP, la respuesta puede tomar varias formas que son HTML, XML o JSON.
El medio más sencillo y rápido para ofrecer un servicio web que devuelve una respuesta JSON, es utilizar la librería bottle, que puede instalar de la siguiente manera:
pip install bottle
A continuación se muestra un ejemplo básico de servicio web, que se puede realizar con la ayuda de esta librería:
from bottle import route, run
if __name__ == "__main__":
@route('/hello/:name', method='GET')
def get_set_of_results(name):
return {'message': 'Hello %s' % name}
run()
Para lanzar el servidor, simplemente hay que ir al directorio 13 de los ejemplos y ejecutar:
$ ./test_rest.py
Lo que caracteriza a REST, es la manera de construir una URL para elegir el servicio a utilizar y para pasar los argumentos necesarios. Esta es la clave del correcto uso de REST y es relativamente sencillo de utilizar, además de ser finalmente pythónica, aunque no fue diseñado específicamente para Python.
Es suficiente con abrir su navegador y escribir la siguiente URL, para visualizar el resultado (archivo JSON):
http://localhost/hello/algunacosa
A continuación se muestra un cliente que permite consumir un servicio como este:
>>> from http.client import HTTPConnection
>>> conn = HTTPConnection('localhost:8080')
>>> conn.request('GET', '/hello/world')
>>> response = conn.getresponse()
>>> print(response.status) ...
Cliente web
En el capítulo Programación de red, hemos presentado la manera de construir un cliente web que usa el protocolo HTTP. Este capítulo presenta un módulo de alto nivel que se adapta a la vez particularmente bien al protocolo HTTP y que no le obliga a conocer el funcionamiento de este protocolo en detalle.
Se trata del módulo requests, que se instala de la siguiente manera:
$ pip install requests
El objetivo de este módulo es permitir a los no expertos, utilizar el protocolo HTTP de la manera más sencilla posible.
De esta manera, se puede recuperar el contenido de un servicio web de la siguiente manera:
>>> import requests
>>> r = requests.get("http://127.0.0.1:8080/hello/world")
El objeto r es la respuesta del servidor (se usa aquí el servidor diseñado más atrás como ejemplo REST, con bottlepy).
Se puede analizar esta respuesta:
>>> r.status_code
200
>>> r.headers
{'Date': 'Sun, 19 May 2019 10:27:23 GMT',
'Server': 'WSGIServer/0.2 Cpython/3.7.1',
'Content-Type': 'application/json',
'Content-Length': '26'}
El código de estado es un elemento importante en el protocolo HTTP. En función de este código, debe tratar la respuesta de manera diferente. Un código 200 indica que todo es correcto y que tiene la respuesta que desea.
Un código 300 indica sin embargo un problema para obtener el recurso, ya sea un permiso, un proxy, el hecho de que la página se haya movido de manera temporal o permanente, etc. En consecuencia, debe actuar en función del código exacto. Un código 400 es un error que es considera producido en el lado cliente y un error 500 es un error en el lado servidor, sobre el que no puede actuar.
Los encabezados le permiten saber si el contenido de su respuesta es JSON o texto y es esto lo que va a determinar cómo va a leerlo (el elemento esencial es Content-Type). En nuestro caso, es JSON, por lo tanto:
>>> r.json()
{'message': 'Hello world'}
Esto devuelve un objeto de tipo...
Web scrapping
El web scrapping consiste en extraer contenido accionable desde los sitios web. Esto es útil para muchas aplicaciones: SEO, comparación entre sitios, extracción de información, etc.
En Python, se puede hacer esto perfectamente con ayuda de requests, para recuperar el contenido HTML y después de BeautifulSoup, para parsear datos. Sin embargo, existe una alternativa de más alto nivel: Scrapy.
Esta técnica se considera por algunos actores como Google, como un saqueo. El web scrapping en sí mismo no plantea problemas éticos, sino que lo que cuenta realmente es lo que haga con los datos recopila.
Si recupera información de un sitio web para duplicarlo en su propio sitio, está violando potencialmente el derecho de autor (esto depende de la licencia asociada a la información que duplica), caso de uso que efectivamente es impropiado.
Si recupera información para hacer una vigilancia tecnológica o un seguimiento de la evolución de precios sobre las plataformas actuales, no viola en principio ninguna regla, porque esta información es pública. Hay que comprobar también las condiciones de uso de los sitios web en cuestión.
Para instalar esta librería, proceda de la siguiente manera:
$ pip install scrapy
Retomamos aquí el ejemplo de introducción de la documentación oficial, que es perfecta y muy completa. Para...