我正在尝试从nydaily新闻和其他网站获取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]
答案 0 :(得分: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()似乎不会改变此行为。
答案 1 :(得分:0)
即使在浏览器中,这些链接也需要很长时间才能运行。在Python中,我能够在大约16秒内加载子集http://feeds.nydailynews.com/nydnrss/sports
(没有指定超时)。
我认为你需要将超时设置为比一秒更“合理”的东西,以便给它一个加载的机会,我会选择比它们全部列出的主页更有针对性的提要。通过timeout=1
:http://feeds.nydailynews.com/nydnrss