如何让urllib2记录所有传输的字节

时间:2009-07-23 09:56:43

标签: python http logging urllib2

我正在编写一个使用多个第三方Web API的网络应用程序,我想跟踪低级请求和广告分析的响应。所以我正在寻找一个能让Python的urllib2记录通过HTTP传输的所有字节的配方。也许是一个次级的Handler?

2 个答案:

答案 0 :(得分: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)

但我仍在寻找一种方法来转储所有转移的信息。

答案 1 :(得分: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中的源会告诉你更多信息。