baixar somente os primeiros bytes de uma página de origem

8

Estou baixando a página de origem HTML de um site usando o comando cURL . O problema é que não quero a maior parte do conteúdo da página. Eu só preciso das primeiras 100 linhas da página de origem. Existe uma maneira de parar o download da página após as primeiras linhas?

Atualmente, tenho o comando abaixo funcionando, mas não parece ser efetivo no tempo.

curl -r[0-1] "http://www.freebase.com/m/045c7b" > foo.txt

Eu tentei alterar o valor de 1 para .5 e .05 e ainda assim toda a página da web está sendo baixada.

Eu estou olhando o tempo menos de um segundo para executar o comando acima.

EDITAR

A partir da página man de cURL , vejo que " Você também deve estar ciente de que muitos servidores HTTP / 1.1 não possuem esse recurso ativado, de modo que quando você tenta obter um intervalo, você em vez disso, obtenha o documento inteiro. "Então, se o servidor não está suportando o intervalo de consulta, existe algum outro comando em nix environment que me ajudará a realizar o que estou tentando fazer?

    
por Ramesh 03.03.2014 / 22:18

3 respostas

5

Você pode usar head e a -s alternar para curl para fazer o download de uma parte de uma página. Basta informar head quantas linhas de saída você deseja.

Exemplo

$ curl -r[0-1] "http://www.freebase.com/m/045c7b" -s 2>&1 | head -10
Warning: Invalid character is found in given range. A specified range MUST 
Warning: have only digits in 'start'-'stop'. The server's response to this 
Warning: request is uncertain.


  <!DOCTYPE html PUBLIC "null" "null">
  <html class="no-js" dir="ltr" lang="en">
    <head>
      <meta charset="utf-8">
      <title>

Detalhes

  • O -10 to head retornará 10 linhas e depois parará. Se você quisesse mais, altere-o para atender às suas necessidades.
  • A opção -s para curl diz para ficar em silêncio, por isso não exibirá a barra de progresso durante o download.
por 03.03.2014 / 22:41
1

Eu ainda não testei este aplicativo em particular ainda, mas algo me diz que você poderia emparelhar dd e nc aqui:

$ nc www.website.com 80 <<GOT | dd bs=$BYTE_COUNT iflag=fullblock \
     count=1 of=$OUTFILE
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
$(printf %b '\r\r')
GOT

O Netcat ( nc ) pode exigir configuração adicional para obter os cabeçalhos de solicitação corretos, mas se for um site público, você deverá conseguir uma saída útil se quiser. Certamente o dd irá receber apenas o máximo de entradas que você especificar e sair, o que fará com que o SIGPIPE netcat siga o mesmo caminho. O único truque real é resolver o aperto de mão inicial - depois de iniciar o fluxo, você pode soltá-lo sempre que quiser.

EDITAR

Ler os comentários de slm levou-me a secundar esse movimento; Se você puder serializar um JSON POST no formato correto, esse é definitivamente o caminho a seguir para uma resposta mais rápida. Analisar HTML é para os pássaros, de qualquer forma.

Um truque útil para esse fim é capturar seu fluxo de rede enquanto se comunica com o servidor em seu navegador e, em seguida, quando seu navegador envia o POST que obtém o que você deseja, envie-o novamente como GET e dê uma olhada no resultados.

    
por 04.03.2014 / 05:32
1

O comando head geralmente interrompe o download antes que ele termine (embora, para arquivos curtos, ele possa preencher o buffer de tubulação antes que o tubo seja fechado). Isso ocorre porque quando um canal é fechado, curl não tem onde escrever (o descritor de arquivo é fechado, a gravação falha).

No entanto, na minha experiência, a coisa mais demorada durante o download é esperar por solicitações DNS (dolorosas quando você está baixando centenas de arquivos sequencialmente). Isso pode ser ajudado com um cache DNS local como dnsmasq ou, se você estiver usando o mesmo nome de domínio muitas vezes com estrutura de diretórios diferente, basta resolvê-lo para um IP uma vez e substituir o URL.

Para provar meu ponto ... tente time netstat versus time netstat -n (sem cache a diferença é dramática, com cache, é ruim apenas na primeira vez, então lembra).

    
por 04.03.2014 / 10:48

Tags