faça o download apenas dos primeiros bytes de uma página de origem

9

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

Atualmente, tenho o comando abaixo funcionando, mas ele não parece ser eficaz em termos de tempo.

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

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

Estou olhando menos de um segundo para executar o comando acima.

EDITAR

Na página do manual cURL, vejo que " Você também deve estar ciente de que muitos servidores HTTP / 1.1 não têm esse recurso ativado. Assim, quando você tenta obter um intervalo, obtém o documento inteiro " . o servidor não suporta a consulta de intervalo, existe algum outro comando no nixambiente que me ajudará a realizar o que estou tentando fazer?

Ramesh
fonte

Respostas:

6

Você pode usar heade -salternar curlpara baixar uma parte de uma página. Basta dizer headquantas 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 -10to headretornará 10 linhas e depois parará. Se você quiser mais, altere-o para atender às suas necessidades.
  • A -sopção para curldiz para ficar em silêncio, para não exibir a barra de progresso durante o download.
slm
fonte
1
Ainda leva um tempo considerável para baixar o conteúdo. Eu estava esperando um intervalo de tempo em mili segundos para que isso acontecesse.
Ramsh
@ Jamesh - sim eu notei que era bastante lento também. Parece levar algum tempo para o servidor responder.
Slm
@Ramesh - em vez de ir no local usando curl que você pode querer dar uma olhada na API: developers.google.com/freebase
SLM
Hummm, interessante. Meu amigo estava sugerindo que, em Java, se ele usasse a API de base livre, ele precisaria de 300 MS para baixar os dados. Eu disse a ele que isso pode ser reduzido consideravelmente usando o shell script. Parece um problema com o servidor e não com os comandos do shell.
Ramesh
@Ramesh - Sim, a lentidão nesse caso está na consulta ao banco de dados e na preparação desses dados em uma resposta. Se o banco de dados expuser os dados em outros formatos, como JSON, você poderá acelerar a resposta utilizando isso em vez de usar a saída como HTTP. Existe uma sobrecarga na preparação da resposta como HTTP, que é um desperdício, se o caso de uso final não for humano, lendo os resultados.
Slm
1

Ainda não testei esse aplicativo em particular, mas algo me diz que você pode 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 uma configuração adicional para acertar os cabeçalhos das solicitações, mas se for um site público, você poderá conseguir uma saída útil se desejar o suficiente para tentar. Certamente, o dd terá apenas a quantidade de entrada que você especificar e sair, o que fará o SIGPIPE netcat, para que ele siga imediatamente o exemplo. O único truque real é passar o aperto de mão inicial - depois de iniciar o fluxo, você pode soltá-lo quando quiser.

EDITAR

A leitura dos comentários de slm me levou a apoiar essa moção; se você pode serializar um JSON POST no formato correto, esse é definitivamente o caminho a seguir para obter respostas mais oportunas. Analisar HTML é para os pássaros, de qualquer maneira.

Um truque útil para esse fim é capturar o fluxo da rede enquanto se comunica com o servidor no navegador e, quando o navegador envia o POST com o que você deseja, envie-o novamente como um GET e, em vez disso, analisa os resultados.

mikeserv
fonte
1

O headcomando normalmente interrompe o download antes de terminar (embora, para arquivos curtos, ele possa preencher o buffer do pipe antes que o pipe seja fechado). Isso ocorre porque quando um canal é fechado, curlnão há onde gravar (o descritor de arquivo é fechado, a gravação falha).

No entanto, na minha experiência, a coisa mais longa ao baixar está aguardando solicitações de DNS (doloroso 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 várias vezes com uma estrutura de diretório diferente, apenas resolva-o para um IP uma vez e faça uma substituição no URL.

Para provar meu argumento ... tente time netstatversus time netstat -n(sem cache, a diferença é dramática, com cache, é ruim apenas na primeira vez e depois se lembra).

orion
fonte