"La Gaceta de Linux...haciendo de Linux un poco mas divertido!"


Descargando los enlaces de LinuxToday y el TDC de la Gaceta de Linux con Python (y Perl)

Por Mark Nielsen

Traducción al español por: Edmundo Robles
el día 23 de Junio 2003, para La Gaceta de Linux

Contenido

  1. Introducción

  2. El guión en Python

  3. Preparando un trabajo en el cron

  4. El guión en Perl que escribí para descargar el TDC de la Gaceta de Linux.

  5. Un guión en Perl que escribí para descargar las Noticias Semanales de Debian

  6. Conclusión

  7. Referencias

Introducción

Deseo agregar los enlaces de Linux Today en mi sitio web GNUJobs.com, solo por el placer de hacerlo. Más tarde, quiero agregar más titulares desde otros sitios web, y quizás la última edición de la GL. Tengo la opción de Perl o Python. Elijo Python porque he estado utilizandolo por un rato para un proyecto matemático, y ha probado ser bastante útil. Quiero hacer un hábito el usar Python desde ahora. Tiende a ser más fácil para mí programar en Python que en Perl. También, en el futuro , deseo usar hilos para descargar varias páginas web al mismo tiempo, cosa que Python hace muy bien. También podria hacerlo en Python desde ahora que se que lo usaré mas tarde.

Ambos Perl y Python le permitirán descargar páginas web fuera de internet. Usted puede hacer más cosas que solo descargar páginas web, como ftp, gopher, y conectarse a otros servicios. La descarga de una página web es sólo una de las cosas que estos lenguajes pueden realizar.

Hay diferentes cosas que el lenguaje de programación tiene que hacer:

Este artículo no va ser muy largo. Yo comenté el código en Python.

El guión en Python

Si usted quiere incluir la salida de este guión en una página web, entonces puede usar el módulo Server-Side Include en el servidor web Apache y usar un comando como este:

<!--#include virtual="/lthead.html" -->

en su página web. Varios lenguajes de programación (como PHP, Perl ASP, Perl Mason, etc) también pueden incluir archivos.

Se asume que usted esta utilizando el sistema operativo GNU/Linux . También, he estado usando Python 1.5.2, el cual no es la versión más reciente. Usted podría tener que hacer un

chmod 755 LinuxToday.py

en el guión para hacerlo ejecutable. [Version en texto de este listado.]

#!/usr/bin/python

# Una cosa obvia es aplicar una verificación de error para la url descargada,
# La descarga debe tene al menos una entrada, y ser capaces de crear el
# el nuevo archivo. Esto se hará mas tarde.

### importar el modulo web (urrlib), el modulo de cadenas (string) , el modulo de expresiones regulares (re),
### y el módulo os
import urllib, string, re, os

### Definir la nueva página web a crear y de donde obtendremos la información
Download_Location = "/tmp/lthead.html"
Url = "http://linuxtoday.com/backend/lthead.txt"

#-----------------------------------------------------------
### Crear un objeto web con la Url
LinuxToday = urllib.urlopen( Url )
### Tomamos toda la información en un arreglo (si es grande, cambiamos para hacerlo una linea a la vez)
Text_Array = LinuxToday.readlines()

New_File = open(Download_Location + "_new", 'w');
New_File.write("<ul>\n")
### Establecer el valor por omisión a inválido
Valid = 0
### Registrar del número de entradas válidas
Entry_No = 0;
Entry_Valid = 0
### Establecer los valores por omisión
Date = ""
Link = ""
Header = ""
Count = 0
### Crear el patron correspondiente a la expresión
Match = re.compile ("^\&\&")

### Agregar && para aseguranos de dividir la última entrada
Text_Array.append('&&')
### Para cada línea, hacer lo siguiente
for Line in Text_Array :
### Si && existe, comenzar desde el principio, agregar la última entrada
if Match.search(Line) :
### Si la entrada actual es válida y nos hemos saltado la primera,
if (Entry_No > 1) and (Entry_Valid > 0) :
### Una cosa que Perl hace mejor que Python es el comando print.
### No me agrada como imprime Python (no hay interpolacion de variables).
New_File.write('<li> <a href="' + Link + '">' + Header + '</a>. ' + Date + "</li>\n")
## Restablecemos los valores.
Header = ""; Link = ""; Date = ""; Entry_Valid = 0
Count = 0

### Borrar los espacios en blanco al final de la línea
Line = string.rstrip(Line)

### Si count es igual a 1 header, 2 link, 3 date
if Count == 1: Header = Line
elif Count == 2: Link = Line
elif Count == 3:
Date = Line
### Si todos los campos se hacen, tenemos una entrada válida
if (Header != "") or (Link != "") or (Date != "") :
Entry_No = Entry_No + 1
Entry_Valid = 1

### Incrementamos Count
Count = Count + 1

New_File.write("</ul>\n")

New_File.close()

### Si tenemos entradas válidas, mover el nuevo archivo a su posición real
if Entry_No > 0 :
### Podriamos hacer solo:
### os.rename(Download_Location + "_new", Download_Location)
### Pero aqui esta como hacerlo con un comando externo.
Command = "mv " + Download_Location + "_new " + Download_Location
os.system( Command )

El guión del cron para correrlo de noche

No es el mejor archivo crontab, pero lo hará.

#/bin/sh

### Archivo Crontab
### Nombrar este archivo "Crontab" y ejecutarlo con "crontab Crontab"

### Descargar cada dos horas
*/2 * * * * /www/Cron/LinuxToday.py >> /www/Cron/out 2>&1

Un guión en Perl Script que escribí para descargar la TDC de la Gaceta de Linux

