scarica solo i primi byte di una pagina di origine


9

Sto scaricando la pagina di origine HTML di un sito Web utilizzando il cURLcomando. Il problema è che non desidero la maggior parte dei contenuti della pagina. Ho solo bisogno delle prime 100 righe della pagina di origine. C'è un modo per interrompere il download della pagina dopo le prime righe?

Attualmente, ho il seguente comando funzionante ma non sembra essere efficace in termini di tempo.

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

Ho provato a cambiare il valore da 1a .5ed .05e ancora l'intera pagina web è sempre scaricato.

Sto guardando il tempo meno di un secondo per eseguire il comando sopra.

MODIFICARE

Dalla pagina man di cURL, vedo che " Dovresti anche essere consapevole del fatto che molti server HTTP / 1.1 non hanno questa funzione abilitata, quindi quando tenti di ottenere un intervallo, otterrai invece l'intero documento. " Quindi se il server non supporta l'interrogazione dell'intervallo, c'è qualche altro comando nixnell'ambiente che mi aiuterà a realizzare ciò che sto cercando di fare?

Risposte:


6

È possibile utilizzare heade -spassare a curlper scaricare una parte di una pagina. Indica semplicemente headquante righe di output desideri.

Esempio

$ 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>

Dettagli

  • Il -10to headrestituirà 10 righe e poi si fermerà. Se volevi di più, cambialo in base alle tue esigenze.
  • Il -spassaggio a curldice che è silenzioso in modo che non visualizzi la barra di avanzamento durante il download.

1
Ci vuole ancora molto tempo per scaricare i contenuti. Mi aspettavo un intervallo di tempo in milli secondi perché ciò accadesse.
Ramesh,

@Ramesh - sì, ho notato che è stato anche piuttosto lento. Sembra richiedere del tempo prima che il server risponda.
slm

@Ramesh - piuttosto vai sul sito usando curl potresti dare un'occhiata all'API: developers.google.com/freebase
slm

Hmmm, interessante. Il mio amico stava suggerendo che in Java se avesse usato l'API freebase, gli sarebbero serviti 300 MS per scaricare i dati. Gli ho detto che può essere notevolmente ridotto usando lo script di shell. Sembra un problema con il server piuttosto che con i comandi della shell.
Ramesh,

@Ramesh - Sì, la lentezza in questo caso è nella query del database e nella preparazione di tali dati in una risposta. Se il database espone i dati in altri formati proprio come JSON, è possibile accelerare la risposta utilizzando quello invece di prendere l'output come HTTP. C'è un sovraccarico nel preparare la risposta come HTTP che è uno spreco se il caso finale non sarà un essere umano che legge i risultati.
slm

1

Non ho ancora testato questa particolare applicazione, ma qualcosa mi dice che potresti accoppiare dd e nc qui:

$ 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

Netcat ( nc) potrebbe richiedere un'ulteriore configurazione per ottenere le intestazioni delle richieste giuste, ma se si tratta di un sito pubblico dovresti essere in grado di finanziare un output utile se ti interessa abbastanza provare. Certamente dd prenderà solo tutto l'input che specifichi ed esci, il che farà sì che netcat segua immediatamente l'esempio. L'unico vero trucco è stirare la stretta di mano iniziale: una volta avviato il flusso puoi rilasciarlo quando vuoi.

MODIFICARE

La lettura dei commenti di slm mi ha spinto a ripetere quella mozione; se è possibile serializzare un POST JSON nel formato corretto, questa è sicuramente la strada da percorrere per una risposta più tempestiva. L'analisi HTML è comunque per gli uccelli.

Un trucco utile a tal fine è quello di catturare il flusso di rete durante la comunicazione con il server nel browser, quindi quando il browser invia il POST che ti ottiene ciò che desideri, invialo di nuovo come GET e dai un'occhiata ai risultati.


1

Il headcomando di solito interrompe il download prima che termini (anche se per file brevi può riempire il buffer della pipe prima della chiusura della pipe). Questo perché quando una pipe viene chiusa, curlnon ha un posto dove scrivere (il descrittore di file è chiuso, la scrittura fallisce).

Tuttavia, nella mia esperienza, la cosa più lunga durante il download è in attesa di richieste DNS (doloroso quando si scaricano in sequenza centinaia di file). Questo può essere aiutato con una cache DNS locale simile dnsmasqo, se si utilizza lo stesso nome di dominio più volte con una struttura di directory diversa, è sufficiente risolverlo in un IP una volta e sostituire l'URL.

Per dimostrare il mio punto ... prova time netstatcontro time netstat -n(senza cache la differenza è drammatica, con cache, fa male solo la prima volta, poi ricorda).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.