Wie man WGET dazu bringt, genau dieselbe Webseite wie der Browser herunterzuladen

34

Mit einem Webbrowser (IE oder Chrome) kann ich eine Webseite (.html) mit Ctl-S speichern, sie mit einem beliebigen Texteditor überprüfen und Daten in einem Tabellenformat anzeigen. Eine dieser Zahlen möchte ich extrahieren, aber für viele, viele Webseiten zu viele, um sie manuell auszuführen. Daher möchte ich WGET verwenden, um diese Webseiten nacheinander abzurufen, und ein anderes Programm schreiben, um die .html-Datei zu analysieren und die gewünschte Nummer abzurufen. Die von WGET unter der gleichen URL wie der Browser gespeicherte HTML-Datei enthält jedoch keine Datentabelle. Warum nicht? Es ist, als ob der Server erkennt, dass die Anforderung von WGET und nicht von einem Webbrowser stammt, und eine Hauptwebseite ohne Datentabelle bereitstellt. Wie kann ich mit WGET genau dieselbe Webseite erreichen? - Danke!

MEHR INFO:

Ein Beispiel für die URL, die ich abzurufen versuche, ist: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US wobei die Zeichenfolge ICENX ein Symbol für einen Investmentfonds-Ticker ist , die ich zu einem von mehreren verschiedenen Tickersymbolen ändern werde. Dadurch wird eine Datentabelle heruntergeladen, wenn sie in einem Browser angezeigt wird. Die Datentabelle fehlt jedoch, wenn sie mit WGET abgerufen wird.

user239598
quelle
Um welche URL handelt es sich?
Braiam
2
Höchstwahrscheinlich wird der ursprüngliche HTML-Code mithilfe von AJAX-Techniken durch ein Javascript-Fragment ausgefüllt, das die Tabelle herunterlädt und auffüllt. In diesem Fall hätten Sie wahrscheinlich mehr Glück, wenn Sie den Aufruf dieses Skripts erhalten würden. Wie Braiam fragt, wenn Sie die URL angeben, können wir möglicherweise besser helfen, dies herauszufinden.
Roadmr
1
ad Weitere Informationen: Wenn Sie im Browser einen Quellcode anzeigen, wird nicht der ursprüngliche HTML-Code (derselbe wie der von wget) angezeigt, sondern der von Javascript / Ajax aktualisierte HTML-Code. Moderne Browser zeigen eine solche generierte Quelle anstelle von einfachem HTML an.
Vrata Blazek

Antworten:

39

Wie Roadmr bemerkte, wird die Tabelle auf dieser Seite durch Javascript erzeugt. wget unterstützt kein Javascript, es gibt nur die vom Server empfangene Seite aus (dh bevor ein Javascript-Code ausgeführt wird) und daher fehlt die Tabelle.

Sie benötigen einen Browser ohne Kopf , der Javascript wie Phantomjs unterstützt :

$ phantomjs save_page.js http://example.com > page.html

mit save_page.js:

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

Wenn Sie nur Text extrahieren möchten, ist es möglicherweise am einfachsten, die Seite mit w3m zu rendern:

$ w3m -dump page.html

und / oder ändern Sie das phantomjs-Skript, um nur das zu sichern, woran Sie interessiert sind.

Zitronenpresse
quelle
Dies funktioniert auch nicht, zum Beispiel cotrino.com/lifespan
mrgloom
JS generierte Links funktionieren damit nicht
QkiZ
1
2018: Das PhantomJS-Projekt wird bis auf weiteres ausgesetzt :(
1rq3fea324wre
Diese Lösung dient nur zum Herunterladen von Seiten von angegebenen URLs. Wie können Sie den Site-Crawling-Mechanismus von wget damit kombinieren? Und wie würde das Drehbuch mit kopflosem Chrom aussehen?
Phil
10

Sie können eine vollständige Website unter Verwendung von herunterladen wget --mirror

Beispiel:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL

Die obige Befehlszeile, die Sie ausführen möchten, wenn Sie eine vollständige Website herunterladen und für die lokale Anzeige verfügbar machen möchten.

Optionen:

  • --mirror Aktiviert Optionen, die zum Spiegeln geeignet sind.

  • -p Lädt alle Dateien herunter, die zum Anzeigen einer bestimmten HTML-Seite erforderlich sind.

  • --convert-links Konvertieren Sie nach dem Download die Links im Dokument für die lokale Anzeige.

  • -P ./LOCAL-DIR speichert alle Dateien und Verzeichnisse im angegebenen Verzeichnis.

Weitere Informationen zu Wget-Optionen finden Sie in diesem Artikel: Übersicht über alle wget-Befehle mit Beispielen oder in der Manpage von Wget .

GowriShankar
quelle
2
Dies funktioniert nicht mit Inhalten, die mit Javascript gerendert wurden. Dazu müssen Sie Phantombilder verwenden, die von lemonsqueeze beantwortet werden.
Mattias
1
Dieser Befehl durchsucht auch alle Unter-URLs, die Ressourcen herunterladen, die zum Rendern der angegebenen Webseite nicht benötigt werden.
1rq3fea324wre
3

--recursiveVerwenden Sie stattdessen , was einfach weitergeht und jeden einzelnen Link in Ihrer URL "spinnt" --page-requisites. Sollte sich genauso verhalten wie die Optionen, die Sie in grafischen Browsern beschreiben.

       This option causes Wget to download all the files that are
       necessary to properly display a given HTML page.  This includes
       such things as inlined images, sounds, and referenced stylesheets.

       Ordinarily, when downloading a single HTML page, any requisite
       documents that may be needed to display it properly are not
       downloaded.  Using -r together with -l can help, but since Wget
       does not ordinarily distinguish between external and inlined
       documents, one is generally left with "leaf documents" that are
       missing their requisites.

Weitere Informationen erhalten Sie, wenn Sie man wgetnach der --page-requisitesOption suchen (verwenden Sie "/", um beim Lesen einer Manpage zu suchen).

Roadmr
quelle
2

Wenn die Antwort des Servers abhängig von der fragenden Quelle unterschiedlich ist, liegt dies hauptsächlich an der HTTP_USER_AGENT-Variablen (nur eine Textzeichenfolge), die mit einer Anforderung von der fragenden Quelle bereitgestellt wird, die den Server über die Technologie informiert.


  1. Sie können Ihren Browser-Agenten hier überprüfen -> http://whatsmyuseragent.com

  2. Gemäß dem WGET-Handbuch sollte dieser Parameter die Arbeit erledigen --user-agent=AGENT.


Wenn dies nicht hilft, ist möglicherweise eine JavaScript-Verarbeitung erforderlich, um die gleiche Seite wie ein Browser abzurufen, oder eine entsprechende Anforderung mit GET-Parametern, damit der Server eine Antwort vorbereitet, für die kein JavaScript zum Ausfüllen der Seite erforderlich ist.

Esamo
quelle