Domanda

C'è un modo di limitare la quantità di dati CURL recupererà? Sono screen scraping dati fuori una pagina che è 50KB, tuttavia i dati ho bisogno è nella top 1/4 della pagina così ho davvero solo bisogno di recuperare la prima 10kb della pagina.

sto chiedendo perché c'è un sacco di dati Ho bisogno di controllare che si traduce in me il trasferimento vicino ai 60 GB di dati al mese, quando solo circa 5 GB di questa larghezza di banda è rilevante.

Sto usando PHP per elaborare i dati, però io sono flessibile nel mio approccio recupero dei dati, posso usare CURL, WGET, fopen etc.

Un approccio che sto considerando è

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

fa il sopra significa che io voglio solo il trasferimento 6kb da www.website.com, o la volontà fopen carico www.website.com in memoria significa sarò ancora trasferire la piena 50kb?

È stato utile?

Soluzione

Si può essere in grado di realizzare anche quello che stai cercando di utilizzare CURL pure.

Se si guarda la documentazione per CURLOPT_WRITEFUNCTION si può registrare un callback che viene chiamata ogni volta che i dati sono disponibili per la lettura da CURL. È quindi possibile contare i byte ricevuti, e quando hai ricevuto più di 6000 byte è possibile tornare 0 per interrompere il resto del trasferimento.

Il href="http://curl.netmirror.org/libcurl/c/curl_easy_setopt.html" rel="nofollow noreferrer"> libcurl documentazione

  

Questa funzione viene chiamata da libcurl non appena ci sono dati ricevuti che ha bisogno di essere   salvato. Restituisce il numero di byte   in realtà curato. Se tale importo   differisce da quello passato al   la funzione, sarà segnalare un errore al   biblioteca e si interrompe il trasferimento   e restituire CURLE_WRITE_ERROR.

     

verrà passato La funzione di callback   quanti più dati possibile in tutte le   invoca, ma non si può eventualmente fare   qualsiasi ipotesi. Può essere un byte,   può essere migliaia.

Altri suggerimenti

Questo è più di un HTTP che una domanda CURL in realtà.

Come avete indovinato, l'intera pagina sta per essere scaricato se si utilizza fopen. Non importa quindi se cercate all'offset 5000 o meno.

Il modo migliore per ottenere ciò che si desidera sarebbe quella di utilizzare una richiesta GET HTTP parziali, come affermato in HTML RFC ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html ):

  

La semantica del metodo GET cambiamento   ad una "GET parziale" se la richiesta   messaggio include un campo di intestazione Range.   A richieste GET parziali che solo una parte   dell'entità da trasferire, come   descritto nella sezione 14.35. Il   metodo GET parziale destinato a   ridurre l'utilizzo di rete non necessario per   permettendo entità parzialmente recuperati   da completare senza trasferire   i dati già in possesso del cliente.

I dettagli delle richieste GET parziali utilizzando Ranges è descritto qui: http://www.w3.org/Protocols/rfc2616/ RFC2616-sec14.html # sec14.35.2

HTTP richiesta GAMMA :

GET /largefile.html HTTP/1.1
Range: bytes=0-6000

se il server supporta le richieste di intervallo , verrà restituito un codice di risposta Content 206 parziale con un header Content-Range e la vostra gamma chiesto di byte (se non lo fa, si tornerà 200 e l'intero file). vedi http://benramsey.com/archives/206-partial- content-and-range-richieste / per una bella spiegazione di richieste di intervallo.

quando si utilizza PHP per inviare il file ? .

Si scarica l'intera pagina con la chiamata fopen, ma poi sarà solo lettura 6kb da questa pagina.

Dal manuale PHP:

  

Reading ferma non appena una delle seguenti condizioni:

     
      
  • lunghezza byte sono stati letti
  •   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top