Recuperare pagina web parziale
-
20-09-2019 - |
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?
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
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.
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