繁体   English   中英

如何在 python 中发送请求时删除“用户代理”header

[英]how to remove the "User-Agent" header when send request in python

我正在使用python 请求库,我需要在没有用户代理 header 的情况下发送请求。我发现了这个问题,但它是针对 Urllib2 的。

我正在尝试模拟一个 Android 应用程序,它在调用私有 API 时执行此操作。

我尝试按照以下代码将User-Agent设置为None ,但它不起作用。 它仍然发送User-Agent: python-requests/2.27.1

有什么办法吗?

headers = requests.utils.default_headers()
headers['User-Agent'] = None
requests.post(url, *args, headers=headers, **kwargs)

对于 urllib3 >= 1.26.0(也就是请求 >= 2.25.0),您可以使用urllib3.util.SKIP_HEADER来抑制User-AgentAccept-EncodingHost header。请参阅https://github.com/ psf/requests/issues/5671#issuecomment-1006735307示例和https://github.com/urllib3/urllib3/pull/2018上游更改。

PS:您可能希望使用 urllib3 >= 1.26.3 来避免垃圾邮件connection.py: BytesWarning: Comparison between bytes and string的小问题。 请参阅https://github.com/urllib3/urllib3/issues/2071

requests构建在urllib3库之上。 因此,当您将None User-Agent header 传递给请求的post方法时, urllib3设置自己的默认User-Agent

import requests

r = requests.post("https://httpbin.org/post", headers={
    "User-Agent": None,
})

print(r.json()["headers"]["User-Agent"])

Output

python-urllib3/1.26.7

这里是connection.py的urllib3源码

class HTTPConnection(_HTTPConnection, object):
    ...

    def request(self, method, url, body=None, headers=None):
        if headers is None:
            headers = {}
        else:
            # Avoid modifying the headers passed into .request()
            headers = headers.copy()
        if "user-agent" not in (six.ensure_str(k.lower()) for k in headers):
            headers["User-Agent"] = _get_default_user_agent()
        super(HTTPConnection, self).request(method, url, body=body, headers=headers) 

因此,您可以对其进行修补以禁用默认User-Agent header

import requests
from urllib3 import connection


def request(self, method, url, body=None, headers=None):
    if headers is None:
        headers = {}
    else:
        # Avoid modifying the headers passed into .request()
        headers = headers.copy()
    super(connection.HTTPConnection, self).request(method, url, body=body, headers=headers)

connection.HTTPConnection.request = request


r = requests.post("https://httpbin.org/post", headers={
    "User-Agent": None,
})

print(r.json()["headers"])

Output

{
'Accept': '*/*', 
'Accept-Encoding': 'gzip, deflate', 
'Content-Length': '0', 
'Host': 'httpbin.org', 
'X-Amzn-Trace-Id': 'Root=1-61f7b53b-26c4c8f6498c86a24ff05940'
}

此外,考虑提供类似浏览器的User-Agent ,例如Mozilla/5.0 (Macintosh; Intel Mac OS X 12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 也许它可以用更少的努力解决您的任务

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM