我的代码卡在这个函数调用上:
feedparser.parse("http://...")
这以前有效。该网址甚至无法在浏览器中打开。 你会如何治疗这个病例?有超时的可能吗?我想继续,就像什么都不会发生一样(仅打印一些消息或记录此问题)
使用Python
requests
库进行网络IO,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)
您可以使用
socket.setdefaulttimeout()
全局指定超时。
超时可能会限制单个套接字操作可以持续的时间 -
feedparser.parse()
可能会执行许多套接字操作,因此花费在 dns、建立 tcp 连接、发送/接收数据上的总时间可能会更长。请参阅使用 urllib2 或任何其他 http 库读取超时。
根据作者的建议[1],你应该使用requests库来做http请求,并将结果解析到feedparser。
如果你想要一个快速的解决方法,你可以猴子补丁并使用请求库,而不是适当的超时。它还修复了我在默认 feedparser url 打开实现中遇到的 https 证书问题。我就是这样做的:
feedparser._open_resource = lambda *args, **kwargs: feedparser._StringIO(requests.get(args[0], timeout=5).content)
更新:在 6.x 以上的版本上使用以下内容:
feedparser.api._open_resource = lambda *args, **kwargs: requests.get(args[0], headers=headers, timeout=5).content
保留所有权利