HCLAB

Python 请求头header在http/http2下的问题.

2019-05-31  本文已影响2人  肉团先生

最近在爬虫,发现一个很特殊的请求头::authority, :method, :path, :scheme。几番操作,要不无法解析请求头,要不就是得不到正确的结果。历时至少一天了,整个搜索逻辑我也贴一下,蓝灯翻不了,用百度要死,每一个正确,搜索的内容答非所问,发现bing搜索可以代替一下谷歌。

搜索逻辑

在此圈粉bing搜索,还分国内和国际版:http://cn.bing.com

一般情况的请求头为http1的请求头,如下:


image.png

对应设置:

def getHeaders():
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest"
    }
    return headers

r=requests.post(url_search,data=playload,headers=getHeaders())

最近做爬虫,发现一个请求头如下:

image.png

我便按一般的设置,结果会爆一下的错误:

ValueError: Invalid header name b':authority'

经过一番的搜索(不要用百度,百度弱鸡,不能用谷歌,就用bing吧),在下面几处找到答案:
HTTP headers - Requests - Python

发现是源码无法解析的问题:

image.png

那你要重写源码?放心这个问题肯定有对应的库解决,果然需要使用:hyper来处理http2这类问题,结合requests的写法如下:

def getHeaders():
    headers = {
        ":authority": "xxx.com",
        ":method": "POST",
        ":path": "/search/keyWords/more",
        ":scheme": "https",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest"
    }
    return headers

from hyper.contrib import HTTP20Adapter

sessions=requests.session()
sessions.mount('https://xxxx.com', HTTP20Adapter())
r=sessions.post(url_search,data=playload,headers=getHeaders())

参考资料:

上一篇 下一篇

猜你喜欢

热点阅读