2

从 Python 中的urllib2feedparser库开始,每当尝试从特定 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)运行我的实验。报告的错误在远程机器上发生得更频繁,尽管即使在本地主机上也是不可预测的。

任何建议将不胜感激。

4

2 回答 2

3

如错误所示,这是一个连接问题。这可能是您的互联网连接或他们的服务器/连接/带宽的问题..

一个简单的解决方法是在 while 循环中进行 feedparsing,当然要保留一个 MAX 重试计数器。

于 2011-11-23T09:14:06.303 回答
3

超时多久发生一次?如果不频繁,您可以在每次超时后等待,然后重试请求:

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
于 2011-11-23T09:14:57.747 回答