Найти - Пользователи
Полная версия: Исключения в urllib. TimeoutError: [WinError 10060]
Начало » Python для новичков » Исключения в urllib. TimeoutError: [WinError 10060]
1 2
IRiot
Доброго времени суток. Есть скрипт, парсит некие данные с сайта в цикле. Дело в том, что иногда, после некоторого времени работы скрипта, он падает с ошибкой:
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
py.user.next
while True:
    try:
        f()
        break
    except TimeoutError:
        sleep(10)
IRiot
Исправил:
while True:
    try:
        site = urllib.request.urlopen('http://www.google.ru').read()
    except TimeoutError:
        print("TimeOut...Sleep")
        time.sleep(10)
        pass
Вываливается с такой же ошибкой.
py.user.next
IRiot
Исправил:
Копируй точно.

Я тебе специально не стал вписывать этот urlopen(), потому что ты его неправильно используешь. Там нужно делать with и read() отсоединить в отдельный оператор.
IRiot
Не могу сообразить, не разбирался еще с with-as. Не могли бы вы объяснить? Если вас конечно не затруднит.
py.user.next
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)
unza
py.user.next

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

Но это еще не все, можно его переделать с ипользованием библиотеки urllib2?
py.user.next
unza
пробую ваш пример, выдает:
NameError: global name ‘TimeoutError’ is not defined
Поставь третий питон
  
>>> TimeoutError
<class 'TimeoutError'>
>>>

unza
можно его переделать с ипользованием библиотеки urllib2?
Скорее всего, можно. Это второй питон, там надо копаться, чтобы понять, как.
unza
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) - не работает, хотя по описанию там можно передавать данные.
py.user.next
  
req = urllib.request.Request(url, headers={'User-Agent': 'Firefox'})
data = urllib.request.urlopen(req)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB