【问题标题】:HTTP headers format using python's requests使用 python 请求的 HTTP 标头格式
【发布时间】:2019-05-09 18:56:29
【问题描述】:

我使用 python 请求来捕获网站的 http 标头。例如,这是一个响应头:

{'连接':'保持活动', '访问控制允许来源':'*','缓存控制':'max-age = 600', '内容类型': '文本/html; charset=utf-8', 'Expires': '星期五,4 月 19 日 2019 03:16:28 GMT', 'Via': '1.1 varnish, 1.1 varnish', 'X-ESI': 'on', 'Verso':'false','Accept-Ranges':'none','Date':'Fri, 19 Apr 2019 03:11:12 GMT','年龄':'283','Set-Cookie': 'CN_xid=08f66bff-4001-4173-b4e2-71ac31bb58d7;过期=2019 年 10 月 16 日,星期三 格林威治标准时间 03:11:12;路径=/;, xid1=1;过期=格林威治标准时间 2019 年 4 月 19 日星期五 03:11:27; 路径=/;,verso_bucket=281;过期=2020 年 4 月 18 日星期六 03:11:12 GMT; path=/;', 'X-Served-By': 'cache-iad2133-IAD, cache-gru17122-GRU', 'X-Cache':'HIT,MISS','X-Cache-Hits':'1, 0','X-Timer': 'S1555643472.999490,VS0,VE302', '内容安全策略': "default-src https: 数据: 'unsafe-inline' 'unsafe-eval'; child-src https:数据:blob:;连接-src https:数据:blob:;字体源 https: 数据:; img-src https:数据:blob:; media-src https: 数据: blob:; 对象源 https:;脚本-src https:数据:blob:'unsafe-inline' '不安全评估'; style-src https: '不安全的内联'; 阻止所有混合内容;升级不安全请求;报告-uri https://l.com/csp/gq", 'X-Fastly-Device-Detect':'桌面','Strict-Transport-Security': '最大年龄=7776000; preload', 'Vary': 'Accept-Encoding, Verso, 接受编码','内容编码':'gzip','传输编码': '分块'}

我注意到,从我测试的几个示例中,我从requests 收到的标头格式为'key':'value'(请注意键和值周围的单个冒号)。但是,当我从 Firefox-> Web 开发人员 -> Inspector 检查标头并选择以原始格式查看标头时,我看不到逗号:

HTTP/2.0 200 OK 日期:2019 年 5 月 9 日星期四 18:49:07 GMT 到期:-1 缓存控制:私有,最大年龄=0 内容类型:文本/html; charset=UTF-8 严格传输安全:max-age=31536000 内容编码:br 服务器:gws 内容长度:55844 x-xss-protection: 0 x-frame-options: SAMEORIGIN set-cookie: 1P_JAR=2019-05-09-18;过期=星期六,2019 年 6 月 8 日 18:49:07 GMT;路径=/; 域=.google.com alt-svc: quic=":443";马=2592000; v="46,44,43,39" X-Firefox-Spdy:h2

我需要知道:python 的requests 模块是否总是添加单冒号?这对我很重要,因为我需要在用于分析标头的正则表达式中包含/排除它们。

【问题讨论】:

    标签: python-3.x http request header python-requests


    【解决方案1】:

    我认为您遇到的问题是请求以dict 的形式返回,而不是 Firefox 检查员给您的值。执行此操作时,如果其中一个值对具有数字或布尔值,则可能会得到混合结果,因此在执行正则表达式时,如果可以删除外部撇号或仅使用给定的值,则可能需要使用 Try/Except。

    【讨论】:

    • 如果您真的想要引号,您可以发送s.replace("'", '"')(添加空格以显示差异)。在查找值时,尽管您可以使用 request['Connection'] 来获取您需要的值。
    【解决方案2】:

    添加冒号的不是请求模块。请求将标头表示为字典,但您似乎将它们视为字符串。当 Python 将 dict 转换为字符串时,它们会得到冒号、逗号、引号。

    您的程序的正确解决方法可能是将字典视为字典,而不是将其转换为字符串。但是如果你真的想要字符串形式的标题,你应该考虑使用不同的工具,比如 curl。

    【讨论】:

    • 标头位于数据库中的字符串字段内。所以我必须把它当作一个字符串。这是一个大问题吗?我想我可以考虑引号。
    • dict 字符串格式不适用于数据存储/交换。如果您将其存储在数据库中,最好先将其转换为 JSON。另外,请注意引号可能是单引号或双引号,具体取决于字符串的内容。
    • 事情很复杂。这是一个大数据。它已经在数据库中。除非没有解决方案,否则我宁愿不改变。我不明白将其转换为 json 会有什么帮助?在 csv 文件格式的文本文件中读取的标题,然后插入到数据库中。我总是可以假设每个键/值 ('|") 的开头和结尾都有一个单引号或双引号。然后正常线程它们里面的内容。你认为这样做有什么绝对错误的吗?
    • 转换为 JSON 会有所帮助,因为 JSON 旨在成为一种数据交换格式,因此它不会以不一致或令人惊讶的方式格式化事物。 JSON 具有广泛的语言支持,包括许多主要数据库,因此您可能可以针对 JSON 数据构建 SQL 查询。仅按原样使用 Python 输出的问题在于,您不能依赖它来获得一致的格式,因为这不是该输出格式的设计目的。
    猜你喜欢
    • 2019-01-08
    • 2012-06-05
    • 2010-11-23
    • 1970-01-01
    • 2017-10-07
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多