télécharger uniquement les premiers octets d'une page source


9

Je télécharge la page source HTML d'un site Web à l'aide de la cURLcommande. Le problème est que je ne veux pas la plupart du contenu de la page. J'ai juste besoin des 100 premières lignes de la page source. Existe-t-il un moyen d'arrêter le téléchargement de la page après les premières lignes?

Actuellement, j'ai la commande ci-dessous qui fonctionne mais elle ne semble pas être efficace en temps.

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

J'ai essayé de changer la valeur de 1la .5et .05et encore la page Web entière est obtenir téléchargé.

Je regarde le temps moins d'une seconde pour exécuter la commande ci-dessus.

ÉDITER

À partir de la page de manuel de cURL, je vois que " Vous devez également savoir que de nombreux serveurs HTTP / 1.1 n'ont pas cette fonctionnalité activée, de sorte que lorsque vous essayez d'obtenir une plage, vous obtiendrez à la place le document entier. " Donc, si le serveur ne prend pas en charge l'interrogation de plage, existe-t-il une autre commande dans l' nixenvironnement qui m'aidera à accomplir ce que j'essaie de faire?

Réponses:


6

Vous pouvez utiliser headet le -scommutateur curlpour télécharger une partie d'une page. Dites simplement headcombien de lignes de sortie vous souhaitez.

Exemple

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

Détails

  • Le -10to headrenverra 10 lignes puis s'arrêtera. Si vous en voulez plus, changez-le en fonction de vos besoins.
  • Le -sbasculement vers lui curlindique de se taire pour ne pas afficher la barre de progression lors du téléchargement.

1
Le téléchargement du contenu prend encore beaucoup de temps. Je m'attendais à une plage de temps en milli secondes pour que cela se produise.
Ramesh

@Ramesh - oui j'ai remarqué que c'était aussi assez lent. Semble prendre un certain temps pour que le serveur réponde.
slm

@Ramesh - plutôt que d'aller sur le site en utilisant curl, vous voudrez peut-être jeter un œil à l'API: developers.google.com/freebase
slm

Hmmm, intéressant. Mon ami suggérait qu'à Java, s'il utilisait l'API freebase, il lui fallait 300 MS pour télécharger les données. Je lui ai dit que cela pouvait être considérablement réduit en utilisant un script shell. Cela semble être un problème avec le serveur plutôt qu'avec les commandes shell.
Ramesh

@Ramesh - Oui, la lenteur dans ce cas est dans la requête de base de données et la préparation de ces données dans une réponse. Si la base de données expose les données dans d'autres formats au format JSON, vous pouvez accélérer la réponse en l'utilisant au lieu de prendre la sortie en HTTP. Il y a des frais généraux dans la préparation de la réponse en tant que HTTP, ce qui est un gaspillage si la fin d'utilisation ne sera pas un humain lisant les résultats.
slm

1

Je n'ai pas encore vraiment testé cette application particulière, mais quelque chose me dit que vous pouvez associer dd et nc ici:

$ 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) peut nécessiter une configuration supplémentaire pour obtenir les bons en-têtes de demande, mais s'il s'agit d'un site public, vous devriez pouvoir finagler une sortie utile si vous vous souciez suffisamment d'essayer. Certes, dd n'acceptera que la quantité que vous spécifiez et quittera, ce qui fera SIGPIPE netcat pour qu'il suive immédiatement. La seule véritable astuce consiste à aplanir la poignée de main initiale - une fois que vous démarrez le flux, vous pouvez le supprimer à tout moment.

ÉDITER

La lecture des commentaires de slm m'a incité à appuyer cette motion; si vous pouvez sérialiser un JSON POST au format correct, c'est certainement la voie à suivre pour une réponse plus rapide. L'analyse HTML est pour les oiseaux de toute façon.

Une astuce utile à cette fin consiste à capturer votre flux réseau tout en communiquant avec le serveur dans votre navigateur, puis lorsque votre navigateur envoie le POST qui vous donne ce que vous voulez, envoyez-le à nouveau à la place en tant que GET et regardez les résultats.


1

La headcommande arrête généralement le téléchargement avant la fin (bien que pour les fichiers courts, elle puisse remplir le tampon du tube avant la fermeture du tube). En effet, lorsqu'un canal est fermé, curln'a nulle part où écrire (le descripteur de fichier est fermé, l'écriture échoue).

Cependant, selon mon expérience, la chose la plus longue lors du téléchargement est en attente de requêtes DNS (douloureuse lorsque vous téléchargez des centaines de fichiers séquentiellement). Cela peut être aidé avec un cache DNS local comme dnsmasqou, si vous utilisez plusieurs fois le même nom de domaine avec une structure de répertoire différente, résolvez-le une fois sur IP et effectuez un remplacement sur l'URL.

Pour prouver mon point ... essayez time netstatversus time netstat -n(sans cache la différence est dramatique, avec cache, c'est seulement mauvais la première fois, alors ça se souvient).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.