我是靠谱客的博主 文艺柠檬,最近开发中收集的这篇文章主要介绍fastjson 大写转小写 字段_scrapy中headers的key使用小写,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景

在对接一些外部 API 时,有时会遇到要求 Request Headers 中的某个字段,key 值必须是小写才能正常调用,而在 scrapy 中,默认所有 headers 的 key 都类似b'User-Agent'这种形式,我希望对代码进行少量改动达到正常调用此类接口的目的。

解决方案(分析过程在后面)

在 scrapy 项目中添加以下代码:

from twisted.web.http_headers import Headers as TwistedHeaders

TwistedHeaders._caseMappings.update({
    # b'headers对应key的小写': b'期望结果的小写'
    b'accept-language': b'accept-language',
    b'user-agent': b'user-agent',
    b'content-type': b'content-type',
    # ...继续添加你想要映射的字段...
})

注意:1. 对于添加代码的位置,网上有些文章说需要在import scrapy之前或Spider类之前,实际上只要你喜欢,你可以在项目中的settings.py/middlewares.py/pipelines.py/spider文件等任意 python 文件中的任意位置添加,一般我们放在文件顶部即可。2. 查看最终效果需要在抓包工具中查看。

简单分析过程

此处使用scrapy.Request()发送 POST 请求,我们看看源码中关于 headers 构建部分:

小技巧:IDE中一般都有直接跳转查看源码功能,我这里用 vscode,鼠标在对应位置右键,选择Go To Definition,或者直接用默认快捷键F12,记得 pycharm 的快捷键是Ctrl+B,具体请自行百度。

63d287145b895d65d3a5afbc055a4289.png

可以看到源码中用Headers类构建 headers,我们继续跳转到Headers源码:

65480cf3fcd525d3436c8baa7756a5cc.png

可以看到,normkey方法中使用key.title()将所有 key 都变成首字母大写如User-Agent形式。

当我尝试重写Headers类和Request类后,response.request.headers看到的 key 确实能改变为小写,但是依然无法调用接口成功。

没有新思路,谷歌搜了一下,看到一篇文章提到这个问题是 scrapy 底层用的 twisted 框架导致的,我马上用 fiddler 抓包工具验证,果然,request headers 所有 key 依然还是大写。

找到问题根源就好解决了,就如上面解决方案一样,在 twisted 构建 headers 的类中,维护了一个映射字典_caseMappings,原本用途是将一些小写 key 映射为符合 HTTP 规范的 key,我们可以将自己期望的 key 添加进去,强制映射为小写即可。

最后

以上就是文艺柠檬为你收集整理的fastjson 大写转小写 字段_scrapy中headers的key使用小写的全部内容,希望文章能够帮你解决fastjson 大写转小写 字段_scrapy中headers的key使用小写所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部