Python: путаница urllib / urllib2 / httplib

Я пытаюсь проверить функциональность веб-приложения, написав последовательность входа в систему на Python, но у меня возникли проблемы.

Вот что мне нужно сделать:

  1. Сделайте POST с несколькими параметрами и заголовками.
  2. Следуйте перенаправлению
  3. Получите тело HTML.

Я относительно новичок в python, но две вещи, которые я пока тестировал, не сработали. Сначала я использовал httplib с putrequest () (передавая параметры в URL) и putheader (). Похоже, это не следовало за перенаправлениями.

Затем я попробовал urllib и urllib2, передав заголовки и параметры в виде dicts. Кажется, это возвращает страницу входа, а не страницу, на которую я пытаюсь войти, я думаю, это из-за отсутствия файлов cookie или чего-то еще.

Я упустил что-то простое?

Спасибо.

Используйте библиотеку запросов python.

hughdbrown 26.05.2012 17:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
52
1
30 857
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Помимо того факта, что у вас может отсутствовать файл cookie, в форме могут быть некоторые поля, которые вы не отправляете на веб-сервер. Лучшим способом было бы захватить фактический POST из веб-браузера. Вы можете использовать LiveHTTPHeaders или WireShark, чтобы отслеживать трафик и имитировать такое же поведение в вашем скрипте.

Спасибо за хороший совет по дополнению Firefox :) Но нет, похоже, я передаю необходимые заголовки и данные.

Ace 19.11.2008 17:14

Попробуйте саржа - простой язык, который позволяет пользователям просматривать веб-страницы из интерфейса командной строки. С помощью твила вы можете перемещаться по веб-сайтам, которые используют формы, файлы cookie и большинство стандартных веб-функций. Более того, саржа написан на Python и имеет Python API, например:

from twill import get_browser
b = get_browser()

b.go("http://www.python.org/")
b.showforms()

Я бы хотел попробовать Механиз (http://wwwsearch.sourceforge.net/mechanize/). Он вполне может прозрачно обрабатывать ваши файлы cookie / заголовки.

Funkload - отличный инструмент для тестирования веб-приложений. Он обертывает веб-модуль для обработки эмуляции браузера, а затем предоставляет вам функции как функционального, так и нагрузочного тестирования.

Ответ принят как подходящий

Сосредоточьтесь на 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 для захвата и регистрации различных кодов ошибок.

urllib2.urlopen, похоже, отлично справляется с перенаправлениями.

Sridhar Ratnakumar 21.08.2009 00:35

@Sridhar Я тоже это обнаружил - urllib2.urlopen отлично следует перенаправлениям.

mikemaccana 18.06.2010 12:30

Мне недавно пришлось самому проделывать именно это. Мне нужны были только классы из стандартной библиотеки. Вот отрывок из моего кода:

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")

@ S.Lott, спасибо. Ваше предложение сработало для меня с некоторыми изменениями. Вот как я это сделал.

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)

Вот мой взгляд на этот вопрос.

#!/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',{})

Это единственный ответ, который действительно упрощает этот процесс.

EMI 30.09.2011 20:30

Другие вопросы по теме