2009-09-08 7 views
2

J'ai du code qui utilise mechanize et un site protégé par mot de passe. Je peux me connecter très bien et obtenir les résultats que j'attends. Cependant, une fois que je me connecte, je ne veux pas cliquer sur les liens que je veux parcourir dans une liste d'URL. Malheureusement, chaque appel .open() reçoit simplement une redirection vers la page de connexion, ce qui est le comportement auquel je m'attendrais si je m'étais déconnecté ou essayé de me connecter avec un navigateur différent. Cela m'amène à croire qu'il s'agit d'une sorte de manipulation des cookies, mais je suis à court d'idées.python et mechanize.open()

def main(): 
    browser = mechanize.Browser() 
    browser.set_handle_robots(False) 
    # The below code works perfectly 
    page_stats = login_to_BOE(browser) 
    print page_stats 

    # This code ALWAYS gets the login page again NOT the desired 
    # behaviour of getting the new URL. This is the behaviour I would 
    # expect if I had logged out of our site. 
    for page in PAGES: 
     print '%s%s' % (SITE, page) 
     page = browser.open('%s%s' % (SITE, page)) 
     page_stats = get_page_statistics(page.get_data()) 
     print page_stats 
+0

Est-ce que le premier travail d'appel ouvert et tous les appels séquentiels arrivent sur la page de connexion, ou est-ce que tout le monde tape sur la page de connexion? – ahawker

+0

le premier appel est géré dans l'appel login_to_BOE() et il fonctionne exactement comme prévu. Tous les appels dans la boucle for renvoient la page de connexion (avec un paramètre ajouté qui indique l'URL à rediriger vers une connexion réussie). – rhacer

Répondre

1

Ceci n'est pas une réponse, mais cela pourrait vous mener dans la bonne direction. Essayez d'activer des fonctions de débogage étendues de Mécaniser, en utilisant une combinaison des énoncés ci-dessous:

browser.set_debug_redirects(True) 
browser.set_debug_responses(True) 
browser.set_debug_http(True) 

Cela fournira un flot d'informations HTTP, que je trouve très utile quand j'ai développé mon seul et unique application basée mécaniser.

Je devrais noter que je ne fais pas beaucoup (si quelque chose) différent dans mon application que ce que vous avez montré dans votre question. Je crée un navigateur objet de la même manière, puis le transmettre à cette fonction de connexion:

def login(browser): 
    browser.open(config.login_url) 
    browser.select_form(nr=0) 
    browser[config.username_field] = config.username 
    browser[config.password_field] = config.password 
    browser.submit() 
    return browser 

Je peux alors les pages nécessaires d'authentification-ouvert avec browser.open (url) et toute la gestion des cookies est géré de manière transparente et automatique pour moi.

2

Au lieu d'utiliser pour chaque lien:

browser.open('www.google.com') 

Essayez d'utiliser ce qui suit après avoir fait la première connexion:

browser.follow_link(text = 'a href text') 

Je pense que l'appel est ouvert ce qui est de réinitialiser vos cookies.

2

Will,

Votre suggestion m'a fait exactement la bonne direction.

Chaque navigateur web que j'ai jamais utilisé a répondu à quelque chose comme le bon suivant:

http://www.foo.com//bar/baz/trool.html 

Depuis que je déteste faire avancer les choses CONCATENE incorrectement ma variable du site a été « http://www.foo.com/ »

En outre, tous les autres URLS étaient "/bar/baz/trool.html"

Mes appels à ouvrir ont fini par être .open('http://www.foo.com//bar/baz/trool.html') et le navigateur de mécanisation ne fait évidemment pas de massage comme un "vrai" navigateur le ferait. Apache n'a pas aimé les urls.