如何将请求响应对象序列化为 HAR



我想将请求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。因此,我看到的解决方案是:

  1. 像以前一样使用临时解决方案。为了确保结果具有正确的结构,可以使用marshmallow-har
  2. 通过向字段提供attribute参数来创建自己的棉花糖架构。我建议分叉和扩展marshmallow-har但它使用工厂和其他奇怪的魔法,不容易扩展。因此,最好从零开始。

并考虑将您的解决方案开源:)

您可以从此项目中找到用python编写的工作解决方案https://github.com/scrapinghub/splash/blob/master/splash/har_builder.py

遵循此工作解决方案可能会为您提供所需的线索

最新更新