2014-01-27 1 views
1

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

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

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

+0

http://stackoverflow.com/questions/8464391/what-should-i- do-if-socket-setdefaulttimeout-is-not-working –

+0

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

+0

'Browser .__ init__' принимает' request_class', который используется не по умолчанию? – yaccz

ответ

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 для вашего вкуса, вы можете создать подкласс браузера, который сделает что-то подобное.

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

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

1

Вы могли бы попробовать использовать цикл Do-While с кодом, такие как:

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

или

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

 Смежные вопросы

  • Нет связанных вопросов^_^