Python: беспорядок urllib/urllib2/httplib

    private int GetSync()
    {
        try
        {
            ManualResetEvent mre = new ManualResetEvent(false);
            int result = null;

            Parallel.Invoke(async () =>
            {
                result = await SomeCalcAsync(5+5);
                mre.Set();
            });

            mre.WaitOne();
            return result;
        }
        catch (Exception)
        {
            return null;
        }
    }
52
задан Eli Courtwright 20 November 2008 в 14:21
поделиться

7 ответов

Внимание на 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 и ДОБРАТЬСЯ, обработав перенаправления и cookie правильно.

можно хотеть добавить собственный подкласс HTTPHandler, чтобы получить и зарегистрировать различные коды ошибки, также.

31
ответ дан S.Lott 7 November 2019 в 19:26
поделиться

@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)
13
ответ дан Ace 7 November 2019 в 19:26
поделиться

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

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
ответ дан Eli Courtwright 7 November 2019 в 19:26
поделиться

Попробуйте твил - простой язык, который позволяет пользователям просматривать веб-сайты от интерфейса командной строки. С твилом можно перейти через веб-сайты, которые используют формы, cookie и самые стандартные функции Web. Главное, твил записан в Python и имеет python API, например:

from twill import get_browser
b = get_browser()

b.go("http://www.python.org/")
b.showforms()
6
ответ дан gimel 7 November 2019 в 19:26
поделиться

Я дал бы, Механизируют ( http://wwwsearch.sourceforge.net/mechanize/ ) выстрел. Это может обработать Ваш cookie/заголовки прозрачно.

8
ответ дан Matthew Christensen 7 November 2019 в 19:26
поделиться

Помимо того, что можно пропускать cookie, могло бы быть некоторое поле (поля) в форме, которую Вы не ОТПРАВЛЯЕТЕ на веб-сервер. Лучший способ состоял бы в том, чтобы получить фактический POST от веб-браузера. Можно использовать LiveHTTPHeaders или WireShark, чтобы отследить трафик и подражать тому же поведению в сценарии.

0
ответ дан 7 November 2019 в 19:26
поделиться

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

0
ответ дан Ned Batchelder 7 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: