Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2015 13:06:09

IRiot
Зарегистрирован: 2015-03-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

Доброго времени суток. Есть скрипт, парсит некие данные с сайта в цикле. Дело в том, что иногда, после некоторого времени работы скрипта, он падает с ошибкой:

TimeoutError: [WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера
Открываю сайт через urllib.request.urlopen. Как можно это исправить, что бы скрипт при возникновении ошибки не падал, а засыпал на несколько секунд и пробовал заново подключится? Знаю, что нужно использовать try, попробовал так, не вышло:
try:
    site = urllib.request.urlopen('http://www.google.ru').read()
except urllib.URLError:
    print("TimeOut...Sleep")
    time.sleep(10)
    continue

Офлайн

#2 Март 29, 2015 13:27:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

while True:
    try:
        f()
        break
    except TimeoutError:
        sleep(10)



Отредактировано py.user.next (Март 29, 2015 13:27:54)

Офлайн

#3 Март 29, 2015 13:41:17

IRiot
Зарегистрирован: 2015-03-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

Исправил:

while True:
    try:
        site = urllib.request.urlopen('http://www.google.ru').read()
    except TimeoutError:
        print("TimeOut...Sleep")
        time.sleep(10)
        pass
Вываливается с такой же ошибкой.

Офлайн

#4 Март 29, 2015 13:49:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

IRiot
Исправил:
Копируй точно.

Я тебе специально не стал вписывать этот urlopen(), потому что ты его неправильно используешь. Там нужно делать with и read() отсоединить в отдельный оператор.



Отредактировано py.user.next (Март 29, 2015 13:51:13)

Офлайн

#5 Март 29, 2015 19:08:04

IRiot
Зарегистрирован: 2015-03-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

Не могу сообразить, не разбирался еще с with-as. Не могли бы вы объяснить? Если вас конечно не затруднит.

Офлайн

#6 Март 30, 2015 00:27:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

import urllib.request
import time
 
def load(url):
    with urllib.request.urlopen(url) as data:
        charset = data.headers.get_charsets()[0]
        text = data.read().decode(charset or 'latin1')
        return text
 
def load_with_time(url, timeout):
    text = None
    while True:
        try:
            text = load(url)
            break
        except TimeoutError:
            time.sleep(timeout)
    return text
 
load_with_time('http://www.google.ru', 5000)



Отредактировано py.user.next (Март 30, 2015 00:29:41)

Офлайн

#7 Июль 26, 2017 23:20:31

unza
Зарегистрирован: 2017-07-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

py.user.next

пробую ваш пример, выдает:
NameError: global name ‘TimeoutError’ is not defined

Но это еще не все, можно его переделать с ипользованием библиотеки urllib2?

Отредактировано unza (Июль 26, 2017 23:21:01)

Офлайн

#8 Июль 26, 2017 23:47:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

unza
пробую ваш пример, выдает:
NameError: global name ‘TimeoutError’ is not defined
Поставь третий питон
  
>>> TimeoutError
<class 'TimeoutError'>
>>>

unza
можно его переделать с ипользованием библиотеки urllib2?
Скорее всего, можно. Это второй питон, там надо копаться, чтобы понять, как.



Отредактировано py.user.next (Июль 26, 2017 23:49:31)

Офлайн

#9 Июль 27, 2017 21:16:28

unza
Зарегистрирован: 2017-07-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

py.user.next спасибо, ошибки связанной с этой переменной более не возникает.
подскажите, а как в эту конструкцию добавить передачу хедера, например:

head = {'User-Agent': ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’,
‘Accept-Charset’: ‘ISO-8859-1,utf-8;q=0.7,*;q=0.3’,
‘Accept-Encoding’: ‘none’,
‘Accept-Language’: ‘en-US,en;q=0.8’,
‘Connection’: ‘keep-alive’}

иначе сервер отдает 403ю ошибку на запрос, видно ему не нравится питоновский заголовок.
пробовал всунуть в запрос
urllib.request.urlopen(url) в виде urllib.request.urlopen(url, head) - не работает, хотя по описанию там можно передавать данные.

Отредактировано unza (Июль 27, 2017 21:17:22)

Офлайн

#10 Июль 28, 2017 01:34:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

  
req = urllib.request.Request(url, headers={'User-Agent': 'Firefox'})
data = urllib.request.urlopen(req)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version