Проблема Feedparser (и urllib2): истекло время ожидания соединения - PullRequest
2 голосов
/ 23 ноября 2011

Начиная с библиотек urllib2 и feedparser в Python, большую часть времени я получаю следующую ошибку, когда пытаюсь подключиться и извлечь контент с определенного URL:

urllib2.URLError: <urlopen error [Errno 110] Connection timed out>

Минимальные воспроизводимые примеры (базовые, использующие feedparser.parser напрямую и расширенные, где я сначала использую библиотеку urllib2 для извлечения содержимого XML) приведены ниже.

# test-1
import feedparser
f = feedparser.parse('http://www.zurnal24.si/index.php?ctl=show_rss')
title = f['channel']['title']
print title

# test-2
import urllib2
import feedparser
url = 'http://www.zurnal24.si/index.php?ctl=show_rss'
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
request = opener.open(url)
response = request.read()
feed = feedparser.parse(response)
title = feed['channel']['title']
print title

Когда я пытаюсь использовать разные URL-адреса (например, http://www.delo.si/rss/), все работает нормально. Обратите внимание, что все URL приводят к неанглийским (т. Е. Словенским) RSS-каналам.

Я запускаю свои эксперименты как с локальной, так и с удаленной машины (через ssh). Обнаруженная ошибка чаще возникает на удаленном компьютере, хотя она непредсказуема даже на локальном хосте.

Любые предложения будут с благодарностью.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Как часто происходит тайм-аут?Если это не часто, вы можете подождать после каждого таймаута, а затем повторить запрос:

import urllib2
import feedparser
import time
import sys

url = 'http://www.zurnal24.si/index.php?ctl=show_rss'
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]

# Try to connect a few times, waiting longer after each consecutive failure
MAX_ATTEMPTS = 8
for attempt in range(MAX_ATTEMPTS):
    try:
        request = opener.open(url)
        break
    except urllib2.URLError, e:
        sleep_secs = attempt ** 2
        print >> sys.stderr, 'ERROR: %s.\nRetrying in %s seconds...' % (e, sleep_secs)            
        time.sleep(sleep_secs)

response = request.read()
feed = feedparser.parse(response)
title = feed['channel']['title']
print title
3 голосов
/ 23 ноября 2011

Как указывает ошибка, это проблема с подключением.Это может быть проблемой с вашим интернет-соединением или с их серверами / соединением / пропускной способностью.

Простой обходной путь - сделать ваш фидпарсинг в цикле while, сохраняя при этом счетчик попыток MAX ..

...