如何让urllib2记录所有传输的字节
我正在写一个网页应用,它使用了几个第三方的网络接口(API)。我想记录下底层的请求和响应,以便随时进行分析。所以我在寻找一种方法,让Python的urllib2能够记录所有通过HTTP传输的字节。也许可以用一个子类化的处理器来实现?
2 个回答
2
这看起来挺复杂的。urllib2、urllib 或 httplib(这个是建立在这些基础上的)都没有可以用来拦截输入或输出数据的钩子。
除了换个方法使用外部工具(有很多这样的工具,大多数人都在用),我想到的唯一办法就是在你自己的新模块里写一个 socket.socket 的子类(比如叫“capture_socket”),然后通过“import capture_socket; import httplib; httplib.socket = capture_socket”把它插入到 httplib 里。你需要把 httplib 里用到的所有必要引用(任何形式为“socket.foo”的内容)复制到你自己的模块里,但这样你就可以在你的子类里重写像 recv() 和 sendall() 这样的函数,来处理你想要的数据。
如果你使用 SSL,可能会出现一些复杂情况,我不太确定这样做是否足够,或者你是否还需要自己创建一个 socket._fileobject。不过看起来是可行的,查看标准库里的 httplib.py 和 socket.py 源码会让你了解更多。
12
我找到了如何设置这个库自带的调试机制:
import logging, urllib2, sys
hh = urllib2.HTTPHandler()
hsh = urllib2.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = urllib2.build_opener(hh, hsh)
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.NOTSET)
不过,我仍然在寻找一种方法来导出所有传输的信息。