Jak zmusić WGET do pobrania dokładnie tej samej strony HTML co przeglądarka

34

Za pomocą przeglądarki internetowej (IE lub Chrome) mogę zapisać stronę internetową (.html) za pomocą Ctl-S, sprawdzić ją w dowolnym edytorze tekstu i zobaczyć dane w formacie tabeli. Jedna z tych liczb, które chcę wyodrębnić, ale dla wielu, wielu stron internetowych, zbyt wiele do zrobienia ręcznie. Więc chciałbym użyć WGET, aby pobierać te strony jedna po drugiej, i napisać inny program do parsowania pliku .html i pobrania żądanej liczby. Ale plik .html zapisany przez WGET przy użyciu tego samego adresu URL co przeglądarka nie zawiera tabeli danych. Dlaczego nie? To tak, jakby serwer wykrył, że żądanie pochodzi od WGET, a nie z przeglądarki internetowej, i dostarcza szkieletową stronę internetową bez tabeli danych. Jak mogę uzyskać dokładnie tę samą stronę internetową za pomocą WGET? - Dzięki!

WIĘCEJ INFORMACJI:

Przykład adresu URL, który próbuję pobrać, to: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US, gdzie ciąg ICENX jest symbolem giełdowym funduszu inwestycyjnego , które zmienię na dowolny z wielu różnych symboli giełdowych. Spowoduje to pobranie tabeli danych podczas przeglądania w przeglądarce, ale tabeli danych brakuje, jeśli jest pobierana za pomocą WGET.

użytkownik239598
źródło
Który to jest adres URL?
Braiam
2
Najprawdopodobniej początkowy kod HTML jest wypełniany przy użyciu technik AJAX fragmentem javascript, który pobiera i wypełnia tabelę. W takim przypadku zapewne lepiej będzie, jeśli zadzwonisz do tego skryptu. Tak jak pyta Braiam, jeśli podasz adres URL, możemy być w stanie lepiej to zrozumieć.
roadmr
1
ad Więcej informacji: W przeglądarce, gdy wyświetlasz kod źródłowy, nie widzisz oryginalnego kodu HTML (takiego samego jak otrzymany przez wget), ale HTML zaktualizowany przez javascript / ajax. Nowoczesne przeglądarki pokazują tak wygenerowane źródło zamiast zwykłego HTML.
Vrata Błażek

Odpowiedzi:

39

Tak jak zauważył roadmr , tabela na tej stronie jest generowana przez javascript. wget nie obsługuje javascript, po prostu zrzuca stronę otrzymaną z serwera (tj. przed uruchomieniem jakiegokolwiek kodu javascript), więc brakuje tabeli.

Potrzebujesz przeglądarki bezgłowej, która obsługuje javascript jak phantomjs :

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

za pomocą save_page.js:

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

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

Następnie, jeśli chcesz tylko wyodrębnić trochę tekstu, najłatwiej może być renderowanie strony za pomocą w3m:

$ w3m -dump page.html

i / lub zmodyfikuj skrypt phantomjs, aby po prostu zrzucić to, co Cię interesuje.

lemonsqueeze
źródło
To również nie działa, na przykład cotrino.com/lifespan
mrgloom
Linki wygenerowane przez JS nie będą z tym współpracować
QkiZ
1
2018: Projekt PhantomJS został zawieszony do odwołania :(
1rq3fea324wre
To rozwiązanie służy tylko do pobierania stron z określonych adresów URL. W jaki sposób włączasz w nim mechanizm indeksowania witryny wget? A jak wyglądałby skrypt z bezgłowym chromem?
Phil
10

Możesz pobrać pełną witrynę za pomocą wget --mirror

Przykład:

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

Powyższy wiersz poleceń, który chcesz wykonać, gdy chcesz pobrać pełną stronę internetową i udostępnić do lokalnego przeglądania.

Opcje:

  • --mirror włącza opcje odpowiednie dla kopii lustrzanej.

  • -p pobiera wszystkie pliki niezbędne do prawidłowego wyświetlenia danej strony HTML.

  • --convert-links po pobraniu przekonwertuj łącza w dokumencie do lokalnego przeglądania.

  • -P ./LOCAL-DIR zapisuje wszystkie pliki i katalogi w określonym katalogu.

Więcej informacji o opcjach Wget Przeczytaj więcej w tym artykule: Omówienie wszystkich poleceń Wget z przykładami lub sprawdź stronę podręcznika Wget .

GowriShankar
źródło
2
To nie będzie działać z treściami renderowanymi w javascript. W tym celu musisz użyć phantomjs, na które odpowiedział lemonsqueeze.
Mattias
1
To cmd przejdzie również przez wszystkie pod-adresy URL, które pobiorą zasoby, które nie są potrzebne do renderowania danej strony internetowej.
1rq3fea324wre
3

Zamiast tego --recursive, co będzie po prostu „pająk”, użyj każdego linku w twoim adresie URL --page-requisites. Powinien zachowywać się dokładnie tak, jak opcje opisane w przeglądarkach graficznych.

       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.

Aby uzyskać więcej informacji, zrób man wgeti poszukaj --page-requisitesopcji (użyj „/”, aby wyszukać podczas czytania strony podręcznika ).

roadmr
źródło
2

Jeśli odpowiedź serwera różni się w zależności od źródła pytającego, dzieje się tak głównie ze względu na zmienną HTTP_USER_AGENT (tylko ciąg tekstowy), która jest dostarczana z żądaniem ze źródła pytającego, informującego serwer o technologii.


  1. Możesz sprawdzić swojego agenta przeglądarki tutaj -> http://whatsmyuseragent.com

  2. Zgodnie z instrukcją WGET ten parametr powinien wykonać zadanie --user-agent=AGENT.


Jeśli to nie pomoże, tj. Przetwarzanie JavaScript może być konieczne, aby uzyskać tę samą stronę co przeglądarka, lub może odpowiednie żądanie z parametrami GET, aby serwer przygotował odpowiedź, która nie wymaga JavaScript do wypełnienia strony.

Esamo
źródło