2016-07-19 4 views
0

Ich möchte täglich einen Podcast herunterladen. Es hat die Form einer MP3-Datei, so dass die Erweiterung der Zieldatei immer dieselbe ist. Der erste Teil des Dateinamens ändert sich auch nicht - nennen wir es ProgName -. Ein anderes Segment des Dateinamens ändert sich auf vorhersehbare Weise; es ist das heutige Datum in der Form 01-01-1999. Aber der mittlere Teil des Dateinamens ändert sich ziemlich unvorhersehbar: Er besteht aus einer Folge von 8 scheinbar zufälligen ganzen Zahlen. Die Endung des Dateinamens, d. H. Der Teil vor der Erweiterung, ändert sich auch nicht - sagen wir es ist "-full". Der Name einer Beispieldatei für den 1. Januar 1999 würde dann wie folgt aussehen: ProgName-01-01-1999--full.mp3. Die Datei für den nächsten Tag, den 2. Januar, würde ProgName-01-02-1999-23871640-full.mp3 heißen. Und so weiter.wget oder curl-Datei mit einer Zeichenfolge von 8 zufälligen Ganzzahlen

Die Dateien werden über http verfügbar gemacht, und ich kann sie mit wget herunterladen, sobald ich den vollständigen Pfad gefunden habe, indem ich zur Webseite navigiere. Aber ich versuche das zu automatisieren und hoffe auf einen Cron-Job, den ich zu einer bestimmten Stunde jeden Tag ausführen kann, zu einer Zeit, in der ich sicher bin, dass die neueste Episode verfügbar sein wird. Als Beispiel

wget http://my.desiredurl.here/downloads/ProgName-01-01-1999--full.mp3

lädt die Datei erfolgreich ProgName-01-01-199--full.mp3 auf meinem Computer (nicht credentialed Website). Aber bis ich einen Weg finden kann (vielleicht mithilfe von Platzhaltern oder geschweiften Klammern?), Um dies zu automatisieren, muss ich den Download manuell durchführen. Also würde ich gerne um Hilfe bitten.

Ich habe etwas über Brace-Erweiterung gelesen, bin aber auf einer ausreichend rudimentären Ebene mit Bash, dass ich irgendwie rate, wie das funktionieren könnte. Könnte ich

erwarten

wget http://my.desiredurl.here/downloads/ProgName-01-01-1999-{00000000..99999999}-full.mp3

zu arbeiten? Ist das überhaupt der optimale Weg, um so etwas zu tun? Ich denke, ich habe es erstaunt, wie man die Eingabe des Datumsteils des Dateinamens automatisiert, bin aber momentan in Bezug auf die Ganzzahl-Zeichenfolge ratlos. Eingabe wird geschätzt.

PS Ich habe eine ganze Menge über dieses Problem gegoogelt, bevor ich hier gepostet habe. Die meisten wget-Lösungen, die ich durchlief, beinhalteten globbing und rekursives Herunterladen, was wirklich nicht das ist, was ich brauche. Es gibt eine Reihe von .mp3-Dateien auf der Zielseite, aber ich brauche nur eine davon. Ich brauche eine Möglichkeit, alle außer der Zieldatei, die das heutige Datum enthält, herauszufiltern. Curl ist auch auf meiner Maschine und könnte dafür verwendet werden, obwohl mein Fokus auf wget liegt, mit dem ich vertrauter bin.

+2

HTML-Seite scrappen, URL extrahieren (HTML mit einem DOM-Tool parsen), URL herunterladen, ???, Profit –

+0

Sie möchten absolut nicht 100.000.000 Anfragen senden (was Ihre geschweifte Erweiterung tun würde, wenn sie es tut) gearbeitet, was aus Gründen, die mit ARG_MAX und ähnlichem zusammenhängen, nicht funktioniert). Du wirst nicht innerhalb eines Tages fertig sein, * und * die Leute, die den Server betreiben, werden dich bemerken und verbieten. –

+0

... also, was Sie tun müssen, ist die tatsächliche URL zu finden. Es wird irgendwo veröffentlicht werden. Und, äh, wget hat * wirklich gute * Tools zum Filtern, wenn man einen rekursiven Download macht, also gibt es nichts Hartes oder gar nichts Unbekanntes beim Filtern nach dem aktuellen Datum. –

Antwort

0

