2010-06-16 5 views
1

J'essaie actuellement de me faire une idée sur pycurl. J'essaie de me connecter à un site Web. Après la connexion au site, il devrait rediriger vers la page principale. Cependant, lorsque vous essayez ce script, il est simplement renvoyé à la page de connexion. Que pourrais-je faire de mal?script pycurl ne peut pas se connecter au site Web

import pycurl 
import urllib 
import StringIO 

pf = {'username' : 'user', 'password' : 'pass' } 
fields = urllib.urlencode(pf) 
pageContents = StringIO.StringIO() 

p = pycurl.Curl() 
p.setopt(pycurl.FOLLOWLOCATION, 1) 
p.setopt(pycurl.COOKIEFILE, './cookie_test.txt') 
p.setopt(pycurl.COOKIEJAR, './cookie_test.txt') 
p.setopt(pycurl.POST, 1) 
p.setopt(pycurl.POSTFIELDS, fields) 
p.setopt(pycurl.WRITEFUNCTION, pageContents.write) 
p.setopt(pycurl.URL, 'http://localhost') 
p.perform() 

pageContents.seek(0) 
print pageContents.readlines() 

EDIT: Comme l'a souligné Pierre l'URL doit pointer vers une URL de connexion, mais le site que je suis en train d'obtenir ce à travailler pour ne me montrer l'URL que ce serait. Comme l'action du formulaire pointe juste vers la page d'accueil (/index.html)

+0

Ne doit pas être l'URL à l'URL de formulaire qui accepte la connexion? Ce n'est généralement pas l'URL "/" de la page d'accueil, mais quelque chose comme "login.cgi" ou "login.php" ou tout autre fichier d'application qui traite le formulaire de connexion. –

+0

Vous avez raison. Je suis retourné et vérifié pour cela et il semble fonctionner pour une page de test que je courais mais n'a pas pour celui que j'essaye de vraiment le faire fonctionner. Le formulaire d'action de la page non-test pointe vers l'URL de la page d'accueil, donc je ne suis pas sûr de ce que je dois faire. –

+0

Plus que probablement, la page sur laquelle vous vous connectez utilise JavaScript pour publier une URL autre que le fichier 'index.html'. Vous devrez peut-être regarder à travers le Javascript pour voir où publier les valeurs. –

Répondre

3

Comme vous dépannez ce problème, je suggère d'obtenir un plugin de navigateur comme FireBug ou LiveHTTPHeaders (je suggère des plugins Firefox, mais il existe des plugins similaires pour d'autres navigateurs aussi bien). Vous pouvez ensuite envoyer une demande au site et voir quelles actions (URL), méthode et paramètres de formulaire sont transmis au serveur cible. Cela aidera probablement à élucider le nœud du problème.

Si cela ne vous aide pas, vous pouvez envisager d'utiliser un outil différent pour votre mécanisation. J'ai utilisé ClientForm et BeautifulSoup pour effectuer des opérations similaires. D'après ce que j'ai lu dans les documents pycURL et votre code ci-dessus, ClientForm pourrait être un meilleur outil à utiliser. ClientForm analysera votre page HTML, localisera les formulaires (y compris les formulaires de connexion) et construira la demande appropriée en fonction des réponses que vous fournirez au formulaire. Vous pouvez même utiliser ClientForm avec pycURL ... mais au moins ClientForm vous fournira l'action appropriée pour POST, et construira tous les paramètres appropriés. Cependant, sachez que si JavaScript gère une partie du formulaire de connexion, même ClientForm ne peut pas vous y aider. Vous aurez besoin de quelque chose qui interprète le JavaScript pour automatiser efficacement la connexion. Dans ce cas, j'ai utilisé SeleniumRC pour contrôler un navigateur (et j'ai laissé le navigateur gérer le JavaScript).

+0

Est-ce que BeautifulSoup ne gère pas seulement le scrappage d'écran?Je ne pensais pas que cela permettait de mettre en forme des informations et de publier des données. –

+0

Vous avez raison - j'ai utilisé conjointement ClientForm et BeautifulSoup. ClientForm gérait le formulaire et les opérations HTTP, tandis que BeautifulSoup traitait l'analyse HTML, ce qui était particulièrement utile après la gestion de l'authentification. –

+0

Eh bien, je ne pouvais toujours pas obtenir le pycurl pour travailler sur le site que je voulais (je l'ai obtenu pour un autre site de test mais bizarre) mais j'ai aimé vos suggestions, donc je vais vous donner le crédit pour la réponse. Merci! –

2

L'une des règles d'or, vous devez « freiner la glace », ont permis le débogage lorsque vous essayez de résoudre par exemple pycurl:

Note: ne pas oublier d'utiliser p.close() après p.perform()


def test(debug_type, debug_msg): 
    if len(debug_msg) < 300: 
     print "debug(%d): %s" % (debug_type, debug_msg.strip()) 

p.setopt(pycurl.VERBOSE, True) 
p.setopt(pycurl.DEBUGFUNCTION, test) 

Maintenant, vous pouvez voir comment votre code respire, parce que vous avez le débogage activé

import pycurl 
import urllib 
import StringIO 

def test(debug_type, debug_msg): 
    if len(debug_msg) < 300: 
     print "debug(%d): %s" % (debug_type, debug_msg.strip())  

pf = {'username' : 'user', 'password' : 'pass' } 
fields = urllib.urlencode(pf) 
pageContents = StringIO.StringIO() 

p = pycurl.Curl() 
p.setopt(pycurl.FOLLOWLOCATION, 1) 
p.setopt(pycurl.COOKIEFILE, './cookie_test.txt') 
p.setopt(pycurl.COOKIEJAR, './cookie_test.txt') 
p.setopt(pycurl.POST, 1) 
p.setopt(pycurl.POSTFIELDS, fields) 
p.setopt(pycurl.WRITEFUNCTION, pageContents.write) 
p.setopt(pycurl.VERBOSE, True) 
p.setopt(pycurl.DEBUGFUNCTION, test) 
p.setopt(pycurl.URL, 'http://localhost') 
p.perform() 

p.close() # This is mandatory. 

pageContents.seek(0) 
print pageContents.readlines() 
+0

Beau travail, grand effort, +1 pour vous :) – sohom

Questions connexes