2012-02-10 13 views
6

To samo pytanie zadawane 2,5 roku temu w Downloading a web page and all of its resource files in Python, ale nie prowadzi do odpowiedzi, a "zobacz powiązany temat" tak naprawdę nie pyta o to samo.Odpowiednik wget w Pythonie do pobrania strony i zasobów

Chcę pobrać wszystko na stronie, aby możliwe było przeglądanie go tylko z plików.

Komenda

wget --page-rekwizytów --domains = domain --no-parent --html-extension --convert-linki --restrict-file-names = okien

dokładnie to, czego potrzebuję. Chcemy jednak móc powiązać go z innymi rzeczami, które muszą być przenośne, więc wymaga tego w Pythonie.

Patrzyłem na piękną zupę, scrapy, różne pająki umieszczone w pobliżu, ale te wszystkie wydają się zajmować pozyskiwaniem danych/linków w sprytny, ale konkretny sposób. Używanie ich do robienia tego, co chcę, wydaje się, że będzie wymagało wiele pracy, aby znaleźć wszystkie zasoby, kiedy jestem pewien, że musi być łatwy sposób.

bardzo dziękuję

+0

import urllib urllib.urlretrieve ("http://www.somesite.com/file "cokolwiek", "nazwa pliku do pobrania jako") – CR0SS0V3R

+1

, więc wiem, że mogę pobrać pojedynczy plik w ten sposób, ale będę musiał użyć przeszukiwacza i ustawić wiele warunków, aby znaleźć wszystkie pliki, które chcę (wszystko, aby móc wyświetlić sekcję strony internetowej w trybie offline). Czy w witrynie Python musi znajdować się coś podobnego do strony pobierania plików i zapotrzebowań? – Conrad

+0

można użyć funkcji parsowania w pętli for do wyszukiwania linków w pobranym pliku (lub czytanym skądkolwiek) – CR0SS0V3R

Odpowiedz

3

Powinieneś używać odpowiedniego narzędzia do pracy.

Jeśli chcesz spider witryny i zapisać strony na dysku, Python prawdopodobnie nie jest najlepszym wyborem dla tego. Projekty open source uzyskują funkcje, gdy ktoś potrzebuje tej funkcji, a ponieważ wget wykonuje swoją pracę tak dobrze, nikt nie zadał sobie trudu, aby spróbować napisać bibliotekę Pythona, aby ją zastąpić.

Biorąc pod uwagę, że wget działa na prawie każdej platformie z interpreterem Pythona, czy istnieje powód, dla którego nie można używać wget?

+0

Dobrze trafiłeś, że nikt nie napisałby dla Pythona, jedynym powodem, dla którego nie poszedłem na szlak wget, zostałem poproszony o zrobienie tego w Pythonie ... Zgaduję, że chcą zmniejszyć zależności. W języku Python napisaliśmy już to narzędzie z myślą o wąskim użyciu. Opublikuję go tutaj, jeśli będzie to dozwolone – Conrad

1

Mój kolega napisał ten kod, losowo zestawiony z innych źródeł, jak sądzę. Może mieć pewne specyficzne dziwactwa dla naszego systemu, ale powinna pomóc ktoś chce zrobić te same

""" 
    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() 

dzięki za odpowiedzi

+0

Jestem początkującym programistą. Czy możesz mi powiedzieć, w jaki sposób mogę użyć tego kodu? Chcę również pobrać wszystko, co jest powiązane ze stroną internetową i otworzyć ją lokalnie, a także proszę o zrobienie tego w Pythonie. –

+0

Gdzie mogę umieścić mój link i gdzie moja strona jest zapisywana? –

+1

ouch .. użyj analizatora html –