feedparser с тайм-аутом

Мой код застрял в этом вызове функции:

feedparser.parse("http://...")

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


person xralf    schedule 19.03.2012    source источник


Ответы (3)


Вы можете указать время ожидания глобально, используя socket.setdefaulttimeout().

Тайм-аут может ограничивать продолжительность отдельной операции сокета — feedparser.parse() может выполнять много операций сокета, и поэтому общее время, затрачиваемое на DNS, установление TCP-соединения, отправку/получение данных, может быть намного больше. См. https://stackoverflow.com/a/32684677/4279.

person jfs    schedule 19.03.2012
comment
Хорошо, я использовал его, но не знаю, работает ли он, потому что URL с бесконечной загрузкой снова активен. - person xralf; 19.03.2012

Используйте библиотеку Python requests для сетевого ввода-вывода, feedparser только для синтаксического анализа:

# Do request using requests library and timeout
try:
    resp = requests.get(rss_feed, timeout=20.0)
except requests.ReadTimeout:
    logger.warn("Timeout when reading RSS %s", rss_feed)
    return

# Put it to memory stream object universal feedparser
content = BytesIO(resp.content)

# Parse content
feed = feedparser.parse(content)
person Mikko Ohtamaa    schedule 05.09.2016
comment
Это лучше, чем указание глобального тайм-аута, но это может не решить проблему по причине, указанной в моем ответе (requests.get() может блокироваться намного дольше, чем значение timeout). Перейдите по ссылке, чтобы узнать подробности. - person jfs; 25.03.2018
comment
Мне нравится это решение. У меня есть настройки http, которые очень хорошо подходят для моих целей, но я хотел использовать feedparser для вариантов, которые я нахожу в rss-каналах. Это позволяет мне делать и то, и другое. Спасибо! - person jsfa11; 10.01.2019

Согласно рекомендации автора[1], вы должны использовать библиотеку запросов для выполнения http-запроса и парсить результат в фидпарсер.

[1] https://github.com/kurtmckee/feedparser/pull/80

person apporc    schedule 08.07.2020