python学习笔记——关于HTTPResponse
2016-07-21 本文已影响0人
MeteorsHub
我们经常使用下面的语句获取目标网站的网页文件:
import urllib.request
rs = urllib.request.urlopen('http://www.baidu.com')
data = rs.read()
其中rs就是一个HTTPResponse对象。根据python文档,这个对象被定义在HTTP.client.py文件里,说明如下
An HTTPResponse instance wraps the HTTP response from the server. It provides access to the request headers and the entity body. The response is an iterable object and can be used in a with statement
但是得到了rs并不代表得到了我们想要的网页数据,只能得到包头信息,只有当实现read()方法时才会从服务器请求到数据包的正文内容。这与我们的常识并不相符,因为数据包正文按常理是同包头一同发送的。为了推翻这个常识,我们可以这样测试:
- 首先进入调试,得到rs后设置断点:
-
可以看到rs已经包含了header信息:
- 这时断开网线,如果rs里已经存储了包正文内容,调用read()方法应该可以得到信息。但事实上:
当然你可以说我可以将两行代码写在一起啊,而且运行时又不会运行一半停下程序拔掉网线再继续运行。但有些时候这个特性还是挺蛋疼的。
比如你写了一个代理,需求是根据url返回response,假如在代理模块得到了正常的response,返回后又进行了其他一些操作比如IO处理等,而我们知道很多代理都不太稳定(尤其是我们这种苦逼程序猿买不起付费代理只能用免费的),等到真正read()数据时发现代理挂了。。。有一种想砸电脑的冲动。
** 如果有人有更好的方法来解决这个问题或者我的理解有误,欢迎指正 **