ValueError: Invalid header name b‘:authority‘

爬虫时,为了防止headers身份验证的限制,通常会将Chrome中的Request Headers拿过来转化成需要的headers的字典格式,直接上代码

s = '''
:method: POST
:scheme: https
accept: application/json
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
cache-control: no-cache
content-length: 97
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
'''

def get_headers(h_str):

    # 将字符串按行切割
    li = [header.strip() for header in h_str.splitlines() if header.strip()]
    # 将字符串按行分隔,并去掉将":"开头的字符的":"
    s_li = [i[1:] if i.startswith(':') else i for i in li]
    headers = {}
    # 将列表转换成headers格式
    for i in s_li:
        key, value = i.split(':', 1)
        # 去除复制过来request headers中的空格
        headers[key.strip()] = value.strip()

    return headers

注意上面有的headers是以’:'开头的,因为用的http协议不同,可以通过以下方式查看(图片中标红部分)

查看请求的procotol类型
如果没有protocol这一栏,通过右击请求,勾选查看即可
设置显示protocol信息
可以看到使用h2协议的请求request headers带有类似:method: GET格式
使用requests请求时,如果抓取的请求遵循的是h2,其headers可以有两种处理方式:
第一种直接将’:'除去,参考上面代码
第二种通过pip install hyper安装hyper模块,安装时如果速度过慢,可以使用国内镜像:
清华:https://pypi.tuna.tsinghua.edu.cn/simple
通过hyper的HTTP20Adapter类去解决

import requests
from hyper.contrib import HTTP20Adapter

headers = {
	':authority': 'h5.dianping.com',
	':method': 'POST',
	':scheme': 'https'
}
session = requests.session()
session.mount('http://www.dianping.com/', HTTP20Adapter())
resp = session.get('http://www.dianping.com/xxx',headers=headers)

两种方法都可以

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值