2010-08-18 4 views
0

Je suis en train d'obtenir les « contacts » Ajouté sur this page:problème avec Curl Ajax aller chercher des données

Les données est injecté avec un appel Ajax, et j'ai utilisé Wireshark pour capturer l'appel que je pense obtient les données :

POST /dwr/call/plaincall/UserActionAPI.getRecentlyTitleChangedContacts.dwr HTTP/1.1

Ce poste un tas de variables et un cookie, et donc j'ai fait un appel boucle avec la chaîne suivante:

curl -b "cookiejar.txt" -v -e "http://www.jigsaw.com/showContactUpdateTab.xhtml?companyId=212324" \ 
    -F "type=text/plain&callCount=1&page=/showContactUpdateTab.xhtml?companyId=212324&httpSessionId=9CDBDA38B4F0C2A84622B523E79C0C38&scriptSessionId=784885169D0457ECDCA26FEF7B6DD7CF305&c0-scriptName=UserActionAPI&c0-methodName=getRecentlyAddedContacts&c0-id=0&c0-param0=number:212324&c0-param1=boolean:false&c0-param2=boolean:false&batchId=0" \ 
    "http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyAddedContacts.dwr" 

Mais il retourne toujours what looks like more JS script, même si je peux voir les données correctes retournées dans Wireshark. J'ai regardé ceci pendant un moment mais ne peux toujours pas trouver un moyen d'obtenir les données. Aidez-moi?

Répondre

3

Vous essayez de gratter une page html alimentée par Ajax en utilisant curl.

C'est ambitieux puisque la page d'origine atteint un certain état (obtenir une session du serveur, des cookies, etc.), puis faire un appel ajax.

Vous devrez exactement reproduire ce que fait la page.

Par exemple, l'appel est à la fois l'envoi des cookies avec l'identifiant de session et envoyer l'identifiant même session comme l'un de ses paramètres de poste. - Vous devez donc regarder la valeur du cookie entrant afin de créer correctement le paramètre Post sortant. Je ne sais pas comment tu ferais ça en utilisant juste une boucle.

Je suggère que vous pourriez avoir besoin d'utiliser Perl Mechanize ou un autre système de raclage plus performant pour ce site Web. Notez également que le serveur renvoie les données que vous souhaitez comme un fragment JS, pas comme JSON. Vous devrez donc analyser la réponse une fois que vous serez en mesure de convaincre le serveur de vous le donner.

Ajouté: Vous pouvez essayer l'onglet Net dans Firebug et Fiddler en plus de Wireshark lorsque vous voyez les différences entre la page d'origine et votre émulation.

Un projet digne ...

Ajouté en réponse au commentaire sur Perl Mechanize ne supportant pas Javascript:

Vous ne pas besoin de votre programme de grattage à faire Javascript. Vous avez besoin de votre programme pour émuler l'interaction de la page HTML avec le serveur. Si votre programme envoie exactement les mêmes bits au serveur que la vraie page html quand il s'exécute dans un navigateur, alors le serveur répondra avec les données que vous voulez.

Comme il ne répond pas avec les données, vous n'envoyez pas les mêmes bits.

Vous devriez commencer par émuler exactement le navigateur. Par exemple, envoyez les mêmes en-têtes dans vos requêtes, y compris l'user-agent, accept et les autres en-têtes. Le serveur pourrait inspecter ceux-ci.

+0

WWW :: Le paquet perl Mechanize ne supporte pas Javascript. Oui, je vais devoir analyser les données, ce n'est pas un problème. En regardant dans Firefox, la différence est que Firefox obtient les données et curl ne le fait pas.J'ai ouvert la page avec Chrome, puis changé l'agent utilisateur, les identifiants de session et copié les cookies pour faire l'appel Curl, même résultat. Il doit y avoir un module Perl pour le faire correctement? Je veux dire, tout ce que je veux faire, c'est exécuter Javascript, puis rafraîchir le DOM, n'est-ce pas? –

+0

J'ai ajouté à la réponse, voir ci-dessus. Puisque vous essayez de gratter le serveur, vous n'avez pas de dom sur votre client. Vous émulez un navigateur, votre logiciel n'est pas un navigateur. Ouvrir une session dans un navigateur et essayer de terminer la session en curl ne fonctionnera généralement pas car vous entrerez dans le serveur avec une connexion TCP différente - le serveur générera une nouvelle session pour vous. Votre client doit émuler toute la conversation avec le serveur. –

Questions connexes