2

Python のライブラリから始めてurllib2feedparser特定の URL に接続してコンテンツを取得しようとすると、ほとんどの場合、次のエラーが発生します。

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

最小限の再現可能な例 ( XML コンテンツをフェッチするために最初にライブラリーfeedparser.parserを使用する基本、直接および高度な使用) を以下に貼り付けます。urllib2

# 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 ループでフィード解析を実行することです。もちろん、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 に答える