La cosa está así, en el trabajo me enviaron un enlace a un sitio web que consistía de muchos más enlaces a archivos que necesitaban descargar, algunos, envían directamente al archivo, otros a alguna otra página con más enlaces a los distintos archivos. Mi tarea era descargar cada uno de estos archivos.

Bien, realizar está tarea de forma manual podría llevarme varios días. Sin mencionar lo aburrida, mecánica y monótona que puede resultar. Así que decidí ahorrarme tiempo y escribir un script de Python que haga todo lo que necesito. Lo comparto por si alguien lo necesita, obviamente el script puede mejorarse bastante.

[code language=“python”]import os, urllib2, sys, urlparse from bs4 import BeautifulSoup

def process_html(url, save_path, nombre): request = urllib2.Request(url) html = urllib2.urlopen(request) soup = BeautifulSoup(html.read(), ‘html.parser’) has_links = len(soup.find_all(‘a’)) if nombre != “Manuales”: if not os.path.exists(save_path): os.mkdir(save_path) new_path = save_path + nombre + “.html” save_file(url,new_path)

if has_links > 0: for link in soup.find_all(‘a’): archivo = link.get(‘href’) archivo = archivo.split(’ ’)[0] archivo = os.path.basename(archivo) nombre, ext = os.path.splitext(archivo)

new_url = urlparse.urljoin(url,archivo) if ext != “.html”: new_path = save_path + archivo save_file(new_url,new_path) else: new_path = save_path + nombre + ”\\” process_html(new_url, new_path, nombre) else: new_path = save_path + nombre + “.html” save_file(url,new_path)

def save_file(url,save_path): if not os.path.exists(save_path): try: current = urllib2.urlopen(url) print ”[*] Descargando: %s en la siguiente ubicacion: %s” %(os.path.basename(url),save_path)

f = open(save_path, “wb”) f.write(current.read()) f.close() except urllib2.URLError as e: print ”[*] No se pudo obtener información del servidor”

url = “http://www.paginafalsa.com/esta es la pagina inicial donde están nuestros vínculos save_path = “C:\\Users\\Sistemas\\Desktop\\BPTMP\\ManualesDescargados\\”

process_html(url, save_path, “Manuales”) [/code]

En fin, cualquier duda sobre el código o sugerencias para mejorarlo son bienvenidos.