2012-02-10 11 views
6

Lo mismo se preguntó hace 2,5 años en Downloading a web page and all of its resource files in Python pero no da respuesta y el tema "por favor, consulte el tema relacionado" realmente no es lo mismo.Equivalente a wget en Python para descargar sitio web y recursos

Quiero descargar todo en una página para que sea posible verlo solo desde los archivos.

El comando

wget --page-requisitos --domains --html-extension = DOMINIO --no-padres---convert enlaces --restrict-file-nombres = ventanas

hace exactamente eso que necesito. Sin embargo, queremos poder vincularlo con otras cosas que deben ser portátiles, por lo que requiere que esté en Python.

He estado mirando Beautiful Soup, scrapy, varias arañas publicadas en todo el lugar, pero todas parecen tratar con la obtención de datos/enlaces de forma inteligente pero específica. Usar estos para hacer lo que quiero parece que requerirá mucho trabajo para tratar de encontrar todos los recursos, cuando estoy seguro de que debe haber una manera fácil.

muchas gracias

+0

de importación ('http://www.somesite.com/file .whatever ',' filename que se descargará como ') – CR0SS0V3R

+1

así sé que puedo descargar un archivo singular de esa manera, pero tendré que usar un rastreador y establecer muchas condiciones para encontrar todos los archivos que quiero (todo para poder ver una sección de un sitio web sin conexión). Debe haber algo acerca de ese sitio web de descargas y requisitos en Python? – Conrad

+0

puede usar una función de análisis dentro de un for-loop para buscar enlaces dentro del archivo descargado (o leer desde cualquier lugar) – CR0SS0V3R

Respuesta

3

Usted debe estar utilizando una herramienta adecuada para el trabajo a mano.

Si desea arañar un sitio y guardar las páginas en el disco, Python probablemente no sea la mejor opción para eso. Los proyectos de código abierto obtienen funciones cuando alguien necesita esa característica, y como el wget hace su trabajo tan bien, nadie se ha molestado en tratar de escribir una biblioteca de Python para reemplazarlo.

Considerando que wget se ejecuta en casi cualquier plataforma que tenga un intérprete de Python, ¿hay alguna razón por la que no pueda usar wget?

+0

usted hace un buen punto que nadie escribiría uno para python, la única razón por la que no he seguido la ruta de wget es porque me pidieron que lo hiciera en Python ... supongo que quieren reducir las dependencias. Hemos escrito prácticamente la herramienta en Python para nuestro uso limitado. Lo publicaré aquí si está permitido – Conrad

1

Mi colega escribió este código, un montón de otras fuentes, creo. Podría tener algunas peculiaridades específicas de nuestro sistema, pero debería ayudar a cualquiera que desee hacer las mismas

""" 
    Downloads all links from a specified location and saves to machine. 
    Downloaded links will only be of a lower level then links specified. 
    To use: python downloader.py link 
""" 
import sys,re,os,urllib2,urllib,urlparse 
tocrawl = set([sys.argv[1]]) 
# linkregex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?') 
linkregex = re.compile('href=[\'|"](.*?)[\'"].*?') 
linksrc = re.compile('src=[\'|"](.*?)[\'"].*?') 
def main(): 
    link_list = []##create a list of all found links so there are no duplicates 
    restrict = sys.argv[1]##used to restrict found links to only have lower level 
    link_list.append(restrict) 
    parent_folder = restrict.rfind('/', 0, len(restrict)-1) 
    ##a.com/b/c/d/ make /d/ as parent folder 
    while 1: 
     try: 
      crawling = tocrawl.pop() 
      #print crawling 
     except KeyError: 
      break 
     url = urlparse.urlparse(crawling)##splits url into sections 
     try: 
      response = urllib2.urlopen(crawling)##try to open the url 
     except: 
      continue 
     msg = response.read()##save source of url 
     links = linkregex.findall(msg)##search for all href in source 
     links = links + linksrc.findall(msg)##search for all src in source 
     for link in (links.pop(0) for _ in xrange(len(links))): 
      if link.startswith('/'): 
       ##if /xxx a.com/b/c/ -> a.com/b/c/xxx 
       link = 'http://' + url[1] + link 
      elif ~link.find('#'): 
       continue 
      elif link.startswith('../'): 
       if link.find('../../'):##only use links that are max 1 level above reference 
        ##if ../xxx.html a.com/b/c/d.html -> a.com/b/xxx.html 
        parent_pos = url[2].rfind('/') 
        parent_pos = url[2].rfind('/', 0, parent_pos-2) + 1 
        parent_url = url[2][:parent_pos] 
        new_link = link.find('/')+1 
        link = link[new_link:] 
        link = 'http://' + url[1] + parent_url + link 
       else: 
        continue 
      elif not link.startswith('http'): 
       if url[2].find('.html'): 
        ##if xxx.html a.com/b/c/d.html -> a.com/b/c/xxx.html 
        a = url[2].rfind('/')+1 
        parent = url[2][:a] 
        link = 'http://' + url[1] + parent + link 
       else: 
        ##if xxx.html a.com/b/c/ -> a.com/b/c/xxx.html 
        link = 'http://' + url[1] + url[2] + link 
      if link not in link_list: 
       link_list.append(link)##add link to list of already found links 
       if (~link.find(restrict)): 
       ##only grab links which are below input site 
        print link ##print downloaded link 
        tocrawl.add(link)##add link to pending view links 
        file_name = link[parent_folder+1:]##folder structure for files to be saved 
        filename = file_name.rfind('/') 
        folder = file_name[:filename]##creates folder names 
        folder = os.path.abspath(folder)##creates folder path 
        if not os.path.exists(folder): 
         os.makedirs(folder)##make folder if it does not exist 
        try: 
         urllib.urlretrieve(link, file_name)##download the link 
        except: 
         print "could not download %s"%link 
       else: 
        continue 
if __name__ == "__main__": 
    main() 

gracias por las respuestas

urllib urllib.urlretrieve
+0

Soy un principiante en la programación. ¿Puede decirme cómo uso este código? También quiero descargar todo lo vinculado a una página web y abrirlo localmente y también me piden que lo haga en Python. –

+0

¿Dónde pongo mi enlace y dónde se guarda mi página? –

+1

ouch .. use un analizador html –

Cuestiones relacionadas