11.2. Cómo no obtener datos mediante HTTP

Digamos que quiere descargar un recurso mediante HTTP, tal como un feed sindicado Atom. Pero no sólo queremos descargarlo una vez; queremos descargarlo una y otra vez, cada hora, para obtener las últimas noticias de un sitio que nos ofrece noticias sindicadas. Hagámoslo primero a la manera sucia y rápida, y luego veremos cómo hacerlo mejor.

Ejemplo 11.2. Descarga de una sindicación a la manera rápida y fea

>>> import urllib
>>> data = urllib.urlopen('http://diveintomark.org/xml/atom.xml').read()    1
>>> print data
<?xml version="1.0" encoding="iso-8859-1"?>
<feed version="0.3"
  xmlns="http://purl.org/atom/ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="en">
  <title mode="escaped">dive into mark</title>
  <link rel="alternate" type="text/html" href="http://diveintomark.org/"/>
  <-- resto del feed omitido por brevedad -->
1 En Python es increíblemente sencillo descargar cualquier cosa mediante HTTP; de hecho, se hace en una línea. El módulo urllib tiene la útil función urlopen que toma la dirección de la página que queremos, y devuelve un objeto de tipo fichero del que podemos simplemente leer con read() para obtener todo el contenido de la página. No puede ser más fácil.

¿Qué hay de malo en esto? Bien, para una prueba rápida o durante el desarrollo no hay nada de malo. Lo hago a menudo. Quería el contenido de del feed y obtuve el contenido del feed. La misma técnica funciona con cualquier página web. Pero una vez empezamos a pensar en términos de servicios web a los que queremos acceder con regularidad (y recuerde, dijimos que planeamos hacer esto cada hora) estamos siendo ineficientes, y rudos.

Hablemos un poco sobre las características básicas de HTTP.