descargar solo los primeros bytes de una página fuente

9

Estoy descargando la página fuente HTML de un sitio web usando el cURLcomando. El problema es que no quiero la mayoría de los contenidos en la página. Solo necesito las primeras 100 líneas de la página de origen. ¿Hay alguna manera de detener la descarga de la página después de las primeras líneas?

Actualmente, tengo el siguiente comando funcionando pero no parece ser efectivo en el tiempo.

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

He intentado cambiar el valor de 1a .5y .05y aún toda la página web se está descargando.

Estoy mirando a menos de un segundo para ejecutar el comando anterior.

EDITAR

Desde la página de manual de cURL, veo que " También debe tener en cuenta que muchos servidores HTTP / 1.1 no tienen esta característica habilitada, de modo que cuando intente obtener un rango, en su lugar obtendrá el documento completo " . el servidor no admite las consultas de rango, ¿hay algún otro comando en el nixentorno que me ayude a lograr lo que estoy tratando de hacer?

Ramesh
fuente

Respuestas:

6

Puede usar heady -scambiar a curlpara descargar una parte de una página. Simplemente diga headcuántas líneas de salida desea.

Ejemplo

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

Detalles

  • El -10to headdevolverá 10 líneas y luego se detendrá. Si quería más, cámbielo para adaptarlo a sus necesidades.
  • El -scambio a curlle dice que esté en silencio para que no muestre la barra de progreso durante la descarga.
slm
fuente
1
Todavía lleva un tiempo considerable descargar los contenidos. Esperaba un rango de tiempo en milisegundos para que esto suceda.
Ramesh
@Ramesh: sí, noté que también era bastante lento. Parece que el servidor tarda un tiempo en responder.
slm
@Ramesh: en lugar de ir al sitio usando curl, es posible que desee echar un vistazo a la API: developers.google.com/freebase
slm
Hmmm, interesante. Mi amigo estaba sugiriendo que en Java si usaba API de base libre, le tomaría 300 MS descargar los datos. Le dije que se puede reducir considerablemente usando el script de shell. Parece un problema con el servidor en lugar de los comandos de shell.
Ramesh
@Ramesh: sí, la lentitud en este caso está en la consulta de la base de datos y la preparación de esos datos en una respuesta. Si la base de datos expone los datos en otros formatos como JSON, puede acelerar la respuesta utilizándola en lugar de tomar la salida como HTTP. Hay una sobrecarga en la preparación de la respuesta como HTTP que es un desperdicio si el caso de uso final no va a ser humano leyendo los resultados.
slm
1

Realmente no he probado esta aplicación en particular todavía, pero algo me dice que puedes emparejar dd y nc aquí:

$ 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) puede requerir una configuración adicional para obtener los encabezados de solicitud correctos, pero si se trata de un sitio público, debería poder encontrar una salida útil si le interesa lo suficiente como para intentarlo. Ciertamente, dd tomará solo la cantidad de información que especifique y salga, lo que SIGPIPE netcat lo hará inmediatamente. El único truco real es resolver el apretón de manos inicial: una vez que inicie la transmisión, puede soltarla cuando lo desee.

EDITAR

Leer los comentarios de slm me ha llevado a apoyar esa moción; Si puede serializar un JSON POST en el formato correcto, ese es definitivamente el camino a seguir para obtener una respuesta más oportuna. Analizar HTML es para los pájaros, de todos modos.

Un truco útil para ese fin es capturar su flujo de red mientras se comunica con el servidor en su navegador, luego, cuando su navegador envía la POST que le brinda lo que desea, envíelo nuevamente como GET y eche un vistazo a los resultados.

mikeserv
fuente
1

El headcomando generalmente detendrá la descarga antes de que finalice (aunque para archivos cortos puede llenar el búfer de la tubería antes de que se cierre la tubería). Esto se debe a que cuando una tubería está cerrada, curlno tiene dónde escribir (el descriptor de archivo está cerrado, la escritura falla).

Sin embargo, en mi experiencia, lo más largo al descargar es esperar solicitudes de DNS (doloroso cuando descargas cientos de archivos secuencialmente). Esto se puede ayudar con un caché de DNS local como dnsmasq, o si está utilizando el mismo nombre de dominio muchas veces con una estructura de directorio diferente, simplemente resuélvalo a una IP una vez y reemplace la URL.

Para probar mi punto ... intente time netstatversus time netstat -n(sin caché la diferencia es dramática, con caché, solo es malo la primera vez, luego recuerda).

Orión
fuente