Sólo para que usted pueda comparar esto con un guión Perl , cree un guión Perl el cual descarga la TDC de la GL de la última edición. [Version en texto de este listado.]

#!/usr/bin/perl
# Copyright Mark Nielsen January 20001
# Copyrighted under the GPL license.

# Estoy orgulloso de este guión.
# Lo escribí desde cero con solamente 2 errores menores cuando lo probé por primera
#vez.

system ("lynx --source http://www.linuxgazette.com/ftpfiles.txt > /tmp/List.txt");

### Abrir la página web y solamente descargamos y la colocamos en un arreglo.
open(FILE,'/tmp/List.txt'); my @Lines = <FILE>; close FILE;
### Filtrar las lineas que no contienen las letras mágicas.
my @Lines = grep(($_ =~ /lg\-issue/) || ($_ =~ /\.tar\.gz/), @Lines );

my @Numbers = ();
foreach my $Line (@Lines)
{
## Descartamos el contenido a la izquierda
my ($Junk,$Good) = split(/lg\-issue/,$Line,2);
## Descartamos el contenido a la derecha
($Good,$Junk) = split(/\.tar\.gz/,$Good,2);
## Si es un número válido, mayor que 1, guardarlo
if ($Good > 0) {push (@Numbers,$Good);}
}

### Ordenamos los números y sacamos el más alto
@Numbers = sort {$a<=>$b} @Numbers;
my $Highest = pop @Numbers;
## Crear el url que estamos descargando
my $Url = "http://www.linuxgazette.com/issue$Highest/index.html";
## Lo descargamos
system ("lynx --source $Url > /tmp/LG_index.html");

### Abrir el indice.
open(FILE,"/tmp/LG_index.html"); my @Lines = <FILE>; close FILE;
### Extraemos las partes que estan entre el comienzo y el final del TDC.
my @TOC = ();
my $Count = 0;
my $Start = '<!-- *** BEGIN toc *** -->';
my $End = '<!-- *** END toc *** -->';
foreach my $Line (@Lines)
{
if ($Line =~ /\Q$End\E/) {$Count = 2;}
if ($Count == 1) {push(@TOC, $Line);}
if ($Line =~ /\Q$Start\E/) {$Count = 1;}
}

### Reenlazamos todas las ligas que apuntan a la revista la Gaceta de Linux
my $Relink = "http://www.linuxgazette.com/issue$Highest/";
grep($_ =~ s/HREF\=\"/HREF\=\"$Relink/g, @TOC);

### Guardamos la salida
open(FILE,">/tmp/TOC.html"); print FILE @TOC; close FILE;

### Hecho!

Un guión en Perl para descargar las Noticias Semanales de Debian

Me agrada mantener un registro de las Noticias Semanales de Debian, asi que escribí este también. Algo malo en la programación, es que cuando es realmente bueno programando en determinado lenguaje, es difícil cambiar a otro lenguaje de programación. Estos dos guiones en Perl que hice sin mirar cualquier otro código. El código en Python code me tomó más tiempo, porque todavia no lo usaba. [Version Texto de este listado.]

#!/usr/bin/perl
# Copyright Mark Nielsen January 20001
# Copyright under the GPL license.

system ("lynx --source http://www.debian.org/News/weekly/index.html > /tmp/List2.txt");

### Abrir la página web descargarla y colocarla dentro de un arreglo.
open(FILE,'/tmp/List2.txt'); my @Lines = <FILE>; close FILE;
### Extraer las partes que estan entre el comienzo y el fin de la TDC.
my @TOC = ();
my $Count = 0;
my $Start = 'Recent issues of Debian Weekly News';
my $End = '</p>';
foreach my $Line (@Lines)
{
if (($Line =~ /\Q$End\E/i) && ($Count > 0)) {$Count = 2;}
if ($Count == 1) {push(@TOC, $Line);}
if ($Line =~ /^\Q$Start\E/i) {$Count = 1;}
}

### Reenlazar todas los enlaces que apuntan a DWN
my $Relink = "http://www.debian.org/News/weekly/";
grep($_ =~ s/HREF\=\"/HREF\=\"$Relink/ig, @TOC);
grep($_ =~ s/\"\>/\" target=_external\>/ig, @TOC);

### Guardar la salida
open(FILE,">/tmp/D.html"); print FILE @TOC; close FILE;

### Hecho!

Conclusión

El guión en Python actualmente es mucho más complejo de lo que necesita ser. La razón de porque lo hice más largo fue para introducir varios módulos y que sea flexible en el caso  de que algun dia cambie el formato de Linux Today. La única debilidad del guión es en la detección del error en caso de que no pueda descargar la página web, escribir el nuevo archivo o renombrarlo. También, hay que observar los modulos de expresiones regulares en Python, porque han cambiado en las recientes versiones para incrementar la eficiencia  e incorporado el soporte para Unicode.

Python rules como un lenguaje de programación. He encontrado muy fácil de usar los módulos de Python. Se ve como el modulo en Python It seems para manejar las páginas web es más fácil que el modulo LWP en Perl. Debido a las muchas posibilidades de Python, planeo crear un guión en Python que descargue varias páginas webal mismo tiempo usando las capacidades de hilos en Python.

Referencias

  1. Enlaces a LinuxToday

  2. Modulo urrlib de Python

  3. Sitio original de este artículo (cualquier actualizaciónt estará aquí)



Copyright © 2001, Mark Nielsen.
Licencia de copia http://www.linuxgazette.com/copying.html
Publicado en el número 63 de Linux Gazette, Febrero (EXTRA) 2001