it-swarm.com.de

Spinne eine Website und gib nur URLs zurück

Ich suche nach einer Möglichkeit, eine Website zu pseudospinnen. Der Schlüssel ist, dass ich eigentlich nicht den Inhalt will, sondern eine einfache Liste von URIs. Mit Wget kann ich dieser Idee einigermaßen nahe kommen, indem ich --spider Option, aber wenn ich diese Ausgabe durch ein grep leite, kann ich nicht die richtige Magie finden, um es zum Laufen zu bringen:

wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'

Der Filter grep scheint keinerlei Auswirkungen auf die Ausgabe von wget zu haben. Habe ich etwas falsch gemacht oder gibt es ein anderes Tool, das ich ausprobieren sollte, um eine solche begrenzte Ergebnismenge bereitzustellen?

[~ # ~] Update [~ # ~]

Ich habe gerade offline herausgefunden, dass wget standardmäßig nach stderr schreibt. Ich habe das auf den Manpages verpasst (tatsächlich habe ich es immer noch nicht gefunden, wenn es dort drin ist). Sobald ich die Rückkehr zu stdout geleitet habe, bin ich näher zu dem gekommen, was ich brauche:

wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'

Ich wäre immer noch an anderen/besseren Mitteln interessiert, um so etwas zu tun, falls es welche gibt.

57
Rob Wilkerson

Das absolute letzte, was ich tun möchte, ist, den gesamten Inhalt selbst herunterzuladen und zu analysieren (d. H. Meine eigene Spinne zu erstellen). Als ich erfuhr, dass Wget standardmäßig in stderr schreibt, konnte ich es in stdout umleiten und die Ausgabe entsprechend filtern.

wget --spider --force-html -r -l2 $url 2>&1 \
  | grep '^--' | awk '{ print $3 }' \
  | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \
  > urls.m3u

Dadurch erhalte ich eine Liste der Inhaltsressourcen (Ressourcen, die keine Bilder, CSS- oder JS-Quelldateien sind), deren URIs von Spidern erfasst werden. Von dort aus kann ich die URIs zur Bearbeitung an ein Drittanbieter-Tool senden, um meine Anforderungen zu erfüllen.

Die Ausgabe muss noch etwas optimiert werden (es werden Duplikate wie oben gezeigt erzeugt), aber sie ist fast da und ich musste mich nicht selbst analysieren.

47
Rob Wilkerson

Erstellen Sie einige reguläre Ausdrücke, um die Adressen aus allen zu extrahieren

<a href="(ADDRESS_IS_HERE)">.

Hier ist die Lösung, die ich verwenden würde:

wget -q http://example.com -O - | \
    tr "\t\r\n'" '   "' | \
    grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
    sed -e 's/^.*"\([^"]\+\)".*$/\1/g'

Dadurch werden alle http-, https-, ftp- und ftps-Links von einer Webseite ausgegeben. Sie erhalten keine relativen URLs, sondern nur vollständige URLs.

Erläuterung zu den in der Reihe der Pipe-Befehle verwendeten Optionen:

mit wget -q wird keine übermäßige Ausgabe erzeugt (stiller Modus). wget -O - sorgt dafür, dass die heruntergeladene Datei auf stdout zurückgegeben und nicht auf der Festplatte gespeichert wird.

tr ist der Unix-Zeichenübersetzer, der in diesem Beispiel zum Übersetzen von Zeilenumbrüchen und Tabulatoren in Leerzeichen sowie zum Konvertieren von einfachen Anführungszeichen in doppelte Anführungszeichen verwendet wird, damit wir unsere regulären Ausdrücke vereinfachen können.

grep -i macht die Suche unabhängig von Groß- und Kleinschreibung. grep -o gibt nur die übereinstimmenden Teile aus.

sed ist das Stream EDitor-Unix-Dienstprogramm, mit dem Filter- und Transformationsvorgänge durchgeführt werden können.

mit sed -e können Sie dem Text nur einen Ausdruck geben.

Das Ausführen dieses kleinen Skripts unter " http://craigslist.org " ergab eine recht lange Liste von Links:

http://blog.craigslist.org/
http://24hoursoncraigslist.com/subs/nowplaying.html
http://craigslistfoundation.org/
http://atlanta.craigslist.org/
http://austin.craigslist.org/
http://boston.craigslist.org/
http://chicago.craigslist.org/
http://cleveland.craigslist.org/
...
21
Jay Taylor

Ich habe ein Tool namens xidel verwendet

xidel http://server -e '//a/@href' | 
grep -v "http" | 
sort -u | 
xargs -L1 -I {}  xidel http://server/{} -e '//a/@href' | 
grep -v "http" | sort -u

Ein bisschen hackisch, bringt dich aber näher! Dies ist nur die erste Ebene. Stellen Sie sich vor, Sie packen dies in ein selbstrekursives Skript!

6
Rick