Python: urllib/urllib2/httplib путаница
Я пытаюсь проверить функциональность веб-приложения, написав последовательность входа в Python, но у меня возникают проблемы.
Вот что мне нужно сделать:
- Сделайте POST с несколькими параметрами и заголовками.
- Следуйте за перенастройкой
- Получить тело HTML.
Теперь я относительно новичок в python, но две вещи, которые я тестировал до сих пор, не сработали. Сначала я использовал httplib, с putrequest() (передавая параметры в URL) и putheader(). Похоже, что это не переадресация.
Затем я попробовал urllib и urllib2, передавая оба заголовка и параметры в качестве dicts. Кажется, это возвращает страницу входа, а не страницу, к которой я пытаюсь войти, я думаю, из-за отсутствия файлов cookie или чего-то еще.
Я пропустил что-то простое?
Спасибо.
Ответы
Ответ 1
Сфокусируйтесь на urllib2
для этого, он работает достаточно хорошо. Не связывайтесь с httplib
, это не API верхнего уровня.
Что вы замечаете, так это то, что urllib2
не следует перенаправлению.
Вам нужно сложить экземпляр HTTPRedirectHandler
, который будет ловить и следовать перенаправлениям.
Кроме того, вы можете захотеть подклассифицировать по умолчанию HTTPRedirectHandler
для сбора информации, которую вы затем проверите как часть тестирования вашего устройства.
cookie_handler= urllib2.HTTPCookieProcessor( self.cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)
Затем вы можете использовать этот объект opener
для POST и GET, правильно обрабатывая переадресацию и файлы cookie.
Возможно, вы захотите добавить свой собственный подкласс HTTPHandler
для записи и регистрации различных кодов ошибок.
Ответ 2
Здесь я беру на себя эту проблему.
#!/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',{})
Ответ 3
@S. Лотт, спасибо. Ваше предложение сработало для меня, с некоторыми изменениями. Вот как я это сделал.
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)
Ответ 4
Я должен был сделать это совсем недавно. Мне нужны только классы из стандартной библиотеки. Вот выдержка из моего кода:
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 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")
Ответ 5
Я бы дал Mechanize (http://wwwsearch.sourceforge.net/mechanize/) выстрел. Он может хорошо обрабатывать ваши файлы cookie/заголовки.
Ответ 6
Попробуйте twill - простой язык, который позволяет пользователям просматривать веб-интерфейс из интерфейса командной строки. С помощью twill вы можете перемещаться по веб-сайтам, использующим формы, куки и большинство стандартных веб-функций. Более того, twill написан в Python
и имеет API-интерфейс python, например:
from twill import get_browser
b = get_browser()
b.go("http://www.python.org/")
b.showforms()
Ответ 7
Помимо того факта, что вам может не хватать куки файл, может быть поле (-ы) в форме, которую вы не отправляете на веб-сервер. Лучший способ - захватить фактический POST из веб-браузера. Вы можете использовать LiveHTTPHeaders или WireShark для отслеживания трафик и имитировать такое же поведение в script.
Ответ 8
Funkload - отличный инструмент для тестирования веб-приложений. Он обертывает веб-узел для обработки эмуляции браузера, а затем дает вам функциональные и нагрузочные функции.