Recuperar página Web parcial
-
20-09-2019 - |
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?
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
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.
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