Extrahieren von Links aus einem numerischen Bereich von Webseiten

1183

Ich möchte Links aus einer numerischen Folge von Seiten wie folgt extrahieren:

http://example.com/page001.html
http://example.com/page002.html
http://example.com/page003.html
...
http://example.com/page329.html

Bei der Ausgabe möchte ich eine Textdatei mit URLs, die aus den Links auf diesen Seiten stammen:

http://www.test.com/index.html
http://www.google.com
http://www.superuser.com/questions

Um klar zu sein, ich möchte die Seiten nicht herunterladen, ich möchte nur eine Liste mit Links.

Windows-Software wäre eine Idee, aber Linux wäre auch in Ordnung. Ich kann mir nur vorstellen, ein langes Batch-Skript mit Xidel zu schreiben, aber es wäre nicht sehr robust, wenn Fehler auftauchen. Curl kann den Seitenbereich herunterladen, aber dann muss ich sie irgendwie analysieren.


Danke an Enigman, der mich auf die richtige Spur gebracht hat. Ich habe ein Perl-Skript erstellt, das URLs aus einer Datei liest und Links ausgibt, die einer in $ site gespeicherten Zeichenfolge entsprechen:

use warnings; use LWP; $site = "twitter.com";  my $browser = LWP::UserAgent->new; my @ns_headers = ( 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language' => 'en-GB,en;q=0.8', );  open (URLLIST, 'urls.txt'); while (<URLLIST>) { chomp; print "# $_\n"; my $response = $browser->get($_, @ns_headers); die "Can't get $_ -- ", $response->status_line unless $response->is_success;  my @urls = $response->content =~ /\shref="?([^\s>"]+)/gi ; foreach $url(@urls) { if ($url =~ /$site/) { print("$url\n"); } } } close(URLLIST); 

Um die URL-Liste zu erstellen, habe ich ein kleines Batch-Skript erstellt:

@echo off for /l %%i in (0, 15, 75) do @echo http://www.example.com/page_%%i.html 

Das Perl-Skript stoppt einfach bei einem Fehler, den ich vorziehen möchte. Es wäre trivial, es zu modifizieren, um einfach weiterzumachen. Der Benutzeragent und die akzeptierten Daten werden von Chrome gerippt, da einige Websites nichts mögen, das wie ein Bot aussieht. Wenn Sie beabsichtigen, Websites zu scannen, die Sie nicht besitzen, respektieren Sie bitte die Datei "robots.txt" und richten Sie einen benutzerdefinierten Benutzeragenten ein.

2
Ich verstehe nicht was du meinst. Könnten Sie es näher erläutern? Welche URLs möchten Sie analysieren? Möchten Sie einfach die `href`-Eigenschaft von` `elements extrahieren ? Woher bekommst du die numerische Reihenfolge? Birei vor 9 Jahren 0
Angenommen, die Seiten enthalten Links zu Dateien, die auf randomfilehost.com gespeichert sind. Ich möchte den Seitenbereich analysieren und all diese Links extrahieren. Nur die URLs, keine Notwendigkeit für HTML. Vielen Dank. vor 9 Jahren 0
Sie meinen also, dass Sie eine Liste von URLs kennen, die um eine einmalige Nummer herum aufgebaut sind, und Sie wollen die Seiten herunterladen, aber dann möchten Sie sie analysieren und die `href'-Eigenschaften von` extrahieren `Elemente, speichern Sie diese und verwerfen Sie den Rest des HTML. Recht? G-Man vor 9 Jahren 0
Ich möchte nur die Links, was das Herunterladen der Seiten beinhaltet, aber ich muss sie nicht speichern, wenn Sie das meinen. vor 9 Jahren 0
wie tief musst du gehen? Nur was ist auf der Hauptseite? Journeyman Geek vor 9 Jahren 0

3 Antworten auf die Frage

3
Enigman

Wenn Sie dazu Code verwenden möchten, können Sie dies in Perl tun, indem Sie LWP :: Simple- oder Mechanize-Module verwenden.

Nachstehend finden Sie möglicherweise das, wonach Sie suchen. Suchen Sie alle Links auf einer Webseite mithilfe des LWP :: Simple-Moduls

Dies setzt voraus, dass Sie mit der Befehlszeilenlösung mit Perl vertraut sind. Dies funktioniert auf Windows- und Linux-Plattformen gleich. Es wäre nicht viel zu ändern, um URLs als Parameter von der Befehlszeile für die Analyse zu übernehmen.

Danke, das sieht nach etwas aus, das ich in eine praktikable Lösung verwandeln kann. vor 9 Jahren 0
3
Sam Washington

Ja, es ist ein gutes altes Bash-Skript. Hierbei werden mit dem Lynx-Browser die URLs von den Seiten extrahiert und in eine Textdatei ausgegeben:

#!/bin/bash # # Usage: # # linkextract <start> <end> <pad> <url> # # <start> is the first number in the filename range. Must be an integer # <stop> is the last number in the filename range. Must be an integer # <pad> is the number of digits the number in the filename is zero-padded to.  # <url> is the URL. Insert "<num>" where you want the number to appear. You'll # need to enclose the entire argument in quotes  for (( i=$ ; i<=$ ; i++ )); do { num=$(printf "%04d" $) url=$(echo $ | sed "s/<num>/$/") lynx -dump -listonly "$" | sed -r -n "/^ +[0-9]/s/^ +[0-9]+\. //p" }; done 

Sie müssen den lynx-Browser installieren, der unter Debian als Paket 'lynx' verfügbar ist. Das Skript druckt die extrahierten URLs in stdout. Für das Beispiel in Ihrer Frage, das Sie tun würden (vorausgesetzt, Sie speichern das Skript in einer Datei namens linkextract):

$ linkextract 1 329 3 "http://example.com/page<num>.html" 
1
Oleg

Sie können den Site Visualizer-Crawler für diese Arbeit verwenden. Downloaden und installieren Sie es und klicken Sie auf Neues Projekt, Ihre Website-URL eingeben, klicken Sie auf OK, dann Crawling starten Werkzeugschaltfläche.

Nachdem das Crawlen abgeschlossen ist, doppelklicken Sie auf der Registerkarte " Berichte" auf den Bericht " Alle Links" . Sie erhalten alle Links, die auf der Website vorhanden sind, sowie weitere Informationen: Quell- / Ziel-Link-URLs, Inhaltstyp (HTML, Bild, PDF, CSS usw.), Antwort usw. Wählen Sie die gesamte Tabelle aus (Kontextmenü oder Strg + A-Verknüpfung) und klicken Sie dann auf das Kontextmenüelement Zeilen mit Kopfzeilen kopieren . Danach können Sie die Daten in eine Excel-Tabelle oder ein einfaches Textdokument einfügen:

extract all website links

Das Programm hat eine 30-tägige Testphase, ist jedoch voll funktionsfähig, sodass Sie es 1 Monat lang kostenlos nutzen können.

Vielen Dank. Das einzige Problem, das ich sehe, ist, dass es den von mir benötigten Seitenbereich scheinbar nicht unterstützt. Es gibt viele Crawler-Apps, die jedoch nur die gesamte Site abdecken, die zehntausende Seiten umfasst. Ich möchte nur ein paar hundert und nichts anderes machen. vor 9 Jahren 0
Sie können einen solchen URL-Bereich festlegen, indem Sie die Option zum Durchsuchen von URLs verwenden (http://site-visualizer.com/sitemap/crawling#IncludeExcludeURLs) verwenden. Oleg vor 9 Jahren 0