Ich denke, ich habe eine Lösung für dieses Problem gefunden. Ein bisschen komplizierter, als ich es mir vorgestellt hatte, aber die bisherigen Tests deuten darauf hin, dass es die Aufgabe erfüllen sollte. Ich wurde dabei unterstützt, zu einer Lösung zu kommen, indem ich erkannte, dass ich entweder mit curl oder wget ein XML-Dokument herunterladen konnte, das (unter anderem) den direkten Link enthielt, den ich brauche; und 2) über Anweisungen zu gehen, von denen ich einige wieder angeeignet habe, um etwas zu tun, das zumindest einige Ähnlichkeiten mit meiner Aufgabe aufweist, unter http://nylinuxhelp.com/blogs/command-line/download-several-files-part-2.

Zuerst verwende ich curl, um die XML-Datei, die die benötigte URL enthält, zu greifen.Ich übertrage das als Ausgabe nach grep, sage es, um nach einer Zeichenkette zu suchen, die mit http beginnt und mit mp3 endet, und um diese Suche zu beenden, nachdem das erste Ergebnis gefunden wurde; -m 1, das ist die jüngste Episode, die ich anvisiere. Schließlich wird die Ausgabe dieses Befehls grep über xargs an wget übergeben, das die Datei herunterlädt und umbenennt. Der vollständige Einzeiler sieht wie folgt aus:

curl http://my.desiredurl.here/level1/level2/ | grep -m 1 -o "http:.*mp3" | xargs -n1 wget -O MyDownloaded.mp3

ich weitere Tests tun müssen, um sicherzustellen, wird wie gewünscht funktionieren, wenn sie als Cron-Job einrichten. Ich kann -n1 wahrscheinlich aus dem Xargssegment dieser Routine entfernen, da ich immer nur eine einzige URL von xargs an wget zuführen sollte. Ich sollte dies auch in ein primitives Bash-Skript einbetten, da ich das Datum gerne in den Dateinamen nach der oben von Charles aufgezeigten Mode einbauen möchte.

SPÄTER BEARBEITEN: Ich habe heute Abend einen Test mit diesem Skript als Cron-Job ausgeführt und es lief wie ein Champion. Natürlich ist es ziemlich primitiv und hat keine Fehlerprüfung, Protokollierung oder Umleitung von Fremdausgaben. Also könnte es sicherlich Verbesserungen gebrauchen. Meine Bash "Skills", wie sie sind, erlauben mir nicht viel mehr zu tun, als ich bereits habe, also werde ich es so machen, wie es momentan ist.

0

Weisen Sie wget an, nach dem erwarteten Dateinamenmuster zu filtern und geben Sie eine URL an, von der Sie erwarten, dass ein Downloadlink verfügbar ist.

Dies würde in etwa so aussehen:

date=$(date +%m-%d-%Y) # aside: Awful date format; %Y-%m-%d is what sane folks use. 
expected_name="ProgName-$date-*.mp3" 

wget --recursive --level=2 --accept "$expected_name" http://my.desiredurl.here/ 

Notiere die --level=2 - dies begrenzt die Tiefe der Rekursion. Ändern Sie den Wert auf den erforderlichen Mindestwert für die angegebene URL (und versuchen Sie, diese URL so nah wie möglich am Speicherort des Download-Links zu platzieren).

+0

Das ist eine ansprechende Lösung, die ich mehr oder weniger verstehe. Ich habe daraus ein Bash-Skript gemacht, aber bisher funktioniert es nicht (es wird heruntergeladen, keine mp3-Datei, sondern etwas, das aussieht und index.html). Die echte URL ist näher zu http://my.desiredurl.here/level1/level2/, btw. Also wählte ich --level-3. Ich habe auch "full" zu expected_name = "ProgName- $ date - * - full.mp3" hinzugefügt. Danke für den Beitrag, der so aussieht, als müsste er funktionieren. Jetzt versuchen zu diagnostizieren, warum es nicht wie erwartet funktioniert. – MJiller

+0

Denken Sie, ich verstehe, wo das Problem liegt. Die URL, die ich verwende, hat tatsächlich eine XML-Datei, die als eine Art Indexseite fungiert, und die Links, nach denen ich suche, sind in diese XML-Datei eingebettet. wget ruft aus irgendeinem Grund diese XML-Datei anstatt der Datei die mp3-Datei, die das Skript angibt, ab. Irgendwie funktioniert es gut, wenn ich die vollständige URL wähle, Dateiname eingeschlossen. Wenn das Skript versucht, diese Datei abzurufen, wird stattdessen die XML-Datei heruntergeladen. – MJiller

+0

Wenn Sie die XML-Datei herunterladen können, sollte das Extrahieren einer expliziten Liste von URLs einfach sein - es gibt viele Q & A-Einträge, die beschreiben, wie XMLStarlet und ähnliche Tools verwendet werden, um Daten aus XML in bash zu extrahieren. –