Как установить тайм-аут с помощью python-механизма?

Я использую python-mechanize для очистки некоторых веб-сайтов, которые иногда просто не отвечают на запросы. и эти запросы остаются открытыми слишком долго, поэтому мне нужно ограничить время ожидания для этих запросов.

При использовании метода urlopen время ожидания можно установить с помощью параметра timeout, но я не нашел простого способа сделать это с помощью API высокого уровня, такого как методы submit или click. В идеале тайм-аут должен быть установлен только один раз для всего класса браузера, и все вызовы будут учитывать это.

Вероятно, было бы возможно настроить это, передав пользовательский request_class каждому вызову click и submit, но это просто загрязнит код, поэтому я ищу более приятное решение для установки тайм-аута для класса браузера mechanize (и нет, я не хотите изменить время ожидания сокета по умолчанию, используя socket.setdefaulttimeout).


person Michal Čihař    schedule 27.01.2014    source источник
comment
stackoverflow.com/questions/8464391/   -  person Guy Gavriely    schedule 27.01.2014
comment
Я знаю, что mechanize.Request может указать время ожидания. Проблема в том, что я использую класс Request не напрямую, а с помощью методов щелчка или отправки, которые не предоставляют способ установить тайм-аут.   -  person Michal Čihař    schedule 28.01.2014
comment
Browser.__init__ занимает request_class, разве это не используется по умолчанию?   -  person Jan Matějka    schedule 08.02.2014
comment
К сожалению, этот метод не передается методам click/submit, у них есть свои собственные жестко заданные значения по умолчанию.   -  person Michal Čihař    schedule 11.02.2014


Ответы (2)


В сообществе Python это немного не одобряется, но вы можете «спрятать» желаемое поведение в классе браузера.

По сути, вам нужно сделать следующее. Создайте функцию, которая делает то, что вы хотите (используя собственный класс запросов).

browser_click = Browser.click
def my_click(self, *args, **kwds):
    browser_click(self, request_class=MyRequestClass, *args, **kwds)
Browser.click = my_click

Если это слишком Ruby на ваш вкус, вы можете создать подкласс Browser, который делает что-то подобное.

class MyBrowser(Browser):
    def click(self, *args, **kwds):
        Browser.click(self, request_class=MyRequestClass, *args, **kwds)

Я нахожу это немного чище, но это не сработает, если у вас нет контроля над созданием экземпляров вашего браузера.

person Hans Then    schedule 29.05.2014

Вы можете попробовать использовать цикл do-while с таким кодом:

start = time.clock()
... do something
elapsed = (time.clock() - start)

or

start = time.time()
... do something
elapsed = (time.time() - start)
person Tim.DeVries    schedule 02.06.2014