Como fazer o WGET baixar exatamente a mesma página da web em HTML do navegador

34

Usando um navegador da web (IE ou Chrome), posso salvar uma página da web (.html) com o Ctl-S, inspecioná-la com qualquer editor de texto e ver os dados em formato de tabela. Eu quero extrair um desses números, mas para muitas páginas da Web, muitas para fazer manualmente. Então, eu gostaria de usar o WGET para obter essas páginas da Web uma após a outra e escrever outro programa para analisar o arquivo .html e recuperar o número desejado. Mas o arquivo .html salvo pelo WGET ao usar o mesmo URL do navegador não contém a tabela de dados. Por que não? É como se o servidor detectar que a solicitação é proveniente do WGET e não de um navegador da Web, e forneça uma página da Web esquelética, sem a tabela de dados. Como posso obter exatamente a mesma página da Web com o WGET? - THX!

MAIS INFORMAÇÕES:

Um exemplo da URL que estou tentando buscar é: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US em que a cadeia ICENX é um símbolo de cotação de fundo mútuo , que mudarei para qualquer um de vários símbolos diferentes. Isso baixa uma tabela de dados quando visualizada em um navegador, mas a tabela de dados está ausente se buscada com WGET.

user239598
fonte
Qual URL é esse?
Braiam 27/01
2
Provavelmente, o HTML inicial é preenchido usando técnicas AJAX por um fragmento de javascript que baixa e preenche a tabela. Nesse caso, você provavelmente teria mais sorte em realizar a chamada para esse script. Como Braiam pede, se você fornecer o URL, poderemos ajudar mais a descobrir isso.
roadmr 27/01
11
ad Mais informações: no navegador, quando você exibe um código-fonte, não vê o HTML original (o mesmo obtido pelo wget), mas o HTML atualizado por javascript / ajax. Navegadores modernos mostram essa fonte gerada em vez do HTML simples.
Vrata Blazek

Respostas:

39

Como o roadmr observou, a tabela nesta página é gerada por javascript. O wget não suporta javascript, apenas despeja a página como recebida do servidor (ou seja, antes da execução de qualquer código javascript) e, portanto, a tabela está ausente.

Você precisa de um navegador sem cabeça que suporte javascript como phantomjs :

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

com save_page.js:

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

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

Então, se você deseja apenas extrair algum texto, pode ser mais fácil renderizar a página com o w3m:

$ w3m -dump page.html

e / ou modifique o script phantomjs para apenas despejar o que lhe interessa.

limões
fonte
Este também não funcionam, por exemplo cotrino.com/lifespan
mrgloom
JS gerado ligações vai trabalhar com isso
QkiZ
11
2018: O projeto PhantomJS é suspenso até novo aviso :(
1rq3fea324wre
Esta solução é apenas para baixar páginas de URLs especificados. Como você canaliza o mecanismo de rastreamento do site do wget com ele? Além disso, como seria o script com o chrome sem cabeça?
Phil
10

Você pode baixar um site completo usando wget --mirror

Exemplo:

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

A linha de comando acima que você deseja executar quando deseja baixar um site completo e disponibilizado para visualização local.

Opções:

  • --mirror ativa opções adequadas para espelhamento.

  • -p baixa todos os arquivos necessários para exibir corretamente uma determinada página HTML.

  • --convert-links após o download, converta os links no documento para visualização local.

  • -P ./LOCAL-DIR salva todos os arquivos e diretórios no diretório especificado.

Para obter mais informações sobre as opções do Wget, leia mais este artigo: Visão geral Sobre todos os comandos do wget com exemplos , ou consulte a página de manual do Wget .

GowriShankar
fonte
2
Isso não funcionará com conteúdo renderizado em javascript. Para isso, você precisará usar o phantomjs, conforme respondido por lemonsqueeze.
Mattias
11
Esse cmd também percorrerá todos os sub-URLs, que fará o download de recursos desnecessários para renderizar a página da web especificada.
1rq3fea324wre
3

Em vez de --recursive, que apenas seguirá em frente e "aranha" todos os links em seu URL, use --page-requisites. Deve se comportar exatamente como as opções descritas nos navegadores gráficos.

       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.

Para obter mais informações, faça man wgete procure a --page-requisitesopção (use "/" para pesquisar enquanto lê uma página de manual).

roadmr
fonte
2

Se a resposta do servidor diferir dependendo da fonte solicitante, é principalmente devido à variável HTTP_USER_AGENT (apenas uma sequência de texto) que é fornecida com uma solicitação da fonte solicitante, informando o servidor sobre a tecnologia.


  1. Você pode verificar o seu agente do navegador aqui -> http://whatsmyuseragent.com

  2. De acordo com o manual do WGET, este parâmetro deve fazer o trabalho --user-agent=AGENT.


Se isso não ajudar, ou seja, o processamento de JavaScript pode ser necessário para obter a mesma página que um navegador, ou talvez uma solicitação apropriada com parâmetros GET, para que o servidor prepare uma resposta que não exija JavaScript para preencher a página.

Esamo
fonte