Jak zdobyć WGET, aby pobrać dokładnie tę samą stronę HTML, co przeglądarka

23

Korzystając z przeglądarki internetowej (IE lub Chrome) mogę zapisać stronę internetową (.html) za pomocą Ctl-S, obejrzeć ją za pomocą dowolnego edytora tekstu i wyświetlić dane w formacie tabeli. Jedna z tych liczb, którą chcę wyodrębnić, ale dla wielu, wielu stron, zbyt wiele do zrobienia ręcznie. Chciałbym użyć WGET, aby uzyskać te strony jeden po drugim i napisać inny program do parsowania .html i pobrać żądany numer. 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 z WGET, a nie z przeglądarki internetowej i dostarcza szkieletową stronę internetową, bez tabeli danych. Jak mogę uzyskać tę samą stronę internetową z WGET? - Thx!

WIĘCEJ INFORMACJI:

Przykład adresu URL, który próbuję pobrać, to: link gdzie ciąg ICENX jest symbolem giełdowego funduszu inwestycyjnego, który zmieni się na dowolny z wielu różnych symboli ticker. Spowoduje to pobranie tabeli danych podczas przeglądania w przeglądarce, ale brakuje tabeli danych, jeśli została pobrana z WGET.

    
zadawane user239598 27.01.2014, 15:38
źródło

5 odpowiedzi

31

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

Potrzebujesz bezgłowej przeglądarki obsługującej javascript, takiej jak phantomjs :

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

z save_page.js:

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

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

Jeśli chcesz wyodrębnić jakiś tekst, najprościej jest wyrenderować stronę za pomocą w3m:

$ w3m -dump page.html

i / lub zmodyfikuj skrypt phantomjs tak, aby po prostu zrzucił to, co cię interesuje.

    
odpowiedział lemonsqueeze 08.11.2014, 12:04
źródło
7

Możesz pobrać pełną witrynę przy użyciu wget --mirror

Przykład:

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

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

Opcje:

  • --mirror włącza opcje odpowiednie do tworzenia kopii lustrzanych.

  • -p pobiera wszystkie pliki, które są niezbędne do poprawnego wyświetlenia danej strony HTML.

  • --convert-links po pobraniu, przekonwertuj linki w dokumencie do lokalnego przeglądania.

  • -P ./LOCAL-DIR zapisuje wszystkie pliki i katalogi do podanego katalogu.

Więcej informacji na temat opcji Wget Przeczytaj więcej w tym artykule: Przegląd O wszystkich poleceniach wget za pomocą przykładów lub sprawdź strona podręcznika Wget .

    
odpowiedział GowriShankar 18.08.2014, 14:24
źródło
2

Zamiast --recursive , które po prostu pójdą dalej i "spider" każdy pojedynczy link w twoim URL, użyj --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, wykonaj man wget i szukaj opcji --page-requisites (użyj "/" do wyszukiwania podczas czytania strony podręcznika).

    
odpowiedział roadmr 27.01.2014, 16:53
źródło
1

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

  1. Tutaj możesz sprawdzić swojego agenta przeglądarki - > link

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

Jeśli to nie pomoże, może być konieczne przetworzenie JavaScriptu, 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.

    
odpowiedział Esamo 27.01.2014, 16:01
źródło
0

Jest parametr --recursive . Będzie pobierać wszystko, czasem więcej, niż chcesz.

wget --recursive http://url.com
    
odpowiedział Braiam 27.01.2014, 15:46
źródło

Przeczytaj inne pytania na temat tagów