Python: urllib / urllib2 / httplib

Próbuję przetestować funkcjonalność aplikacji internetowej przez skrypt sekwencji logowania w Pythonie, ale mam pewne problemy.

Oto co muszę zrobić:

  1. zrób POST z kilkoma parametrami i nagłówkami.
  2. Follow a redirect
  3. Pobierz ciało HTML.

Teraz jestem stosunkowo nowy w Pythonie, ale dwie rzeczy, które testowałem do tej pory nie działały. Najpierw użyłem httplib, z putrequest () (przekazując parametry w adresie URL) i putheader (). To chyba nie podąża za przekierowaniami.

Następnie próbowałem urllib i urllib2, przekazując zarówno nagłówki, jak i parametry jako dicty. To wydaje się zwracać stronę logowania, zamiast strony, do której próbuję się zalogować, myślę, że to z powodu braku ciasteczek lub czegoś takiego.

Brakuje mi czegoś prostego?

Dzięki.
Author: Eli Courtwright, 2008-11-19

8 answers

Skup się na urllib2 do tego działa całkiem dobrze. Nie zadzieraj z httplib, to nie jest API najwyższego poziomu.

Zauważasz, że urllib2 nie podąża za przekierowaniem.

Musisz złożyć instancję HTTPRedirectHandler, która złapie i podąży za przekierowaniami.

Ponadto możesz podklasyfikować domyślną HTTPRedirectHandler, Aby przechwycić informacje, które następnie sprawdzisz w ramach testów jednostkowych.

cookie_handler= urllib2.HTTPCookieProcessor( self.cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)

Możesz następnie użyć tego opener obiektu do POST I GET, obsługi przekierowania i pliki cookie prawidłowo.

Możesz dodać własną podklasę HTTPHandler do przechwytywania i rejestrowania różnych kodów błędów.

 31
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 14:52:47

Oto moje zdanie na ten temat.

#!/usr/bin/env python

import urllib
import urllib2


class HttpBot:
    """an HttpBot represents one browser session, with cookies."""
    def __init__(self):
        cookie_handler= urllib2.HTTPCookieProcessor()
        redirect_handler= urllib2.HTTPRedirectHandler()
        self._opener = urllib2.build_opener(redirect_handler, cookie_handler)

    def GET(self, url):
        return self._opener.open(url).read()

    def POST(self, url, parameters):
        return self._opener.open(url, urllib.urlencode(parameters)).read()


if __name__ == "__main__":
    bot = HttpBot()
    ignored_html = bot.POST('https://example.com/authenticator', {'passwd':'foo'})
    print bot.GET('https://example.com/interesting/content')
    ignored_html = bot.POST('https://example.com/deauthenticator',{})
 15
Author: Jason Pepas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-29 09:33:42

@S. Lott, dziękuję. Twoja sugestia zadziałała na mnie, z pewną modyfikacją. Oto jak to zrobiłem.

data = urllib.urlencode(params)
url = host+page
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)

cookies = CookieJar()
cookies.extract_cookies(response,request)

cookie_handler= urllib2.HTTPCookieProcessor( cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)

response = opener.open(request)
 13
Author: Ace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 15:17:31

Musiałem to zrobić sam ostatnio. Potrzebowałem tylko zajęć z biblioteki standardowej. Oto fragment mojego kodu:

from urllib import urlencode
from urllib2 import urlopen, Request

# encode my POST parameters for the login page
login_qs = urlencode( [("username",USERNAME), ("password",PASSWORD)] )

# extract my session id by loading a page from the site
set_cookie = urlopen(URL_BASE).headers.getheader("Set-Cookie")
sess_id = set_cookie[set_cookie.index("=")+1:set_cookie.index(";")]

# construct headers dictionary using the session id
headers = {"Cookie": "session_id="+sess_id}

# perform login and make sure it worked
if "Announcements:" not in urlopen(Request(URL_BASE+"login",headers=headers), login_qs).read():
    print "Didn't log in properly"
    exit(1)

# here's the function I used after this for loading pages
def download(page=""):
    return urlopen(Request(URL_BASE+page, headers=headers)).read()

# for example:
print download(URL_BASE + "config")
 11
Author: Eli Courtwright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 15:12:08

Dałbym ( http://wwwsearch.sourceforge.net/mechanize / ) strzał. Może również obsługiwać twoje pliki cookie/nagłówki w sposób przejrzysty.

 8
Author: Matthew Christensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 14:19:19

Try twill - prosty język, który pozwala użytkownikom przeglądać Internet z poziomu interfejsu wiersza poleceń. Dzięki twill możesz poruszać się po witrynach internetowych, które używają formularzy, plików cookie i większości standardowych funkcji internetowych. Bardziej Do Rzeczy, twill jest napisany w Python i ma API Pythona , np:

from twill import get_browser
b = get_browser()

b.go("http://www.python.org/")
b.showforms()
 6
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 14:15:32

Poza tym, że może Ci brakować pliku cookie, w formularzu mogą być pola, których nie publikujesz na serwerze. Najlepszym sposobem byłoby uchwycenie rzeczywistego postu z przeglądarki internetowej. Możesz użyć LiveHTTPHeaders lub WireShark , aby szpiegować ruch i naśladować to samo zachowanie w swoim skrypcie.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 14:00:59

Funkload jest również doskonałym narzędziem do testowania aplikacji internetowych. Owija webunit do obsługi emulacji przeglądarki, a następnie daje zarówno funkcjonalne, jak i funkcje testowania obciążenia.

 0
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 14:32:49