概述
背景
在对接一些外部 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](https://file2.kaopuke.com:8081/files_image/2023061223/63d287145b895d65d3a5afbc055a4289.png)
可以看到源码中用Headers
类构建 headers,我们继续跳转到Headers
源码:
![65480cf3fcd525d3436c8baa7756a5cc.png](https://file2.kaopuke.com:8081/files_image/2023061223/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使用小写所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复