2016-11-24 36 views
1

Ich versuche ein Skript zu erstellen, das eine Webseite scrapt und alle gefundenen Bilddateien herunterlädt.So laden Sie Dateien von einer Webseite mit Python

Meine erste Funktion ist eine wget-Funktion, die die Webseite liest und einer Variablen zuweist. Meine zweite Funktion ist eine RegEx, die für die sucht ‚ssrc =‘ in einem Web-Seiten html, unten ist die Funktion:

def find_image(text): 
    '''Find .gif, .jpg and .bmp files''' 
    documents = re.findall(r'\ssrc="([^"]+)"', text) 
    count = len(documents) 
    print "[+] Total number of file's found: %s" % count 
    return '\n'.join([str(x) for x in documents]) 

Die Ausgabe von dieser ist so etwas wie dieses:

example.jpg 
image.gif 
http://www.webpage.com/example/file01.bmp 

Ich bin versuchen, eine dritte Funktion zu schreiben, die diese Dateien mit urllib.urlretrieve (URL, Dateiname) herunterlädt, aber ich bin mir nicht sicher, wie das geht, vor allem, weil ein Teil der Ausgabe absolute Pfade ist, wo andere relativ sind. Ich bin auch unsicher, wie ich diese alle gleichzeitig herunterladen und herunterladen kann, ohne dass ich jedes Mal einen Namen und einen Ort angeben muss.

+1

html nicht mit Regexen analysieren http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – n1c9

Antwort

0

Pfad-Agnostic Abrufen von Ressourcen (kann handhaben absolute/relative Pfade) -

from bs4 import BeautifulSoup as bs 
import urlparse 
from urllib2 import urlopen 
from urllib import urlretrieve 
import os 

def fetch_url(url, out_folder="test/"): 
    """Downloads all the images at 'url' to /test/""" 
    soup = bs(urlopen(url)) 
    parsed = list(urlparse.urlparse(url)) 

    for image in soup.findAll("img"): 
     print "Image: %(src)s" % image 
     filename = image["src"].split("/")[-1] 
     parsed[2] = image["src"] 
     outpath = os.path.join(out_folder, filename) 
     if image["src"].lower().startswith("http"): 
      urlretrieve(image["src"], outpath) 
     else: 
      urlretrieve(urlparse.urlunparse(parsed), outpath) 

fetch_url('http://www.w3schools.com/html/') 
0

Ich kann Ihnen den vollständigen Code nicht schreiben, und ich bin sicher, das ist nicht das, was Sie auch wollen würde, aber Hier sind einige Tipps:

1) Do nicht parse zufällige HTML-Seiten mit Regex, gibt es einige Parser dafür gemacht. Ich schlage vor, BeautifulSoup. Sie filtern alle img Elemente und erhalten ihre src Werte.

2) Mit den Werten src können Sie Ihre Dateien so herunterladen, wie Sie es bereits tun. Über das relative/absolute Problem, verwenden Sie das urlparse Modul, gemäß this SO answer. Die Idee besteht darin, die src des Bildes mit der URL zu verbinden, von der Sie das HTML heruntergeladen haben. Wenn der src bereits absolut ist, wird es so bleiben.

3) Um alle herunterzuladen, iterieren Sie einfach eine Liste der Webseiten, von denen Sie Bilder herunterladen möchten, und führen Sie die Schritte 1 und 2 für jedes Bild auf jeder Seite durch. Wenn Sie "zur gleichen Zeit" sagen, möchten Sie sie wahrscheinlich asynchron herunterladen. In diesem Fall empfehle ich, jede Webseite herunterzuladen in one thread.

Verwandte Themen