Extrahieren von Links aus einem numerischen Bereich von Webseiten

Extrahieren von Links aus einem numerischen Bereich von Webseiten

Ich möchte Links aus einer numerischen Seitenfolge wie dieser extrahieren:

http://example.com/seite001.html
http://example.com/seite002.html
http://example.com/seite003.html
...
http://example.com/seite329.html

Als Ausgabe möchte ich eine Textdatei mit URLs verwenden, die aus den Links auf diesen Seiten gesammelt wurden:

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

Um es klarzustellen: Ich möchte die Seiten nicht herunterladen, ich möchte nur eine Liste mit Links.

Windows-Software wäre eine gute Idee, aber Linux wäre auch ok. Ich kann mir nur vorstellen, ein langes Batch-Skript mit Xidel zu schreiben, aber das wäre bei Fehlern nicht sehr robust. Curl kann den Seitenbereich herunterladen, aber dann muss ich sie irgendwie analysieren.


Vielen Dank 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 einem in $site gespeicherten String 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 generieren, 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 bricht bei einem Fehler einfach ab, was mir lieber ist. Es wäre trivial, es so zu ändern, dass es einfach weitermacht. Der User-Agent und die Accept-Daten wurden aus Chrome übernommen, da einige Websites nichts mögen, was wie ein Bot aussieht. Wenn Sie Websites scannen möchten, die Ihnen nicht gehören, beachten Sie bitte die robots.txt-Datei und richten Sie einen benutzerdefinierten User-Agent ein.

Antwort1

Wenn Sie hierfür Code verwenden möchten, können Sie dies in Perl mithilfe der Module LWP::Simple oder Mechanize tun.

Im Folgenden finden Sie möglicherweise, wonach Sie suchenSuchen Sie mit dem Modul LWP::Simple nach allen Links auf einer Webseite

Dies setzt voraus, dass Sie mit der Verwendung einer Befehlszeilenlösung mit Perl vertraut sind. Dies funktioniert auf Windows- und Linux-Plattformen gleich. Es sind keine großen Änderungen erforderlich, um URLs als Parameter von der Befehlszeile zum Parsen zu übernehmen.

Antwort2

Ja, es ist ein gutes altes Bash-Skript. Es verwendet den Lynx-Browser, um die URLs aus den Seiten zu extrahieren und in eine Textdatei zu schreiben:

#!/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=${1} ; i<=${2} ; i++ )); do {
    num=$(printf "%04d" ${i})
    url=$(echo ${4} | sed "s/<num>/${num}/")
    lynx -dump -listonly "${url}" | 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 auf stdout. Für das Beispiel in Ihrer Frage würden Sie also Folgendes tun (vorausgesetzt, Sie speichern das Skript in einer Datei namens „linkextract“):

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

Antwort3

Du kannst den ... benutzenSite Visualizer-Crawlerfür diese Arbeit. Laden Sie es herunter und installieren Sie es, dann klicken Sie aufNeues Projekt, geben Sie die URL Ihrer Website ein, klicken Sie auf OK und dannCrawl startenWerkzeugschaltfläche.

Doppelklicken Sie nach Abschluss des CrawlingsAlle LinksBericht derBerichteSie 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 Tastenkombination Strg+A) und klicken Sie dann aufZeilen mit Überschriften kopierenKontextmenüpunkt. Anschließend können Sie die Daten in eine Excel-Tabelle oder ein einfaches Textdokument einfügen:

Extrahieren Sie alle Website-Links

Das Programm verfügt über eine 30-tägige Testphase, ist jedoch mit allen Funktionen ausgestattet, sodass Sie es einen Monat lang kostenlos nutzen können.

verwandte Informationen