美文网首页
scrapy headers 修改Key为小写

scrapy headers 修改Key为小写

作者: 捉虫少年 | 来源:发表于2019-05-15 09:38 被阅读0次

    近期做项目遇到的问题,记录一下,也给踩这个坑的同学一点提示。

    该问题是在对合作商接口API进行爬取的时候,接口需要在headers里加入签名,key值必须是小写,不然接口无法正常调用。

    • 先尝试了一种方法,就是在Request里去改变headers,等不急的可以直接看最后
    class Request(object_ref):
    
        def __init__(self, url, callback=None, method='GET', headers=None, body=None,
                     cookies=None, meta=None, encoding='utf-8', priority=0,
                     dont_filter=False, errback=None, flags=None):
    
            ...
            self.headers = Headers(headers or {}, encoding=encoding) 
            ...
    

    进入Headers类

    class Headers(CaselessDict):
        """Case insensitive http headers dictionary"""
    
    ...
    
        def normkey(self, key):
            """Normalize key to bytes"""
            return self._tobytes(key.title())
    ...
    

    发现其在normkey这个函数里进行了转换,于是重写了Headers和Request类,执行爬虫发现并不能成功,在response里查看了request的headers,发现也是小写了,为什么不行。

    最有可能的是在请求发出后又修改成了默认的headers,使用了抓包工具验证,果然,这样思路就很清晰了。

    • scrapy是基于twisted的,所以需要在这里去修改,经过查找后发现了解决方法
    from twisted.web.http_headers import Headers as TwistedHeaders
    
    TwistedHeaders._caseMappings.update({
            b'sign': b'sign',   # 这里的key会去匹配headers里的key,value会把匹配成功的key值进行替换
            b'User-Agent': b'user-agent', 
    })
    

    使用这个方法就可以将需要修改的headers的key进行修改,并不会改变其它的key值,非常好用。

    相关文章

      网友评论

          本文标题:scrapy headers 修改Key为小写

          本文链接:https://www.haomeiwen.com/subject/kosuaqtx.html