Pregunta

¿Hay alguna manera de limitar la cantidad de datos CURL buscará? Estoy datos de pantalla raspado de una página que es de 50 kb, sin embargo los datos que necesito está en el cuarto superior de la página, así que realmente sólo tiene que recuperar la primera 10kb de la página.

Lo digo porque hay una gran cantidad de datos que necesito para controlar lo que se traduce en mí la transferencia de cerca de 60 GB de datos por mes, cuando sólo alrededor de 5 GB de este ancho de banda es relevante.

Estoy utilizando PHP para procesar los datos, sin embargo soy flexible en mi enfoque de recuperación de datos, puedo usar CURL, WGET, fopen, etc.

Uno de los enfoques que estoy considerando es

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

¿El anterior significa solamente voy a transferir 6 kb de www.website.com, o va a fopen carga www.website.com en la memoria lo que significa todavía voy a transferir la 50kb completo?

¿Fue útil?

Solución

Es posible que pueda llevar a cabo también lo que está buscando usando CURL también.

Si nos fijamos en la documentación de CURLOPT_WRITEFUNCTION que puede registrar una devolución de llamada que se llama siempre que los datos están disponibles para la lectura de rizo. A continuación, podría contar los bytes recibidos, y cuando usted ha recibido más de 6.000 bytes puede devolver 0 para abortar el resto de la transferencia.

El libcurl documentación describe la devolución de llamada un poco más:

  

Esta función se llama por libcurl tan pronto como haya recibido los datos que necesita ser   salvado. Devuelve el número de bytes   En realidad cuidado. Si esa cantidad   difiere de la cantidad aprobada para su   función, que va a señalar un error al   biblioteca y se abortará la transferencia   y CURLE_WRITE_ERROR volver.

     

se pasará La función de devolución de llamada   como tantos datos como sea posible en todas las   invoca, pero no se puede hacer posiblemente   ninguna hipótesis. Puede ser un byte,   puede ser miles.

Otros consejos

Esto es más un HTTP que una cuestión de hecho CURL.

Como has adivinado, toda la página va a ser descargado si utiliza fopen. No importa entonces si usted busca en el offset 5000 o no.

La mejor manera de lograr lo que desea sería el uso de una petición HTTP GET parcial, como se indica en el RFC HTML ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html ):

  

La semántica del cambio de método GET   a un "GET parcial" si la solicitud   mensaje incluye un campo de cabecera rango.   A las solicitudes GET parciales que sólo una parte   de la entidad ser transferido, como   describe en la sección 14.35. los   método GET parcial se pretende   reducir el uso innecesario de la red por   permitiendo entidades recuperados parcialmente   para ser completado sin transferir   los datos ya obtenidos por el cliente.

Los detalles de peticiones GET parciales utilizando rangos se describen a continuación: http://www.w3.org/Protocols/rfc2616/ RFC2616-sec14.html # sec14.35.2

HTTP GAMA solicitud :

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

si el servidor soporta peticiones de rango , devolverá un código de respuesta 206 contenido parcial con una cabecera Content-range y su rango solicitado de bytes (si no lo hace, devolverá 200 y todo el archivo). ver http://benramsey.com/archives/206-partial- contenido-y-range-peticiones / para una buena explicación de las solicitudes de intervalo.

Cuando se usa PHP para enviar el archivo ? .

Se descargará toda la página con la llamada fopen, pero entonces sólo leerá 6 kb de esa página.

Desde el manual de PHP:

  

Lectura detiene tan pronto como una de las siguientes condiciones se cumple:

     
      
  • longitud bytes han sido leídos
  •   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top