1

nydaily ニュースや他の Web サイトから htmltext を取得しようとしていますが、正しくタイムアウトするように機械化できません。タイムアウトが .01 の場合はすぐにタイムアウトしますが、タイムアウトがより妥当な値 (1.0) の場合は、次のエラーが発生するまで約 2 分間実行されます。

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/monitor.py", line 575, in run
    already_pickled=True)
  File "/usr/lib/python2.7/dist-packages/spyderlib/utils/bsdsocket.py", line 24, in write_packet
    sock.send(struct.pack("l", len(sent_data)) + sent_data)
error: [Errno 32] Broken pipe
import mechanize

br = mechanize.Browser()    
url = 'http://www.nydailynews.com/services/feeds'
htmltext= br.open(url,timeout=1.0).read()
print htmltext[:200]
4

2 に答える 2

1

urllib2 が一般的に動作している方法で何か間抜けなことが起こっています (機械化はフォークを使用します)。

これを見てください:

#!/usr/bin/python

import time
import urllib2
import sys

def graburl(url,timeout):
    urllib2.urlopen(url, timeout=float(timeout))

for i in range(1,30):
    try:
        start = time.time()
        graburl("http://www.cnn.com:443", i)
    except:
        print 'Timeout: ', i, 'Duration: ', time.time() - start

実行時:

Timeout:  1 Duration:  4.45208692551
Timeout:  2 Duration:  8.00451898575
Timeout:  3 Duration:  12.0053498745
Timeout:  4 Duration:  16.0044560432
Timeout:  5 Duration:  20.0762069225
Timeout:  6 Duration:  24.005065918

したがって、実際のタイムアウトは、指定されたタイムアウトの 4 倍になります。

この特定のケースでは、ソケットへの接続は成功しますが、データを正しく読み取ることができないことに注意してください。(または、リクエストが妥当な時間内に処理されない...)

誰かがタイムアウトが 4 倍になる正当な理由を思い付くことができれば、その原因に非常に興味があります。

OSX Mavericks で python 2.7.5 でテスト済み

socket.setdefaulttimeout() を使用しても、この動作は変わらないようです。

于 2013-10-26T05:18:14.750 に答える