我想将请求Response
对象序列化为 json,最好是 HAR 格式。
import requests
resp = requests.get('http://httpbin.org/get')
har = to_har(resp) # <--- magic
但用我的谷歌力量在网上找不到任何东西。
似乎所有数据都存在于Response
对象上,我希望我不需要实现整个 HAR 规范,并且存在一些我可以重用的代码/实用程序。
一个有效的答案可能会给出:现有库,或者如果到目前为止不存在python
和/或requests
,则引用起点。
目前,我对Response
对象的更简单的 3 分钟解决方案(不是 HAR 格式(序列化如下所示(如果不存在,可能是很好的起点(:
def resp2dict(resp, _root=True):
d = {
'text': resp.text,
'headers': dict(resp.headers),
'status_code': resp.status_code,
'request': {
'url': resp.request.url,
'method': resp.request.method,
'headers': dict(resp.request.headers),
},
}
if _root:
d['history'] = [resp2dict(h, False) for h in resp.history]
return d
我发布这个是因为我认为不仅我努力将Response
对象序列化为 JSON,无论 HAR 格式如何。
目前我更简单的 3 分钟解决方案(不是 HAR 格式(序列化为 Response 对象如下所示(如果不存在,可能是很好的起点(:
看起来这是最好的解决方案。我已经检查了 PyPI 上每个与 HAR 相关的库,我发现的唯一接近的解决方案(除了 har2requests(是 marshmallow-har。不幸的是,marshmallow_har.Response.__schema__
与内部结构不匹配,既不requests.Response
也不urllib3.response.HTTPResponse
。因此,我看到的解决方案是:
- 像以前一样使用临时解决方案。为了确保结果具有正确的结构,可以使用
marshmallow-har
。 - 通过向字段提供
attribute
参数来创建自己的棉花糖架构。我建议分叉和扩展marshmallow-har
但它使用工厂和其他奇怪的魔法,不容易扩展。因此,最好从零开始。
并考虑将您的解决方案开源:)
您可以从此项目中找到用python编写的工作解决方案https://github.com/scrapinghub/splash/blob/master/splash/har_builder.py
遵循此工作解决方案可能会为您提供所需的线索