Verwenden Sie Curl, um Bilder mit Platzhaltern von der Website herunterzuladen?

Gibt es eine Möglichkeit, curl zu verwenden, um nicht sequentielle Bilder mit einem Platzhalter herunterzuladen? Ich möchte alle Panoramen, die ich auf mein Konto bei 360 Panorama hochlade, in einen lokalen Ordner herunterladen, damit ich dies nicht jedes Mal manuell tun muss.

Die Bilddateien folgen dem Muster von: http://occipital.com/images/viewer/XYZ_flat.jpg , wobei XYZ zufällig ist. Aus dieser URL geht auch hervor, dass ich bei der Site angemeldet oder als angemeldet angezeigt werden muss.

Ich bin mit curl nicht allzu vertraut, da ich es gerade erst entdeckt habe, als ich nach einer Möglichkeit suchte, diese Aufgabe zu erledigen, und curl (oder wget) schien die Lösung zu sein.
Siehe CURL, um ein Verzeichnis auf Super User herunterzuladen.
Können Sie Ihrer Frage einige spezifische (echte) URLs hinzufügen? Vielleicht finden wir dort ein Muster, das man bei Verwendung von erraten könnte curl.
@patrix hier ist eine tatsächliche URL: occipital.com/images/viewer/qSJGuD_flat.jpg – anscheinend bieten sie keinen direkten Pfad, der an den Benutzernamen gebunden ist. Hier ist der Link zu meiner Benutzerkontoseite, wenn ich nicht eingeloggt bin: occipital.com/user/01ca-255/george-coghill
@Arjan Ich versuche, nur die neueren Bilder herunterzuladen, sobald sie veröffentlicht werden, nicht das gesamte Verzeichnis und nicht nur einmal. Ich versuche zu vermeiden, jedes Mal, wenn ich neue Panoramen hochlade, zu meinem Konto zu gehen und jedes Bild manuell herunterzuladen.
Egal was, ich würde sagen, es hat wenig mit Apple zu tun und es gibt viele verwandte Beiträge auf Super User. (Und Jacks Antwort ist richtig.)
@Arjan Wie gesagt, ich bin mit all dem nicht allzu vertraut, konnte aber auf Stack Exchange nichts über den Wildcard-Aspekt finden. Ich dachte, curl wäre eine wget-Variante nur von Apple. Es ist alles sehr verwirrend.
Nicht wirklich eine Mac OS X-Frage.

Antworten (4)

Sie können diesen bashCode für die eigentliche URL verwenden, die Sie in Ihrem Kommentar angegeben haben .

for i in $(for j in {1..8}; do
    curl http://occipital.com/user/01ca-255/george-coghill/$j/;
  done \
  | sed -n 's,.*/viewer/\(......_flat\)_small\.jpg.*,http://occipital.com/images/viewer/\1.jpg,p'
); do
  curl -L -o "${i##*/}" "$i";
done

Fühlen Sie sich frei, diesen Befehl als eine Zeile zu schreiben; Alle Zeilenumbrüche wurden nur zur besseren Lesbarkeit hinzugefügt. Sie können sie nach Belieben kopieren oder entfernen.

Was dieser Code tut:

  1. Durchlaufen Sie die 8 Seiten Ihrer Kontogalerie
  2. Extrahieren Sie die Bildnamen aus den Vorschaubildern
  3. Rufen Sie alle Bilder in voller Größe mit dieser Namensliste ab

Wenn Sie nur Dateien herunterladen möchten, die nicht existieren, und die Anzahl der Galerieseiten im Voraus nicht kennen, können Sie den Code so anpassen:

for i in $(
  j=1;
  while curl --max-redirs 0 -L -f \
      http://occipital.com/user/01ca-255/george-coghill/$((j++))/; do
    :;
  done \
  | sed -n 's,.*/viewer/\(......_flat\)_small\.jpg.*,http://occipital.com/images/viewer/\1.jpg,p'
); do
  [[ -f "${i##*/}" ]] || curl -L -o "${i##*/}" "$i";
done

Der erste Code erhöht nun die Seitenzahl, bis eine Weiterleitung oder ein Fehler auftritt. Der Server leitet Sie zur letzten vorhandenen Seite weiter, wenn Sie versuchen, eine Seite nach den vorhandenen zu besuchen. Das [[ -f … ]] ||Teil wird curlnur ausgeführt, wenn die entsprechende Datei noch nicht existiert.

Das hat den Trick getan, ich muss sagen, es geht mir weit über den Kopf, aber ich schätze die Hilfe wirklich! Wie würde ich den Code optimieren, um das Download-Verzeichnis anzugeben?
@GeorgeC: "${i##*/}"ist der Name der Datei auf Ihrem lokalen Rechner; Sie können dem einen Verzeichnisnamen voranstellen, zB "some/dir/${i##*/}". Oder Sie gehen einfach cdzuerst in das gewünschte Verzeichnis.

Sie möchten also Bilder von http://occipital.com/images/viewer/ *_flat.jpg herunterladen?

Das ist nicht möglich. Sie können den Viewer nicht als Ordner behandeln. Das Web ist ein Dienst, der Ihnen Dinge zur Verfügung stellt, wenn Sie danach fragen. Es enthält keine Liste aller Dateien. Wenn Sie nicht jede Datei von AAA bis ZZZ ausprobieren, ist dies ohne Liste nicht möglich.

Das ist, was ich dachte, würde das Problem sein. Aber nehmen wir an, es gäbe eine URL, an der dies funktionieren könnte – wie würde man curl mit nicht sequenziellen URLs verwenden, um neue Dateien automatisch zu überprüfen und herunterzuladen? Oder ist es ohne ein sequenzielles URL-Muster einfach nicht möglich?

Während Sie keinen echten Platzhalter verwenden können, können Sie Teile in geschweiften Klammern angeben, dh. curl mysite.{alpha,beta,gamma}.com oder Zahlenbereiche mysite.com/files[0001-0100].txt

Weitere Informationen finden Sie auf der Curl-Manpage

http://curl.haxx.se/docs/manpage.html

Für Ihre zufälligen Dateien könnten Sie also mages/viewer/[000-999]_flat.jpg verwenden. Am Ende würden viele Dateien nicht gefunden, aber es sollten alle Dateien vorhanden sein.

Verwenden Sie, wie ClarkGoble sagte, so etwas wie diese "Brute-Force" -Lösung:

    curl http://occipital.com/images/viewer/[1-999:1]_flat.jpg -f -o -image_#1_flat.jpg

Die Option „-f“ verhindert, dass curl Ausgabedateien schreibt, wenn ein 404-Fehler auftritt. Sie erhalten also nur eine Ausgabe für die auf dem Server gefundenen Dateien.

-o steht für "Ausgabe"

#1 entspricht dem Ersetzungsmuster, dh in diesem Fall den Zahlen von 1 bis 999 mit einer Schrittweite von 1.