最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

python获取远程页面内容,避免卡死问题

Python 10386浏览 0评论

在python 2.7中,获取远程页面的数据可以使用urllib模块,也可以使用urlib2模块。我是使用urllib2模块来操作的。

我在本地建立一个测试文件test.php,文件内容就是输出一段字符串:

echo 'I think; therefor, I exist.';

我也搭建了web服务器,可以通过http://localhost/test.php来访问这个文件。

而后用python中的urllib2中的方法来获取这个这个地址的内容:

import urllib2

url = "http://localhost/test.php"
f = urllib2.urlopen(url)
print f.readlines()

上例如果成功运行,应该看到这样的输出:

['I think; therefor, I exist.']

但是这样的代码并不完善,如果请求的页面很久没有返回数据,python就会处于等待过程,直到页面数据返回。在test.php加上休眠代码,模拟页面很久才能返回数据:

sleep(10)

修改python程序,加入时间输出:

import urllib2
import time

print time.time() #start time
url = "http://localhost/test.php"
f = urllib2.urlopen(url)
print f.readlines()
print time.time() #end time

重新运行python程序,等待大约10秒钟,才能看到数据返回,正常的话,输出如下:

1351344569.49
['I think; therefor, I exist.']
1351344579.5

开始时间和结束想差了10秒,就是上面加的sleep(10)了。如果页面数据一直不返回,那么不是要一直等下去?可以在urllib2.urlpen()时加上timeout参数,设置超时时间,在python 2.6以上的版本才支持。修改python代码:

import urllib2
import time

print time.time()
try:
    url = "http://localhost/test.php"
    f = urllib2.urlopen(url, timeout=5)
    print f.readlines()
except Exception, e:
    print e
print time.time()

上面加入了超时设置,因为如果超时退出的话,还会抛出一个异常,所以加上try/except处理。正常执行后应当输出:

1351345395.35
timed out
1351345400.37

这边就只等待了5秒,然后就因为请求远程数据超时退出了,不会一直卡住。

友情提示:

如果是在python 2.6版本之前,可以通过socket.setdefaulttimeout()方法来设置超时时间。

转载请注明:快乐编程 » python获取远程页面内容,避免卡死问题

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址