1

我正在尝试从 nydaily 新闻和其他网站获取 htmltext,但我无法让 mechanize 正确超时。当超时为 0.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 倍。

请注意,在这种特定情况下,与套接字的连接是成功的,但它无法正确读取数据。(或者请求没有在合理的时间内得到服务......)

如果有人能想出一个很好的理由为什么超时乘以四,我会对导致这种情况的原因非常感兴趣。

在 OSX Mavericks 上使用 python 2.7.5 测试

使用 socket.setdefaulttimeout() 似乎并没有改变这种行为。

于 2013-10-26T05:18:14.750 回答
0

即使在浏览器中,这些链接也需要很长时间才能运行。在 Python 中,我能够http://feeds.nydailynews.com/nydnrss/sports在大约 16 秒内加载子集(不指定超时)。

我认为您需要将超时设置为比一秒更“合理”的值,以使其有机会加载,并且我会选择比列出它们的主页更集中的提要。这个热门故事链接为我成​​功加载:http timeout=1: //feeds.nydailynews.com/nydnrss

于 2013-10-26T00:36:21.600 回答