LINUX.ORG.RU

python/urllib зависает запрос через прокси


0

1

python 3.2 проверяю прокси urllib-ом:

 request = urllib.request.Request(url)
 request.add_header('User-Agent',
                   'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20190824 Firefox/3.5.3')

 opener = urllib.request.build_opener(urllib.request.ProxyHandler({'https': '213.111.252.230:8000'}))
 urllib.request.install_opener(opener)

       try:
          res = urllib.request.urlopen(request,
                timeout=3) 
       except HTTPError as e:
          self.log('сервер вернул ошибку: %s' % e.code, '!')
          return False
       except URLError as e:
          self.log('не могу скачать страницу: %s' % e.reason, '!')
          return False
       except Exception as e:
          self.log('ошибка: %s' % e, '!')
       else:
          headers = res.getheaders()
          encoding = self.parent.http._get_encoding(headers)

          try:
             data = res.read().decode(encoding, 'ignore')
          except Exception as e:
             self.log('ошибка http.read().decode(): %s' % e, '!')
             return False
 

и собственно, на чем все виснет:

 проверяем 213.111.252.230:8000, тип 0
 [!] ошибка: <urlopen error [Errno 111] В соединении отказано>
 проверяем 213.111.252.230:8000, тип 1
 [!] ошибка: <urlopen error timed out>
 * тут виснет на минуту *
 проверяем 213.111.252.230:8000, тип 2
 [!] ошибка: <urlopen error [Errno 110] Время ожидания соединения истекло>
 * и тут продолжает тупить *
 

на запросах меняется тип - 0,1,2 - это типы хэндлеров прокси 0 - urllib.request.ProxyHandler 1 - socks5 - proxiPy 2 - https - proxiPy

но тип прокси ничего не меняет несмотря на то, что timeout = 3 сек. — тупит все равно бесконечно долго

и ещё, что интересно, перед запросом ставлю HTTPConnection.debuglevel = 2 но отладочной информации в логе не выводится

★★★

Последнее исправление: sergey-novikov (всего исправлений: 2)

Попробуй под стрейсом запустить - можно будет увидеть где именно зависает или циклится.

provaton ★★★★★
()
Ответ на: комментарий от SOmni

не, он не зависал и не циклился

как оказалось, в socksHandler, использующем портированный на 3.2 socksiPy есть такая строчка

if isinstance(self.timeout, float):
self.sock.settimeout(self.timeout)

такая вот байда. никогда бы в голову не пришло ставить таймаут в флоат.
изменил проверку на int и все заработало

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.