Feedparser(和urllib2)问题:连接超时

2 投票
2 回答
2139 浏览
提问于 2025-04-17 06:54

在使用Python的 urllib2feedparser 库时,我在尝试连接并获取特定网址的内容时,常常会遇到以下错误:

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

当我尝试不同的网址(例如 http://www.delo.si/rss/)时,一切都正常。请注意,所有这些网址都是非英语的(也就是斯洛文尼亚语)的RSS源。

我在本地和远程机器上(通过 ssh)都进行了实验。报告的错误在远程机器上更频繁出现,尽管在本地主机上也有时会出现,情况不太稳定。

如果有任何建议,我将非常感激。

2 个回答

3

这个错误提示说明了是连接方面的问题。这可能是你的网络连接出了问题,也可能是对方的服务器、连接或者带宽有问题。

一个简单的解决办法是把你的数据解析放在一个循环里,当然要记得设置一个最大重试次数的计数器。

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

撰写回答