使用 curl_cffi 发出 http 请求的时候,如果设置了 impersonate 参数,那么 curl_cffi 根据 impersonate 的值自动设置 ua,但是此时如何我们传入的请求 headers 里面也有 UA 呢?会用哪个?
让我们来验证一下吧
搭建一个测试用的服务端
from fastapi import FastAPI, Request
import uvicorn
app = FastAPI()
@app.get("/print-headers/")
async def print_headers(request: Request):
headers = dict(request.headers)
for key, value in headers.items():
print(f"{key}: {value}")
return {"headers": headers}
if __name__ == "__main__":
uvicorn.run(
app='server:app',
host="0.0.0.0",
port=8886,
workers=1,
reload=True
)
测试用的客户端
版本一:不带 impersonate 参数
from curl_cffi import requests
# 定义目标URL
url = "http://127.0.0.1:8886/print-headers"
# 发送GET请求
response = requests.get(url)
# 输出请求头内容
print("Response status code:", response.status_code)
print("Response headers:", response.headers)
print("Response text:", response.text)
服务端输出如下:
host: 127.0.0.1:8886
accept: */*
accept-encoding: gzip, deflate, br, zstd
可以看到此时是没有 UA 的
版本二:使用 impersonate 参数,并且不额外配置请求头中的 UA
from curl_cffi import requests
# 定义目标URL
url = "http://127.0.0.1:8886/print-headers"
# 发送GET请求
response = requests.get(url, impersonate='chrome120')
# 输出请求头内容
print("Response status code:", response.status_code)
print("Response headers:", response.headers)
print("Response text:", response.text)
服务端输出如下:
host: 127.0.0.1:8886
connection: Upgrade, HTTP2-Settings
upgrade: h2c
http2-settings: AAEAAQAAAAIAAAAAAAQAYAAAAAYABAAA
sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
版本三:使用 impersonate 参数,并且不额外配置请求头中的 UA
from curl_cffi import requests
# 定义目标URL
url = "http://127.0.0.1:8886/print-headers"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'sec-ch-ua-platform': '"Windows"',
'Referer': 'https://www.baidu.com/',
}
# 发送GET请求
response = requests.get(url, impersonate='chrome120',headers=headers)
# 输出请求头内容
print("Response status code:", response.status_code)
print("Response headers:", response.headers)
print("Response text:", response.text)
服务端输出如下:
host: 127.0.0.1:8886
connection: Upgrade, HTTP2-Settings
upgrade: h2c
http2-settings: AAEAAQAAAAIAAAAAAAQAYAAAAAYABAAA
sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
referer: https://www.baidu.com/
根据上面的结论
所以我们自己设置的请求头的参数会部分覆盖默认的参数
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。