wget mit Platzhaltern in http Downloads


53

Ich muss eine Datei mit wget herunterladen, weiß jedoch nicht genau, wie der Dateiname lautet.

https://foo/bar.1234.tar.gz

Laut der Manpage können Sie mit wget das Globbing bei einer FTP-Site ein- und ausschalten, allerdings habe ich eine http-URL.

Wie kann ich einen Platzhalter verwenden, während ich einen wget verwende? Ich benutze Gnu Wget.

Dinge, die ich versucht habe.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Aktualisieren

Wenn Sie -A verwenden, werden alle Dateien heruntergeladen, die auf dem Server mit .tar.gz enden.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Aktualisieren

Aus den Antworten geht hervor, dass dies die Syntax ist, die letztendlich funktioniert hat.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"

2
Dies ist nicht genau das, wonach Sie suchen, aber es hängt damit zusammen: Curl bietet die Möglichkeit, einfache Platzhalter zu verwenden, z. B .:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World,

1
Ein Problem für mich war -e robots=off, dass robots.txt nicht befolgt wurde: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen

Ich fand das Hinzufügen der Flaggen -nHund --cut-dirs=<number>war auch nützlich
Randall

Antworten:


62

Ich denke, diese Schalter werden tun, was Sie wollen wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

Beispiel

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/

15

Es gibt einen guten Grund, warum dies nicht direkt mit HTTP funktioniert, und das heißt, dass eine URL kein Dateipfad ist, obwohl die Verwendung /als Trennzeichen dazu führen kann, dass sie wie ein solcher aussieht, und sie stimmen manchmal überein. 1

Herkömmlicherweise (oder historisch) spiegeln Webserver häufig Verzeichnishierarchien (für einige - z. B. Apache - ist dies eine Art Integral) und stellen sogar Verzeichnisindizes ähnlich einem Dateisystem bereit. Für das HTTP-Protokoll ist dies jedoch nicht erforderlich.

Dies ist von Bedeutung, denn wenn man auf etwa ein glob anwenden wollen, alles , was ein subpath von ist http://foo/bar/, es sei denn , der Server einen Mechanismus liefert Ihnen mit einer solchen (zB dem oben erwähnten Index) zur Verfügung zu stellen, gibt es nichts , um es den glob anwenden zu . Es ist kein Dateisystem zum Durchsuchen vorhanden. Zum Beispiel, nur weil Sie wissen , dass es Seiten http://foo/bar/one.htmlund http://foo/bar/two.htmlbedeutet nicht , dass Sie eine Liste von Dateien und Unterverzeichnisse über bekommen kann http://foo/bar/. Es wäre völlig im Protokoll, wenn der Server dafür 404 zurückliefe. Oder es könnte eine Liste von Dateien zurückgeben. Oder es könnte Ihnen ein schönes JPG-Bild schicken. Usw.

Es gibt hier also keinen Standard, den wgetman ausnutzen kann. AFAICT, wget spiegelt eine Pfadhierarchie, indem Links auf jeder Seite aktiv untersucht werden . Mit anderen Worten, wenn Sie rekursiv spiegeln , werden Links http://foo/bar/index.htmlheruntergeladen index.htmlund extrahiert, die ein Unterpfad davon sind. 2 Der -ASchalter ist einfach ein Filter, der in diesem Prozess angewendet wird.

Kurz gesagt, wenn Sie wissen, dass diese Dateien irgendwo indiziert sind, können Sie damit beginnen -A. Wenn nicht, dann haben Sie Pech.


1. Natürlich ist eine FTP-URL auch eine URL. Obwohl ich nicht viel über das FTP-Protokoll weiß, würde ich davon ausgehen, dass es eine Form hat, die transparentes Globbing ermöglicht.

2. Dies bedeutet, dass es eine gültige URL geben kann http://foo/bar/alt/whatever/stuff/, die nicht enthalten ist, da sie in keiner Weise mit etwas in der Menge der verknüpften Dinge verknüpft ist http://foo/bar/index.html. Im Gegensatz zu Dateisystemen sind Webserver nicht verpflichtet, das Layout ihrer Inhalte transparent zu machen, und müssen dies auch nicht auf intuitive Weise tun.


0

Die oben genannte Lösung mit dem Muster "A" funktioniert möglicherweise nicht auf allen Webseiten. Dies ist meine Abhilfe mit einem doppelten Wget:

  1. wget Die Seite
  2. grep für muster
  3. wget die Dateien)

Beispiel: Angenommen, es handelt sich um eine Nachrichten-Podcast-Seite, und ich möchte, dass 5 MP3-Dateien oben auf der Seite angezeigt werden:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

Der grepsucht nach doppelten, in Anführungszeichen gesetzten Links ohne Leerzeichen, die ://meinen Dateinamen enthalten pattern.


Was ist Zufall hier?
Royki

Eine Shell-Variable, siehe bashManpage. RANDOM Jedes Mal, wenn auf diesen Parameter verwiesen wird, wird eine zufällige Ganzzahl zwischen 0 und 32767 generiert.
Nachtschicht
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.