2009-09-03 9 views
0

L'URL http://www.fourmilab.ch/cgi-bin/Earth montre une carte en direct de la Terre.Comment puis-je obtenir par programme l'image sur cette page?

Si je publie cette URL dans mon navigateur (FF), l'image s'affiche très bien. Mais quand j'essaye de 'wget' pour aller chercher la même page, j'échoue!

Voici ce que j'ai essayé d'abord:

wget -p http://www.fourmilab.ch/cgi-bin/Earth 

pensée, que probablement tous les autres champs de formulaire sont nécessaires aussi, je l'ai fait une « Afficher la source » sur la page ci-dessus, noté les différentes valeurs de champ, puis a publié l'URL suivant:

wget --post-data "opt=-p&lat=7°27'&lon=50°49'&ns=North&ew=East&alt=150889769&img=learth.evif&date=1&imgsize=320&daynight=-d" http://www.fourmilab.ch/cgi-bin/Earth 

Toujours pas d'image! Quelqu'un peut-il me dire ce qui se passe ici ...?

Y a-t-il des «getchas» avec des gadgets basés sur CGI et/ou sur formulaire-POST? Où (ressource en ligne ou en ligne) ces concepts seraient-ils expliqués?

+1

Il me semble que la source de l'image est quelque chose comme http://www.fourmilab.ch/cgi-bin/Earth?di=154E28F95D71B37CD7215CBD4AC02097A04D68525B48181BD029 et non ce que vous mentionnez. –

+0

L'image source/l'URL change à chaque actualisation de page à partir du navigateur. Il semble que tout ceci se fasse en 2 étapes: une nouvelle image et un nouveau chemin d'image sont générés de manière dynamique, puis cette image est envoyée au client. Et je ne sais pas comment gérer ça! – Harry

Répondre

2

Si vous inspectez le code source de la page, il y a un lien avec img inside, qui contient l'image de la terre. Par exemple:

 
<img 
src="/cgi-bin/Earth?di=570C6ABB1F33F13E95631EFF088262D5E20F2A10190A5A599229" 
ismap="ismap" usemap="#zoommap" width="320" height="320" border="0" alt="" /> 

Sans donner le paramètre « di », vous demandez juste pour la page Web entière, avec des références à cette image, non pas pour l'image elle-même.

Edit: paramètre « Di » code qui « une partie » de la terre que vous voulez recevoir, de toute façon, essayez par exemple

 
wget http://www.fourmilab.ch/cgi-bin/Earth?di=F5AEC312B69A58973CCAB756A12BCB7C47A9BE99E3DDC5F63DF746B66C122E4E4B28ADC1EFADCC43752B45ABE2585A62E6FB304ACB6354E2796D9D3CEF7A1044FA32907855BA5C8F 

+0

Oui, j'ai vu ça aussi. Mais, comme je l'ai dit dans mon commentaire à la réponse de Brad, cette valeur change presque à chaque rafraîchissement de page. Donc, la question est: comment puis-je trouver l'URL de l'image avant de pouvoir le faire? – Harry

+0

et vous obtenez un fichier avec un nom long 'Earth \? Di \ = F5AEC ...' qui est un jpeg. Très intelligent! – pavium

+0

@sdéveloppeur: Di change uniquement lorsque vous changez les coordonnées polaires auxquelles vous voulez obtenir l'image. Si vous voulez obtenir des coordonnées spécifiques, vous devez analyser le résultat de la première page, ce que vous avez réellement fait 2 réponses ci-dessous. @pavium: Les noms de fichiers peuvent être modifiés, la plupart des programmes peuvent diffuser des données vers stdout, et à partir de cela - il peut être redirigé vers n'importe quel fichier ou périphérique, donc ce n'est pas un problème. –

1

Utiliser GET au lieu de POST. Ils sont complètement différents pour le programme CGI en arrière-plan.

0

Ce que vous téléchargez est la page HTML entière et non l'image. Pour télécharger l'image et d'autres éléments aussi, vous devrez utiliser le (s) paramètre (s) --page-requisites (et éventuellement --convert-links). Malheureusement, parce que robots.txt interdit l'accès aux URL sous /cgi-bin/, wget ne téléchargera pas l'image qui se trouve sous /cgi-bin/. Je pense qu'il n'y a pas de paramètre pour désactiver le protocole des robots.

1

Faisant suite à Ravadre,

wget -p http://www.fourmilab.ch/cgi-bin/Earth 

télécharge un fichier XHTML qui contient une balise img < >.

J'ai édité le XHTML pour enlever tout sauf la balise img et l'ai transformé en un script bash contenant une autre commande wget -p, échappant au? et =

Quand j'exécuté ce que j'obtenu un fichier 14kb que je renomme earth.jpg

Pas vraiment programmatique, la façon dont je l'ai fait, mais je pense que cela pourrait se faire.

Mais comme @somedeveloper l'a dit, la valeur di change (puisqu'elle dépend du temps).

+0

Merci, je vais conclure dans un script. – Harry

0

Les gars, voici ce que j'ai finalement fait. Pas tout à fait satisfait de cette solution, car j'étais (et j'espère toujours) un meilleur moyen ... celui qui obtient l'image sur le premier wget lui-même ... en me donnant la même expérience utilisateur que lorsque je navigue sur firefox.

#!/bin/bash 

tmpf=/tmp/delme.jpeg 
base=http://www.fourmilab.ch 
liveurl=$(wget -O - $base/cgi-bin/Earth?opt=-p 2>/dev/null | perl -0777 -nle 'if([email protected]<img \s+ src \s* = \s* "(/cgi-bin/Earth\?di= .*?)" @gsix) { print "$1\n" }') 
wget -O $tmpf $base/$liveurl &>/dev/null 
Questions connexes