本文介绍 HTTP 标头用户代理主题以及如何使用 Python 中的请求设置用户代理。 您将了解 HTTP 标头及其在理解用户代理、获取用户代理以及学习使用 Python 中的请求设置用户代理的多种方法方面的重要性。
每个 HTTP 请求和响应都包含一系列称为 HTTP 标头字段的字符串,由客户端应用程序和服务器发送和接收。 HTTP 标头允许将额外信息传输到服务器并让服务器发回该信息。
使用标头可以实现诸如在使用 API 时对自己进行身份验证或传达有关应用程序期望的信息类型的请求之类的事情。
让我们看一些 HTTP 标头的示例:
Cache-Control
:Cache-Control general-header 字段表示所有缓存系统必须遵循的指令。 HTTP 客户端或服务器可以使用 Cache-Control 通用标头来定义缓存参数或对特定类型的文档发出特定的缓存请求。提供了以逗号分隔的缓存指令列表。 例如:
Cache-Control : cache-request-directive|cache-response-directive
# OR
Cache-control: no-cache
Date
:无一例外,每个 HTTP 日期/时间戳都应始终以格林威治标准时间 (GMT) 表示。 HTTP 应用程序可以使用以下三种日期/时间戳表示形式中的任何一种:Sat, 22 Sep 2022 20:22:37 GMT ; RFC 822, updated by RFC 1123
Saturday, 22-Sep-22 20:23:37 GMT ; RFC 850, obsoleted by RFC 1036
Sat Sep 22 20:24:37 2022 ; ANSI C's asctime() format
User Agent
:它返回诸如浏览器版本和发送请求的计算机的系统操作系统等信息。 这是本文将特别关注的标题,说明如何使用请求设置用户代理。这些标头的大小写无关紧要,因为这些标头不区分大小写,因此短语 User-Agent
也可以写为 user-agent。
让我们看一个如何从 URL 打印标头的示例。 该程序向目标 URL 发送请求,从中获取所有标头,然后打印它们。
import requests
url = 'http://www.tutorialspoint.com/python'
headers = requests.get(url).headers
print(headers)
代码的第一行导入 Python 库包 requests。 创建一个对象变量 url,它存储请求应发送到的网站的 URL。
在变量 headers 中,request.get() 函数用于从 url 中获取标头,然后保存在变量中。 最后,打印可变标题。
这会打印给定 URL 的整个标题字典。
输出:
C:\python38\python.exe "C:/Users/Win 10/main.py"
{'Content-Encoding': 'gzip', 'Age': '1490828', 'Cache-Control': 'max-age=2592000', 'Content-Type': 'text/html; charset=UTF-8', 'Date': 'Sat, 24 Sep 2022 17:50:06 GMT', 'Expires': 'Mon, 24 Oct 2022 17:50:06 GMT', 'Last-Modified': 'Wed, 07 Sep 2022 11:42:58 GMT', 'Server': 'ECAcc (tir/CD76)', 'Strict-Transport-Security': 'max-age=63072000; includeSubdomains', 'Vary': 'Accept-Encoding', 'X-Cache': 'HIT', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-Version': 'June-1 V2', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '9299'}
Process finished with exit code 0
我们已经了解了如何使用 Python 获取整个标题字典。 在学习如何使用请求设置用户代理之前,了解本节很重要。
本节说明一个重要的接合点,它专门在 URL 的所有标头中调用用户代理并显示它。
由于用户代理返回浏览器和系统操作系统的数据,这在很大程度上取决于使用什么方法访问网站。 例如,网站 http://httpbin.org/user-agent 在使用不同的浏览器访问时会返回特定的用户代理数据。
当使用 Firefox 访问此 URL 时,用户代理设置为:
使用 Google Chrome 时,用户代理会根据它更改:
但是,当执行使用请求函数的 Python 脚本来获取用户代理时,URL 会返回请求的版本。
在下面的程序中,requests 函数用于获取显示与浏览器不同的结果的用户代理数据:
import requests
r = requests.get('http://httpbin.org/user-agent')
data = r.json()
print(data['user-agent'])
该 URL 返回所使用的 Python 脚本的请求版本。
输出:
C:\python38\python.exe "C:/Users/Win 10/main.py"
python-requests/2.28.1
Process finished with exit code 0
本节将解释如何在 Python 中使用请求添加自定义标头和设置用户代理。 本节介绍四种使用请求设置用户代理的不同方法。
如果系统运行的python版本运行requests 2.12或更老的版本,那么应该遵循这个方法:
第一个程序展示了如何获取默认标头,然后专门更新它以使用请求设置用户代理。
导入请求库包并在对象变量中设置 URL。 在可变标头中,存储库包请求将使用的默认标头的副本。
将默认标头替换为预期的自定义标头。 因为请求的源代码对默认标头有一个独特的 CaseInsensitiveDict 实现,所以字典变得不区分大小写。
创建一个变量响应,它以获取请求的 URL 为目标并获取 URL 的响应状态。 如果 URL 处于活动状态并正在运行,它会返回代码 - 200,并打印出来。
因为为user-agent设置了自定义的header,所以必须将response里面的数据转换成JSON,这样才能专门访问像user-agent这样的header。
变量响应的 JSON 数据存储在变量数据中。 该程序从数据中搜索用户代理,并打印使用请求的新设置的用户代理。
import requests
url = 'http://httpbin.org/user-agent'
headers = requests.utils.default_headers()
headers.update(
{
'User-Agent': 'My User Agent 1.0',
}
)
response = requests.get(url, headers=headers)
print(response)
data = response.json()
print(data['user-agent'])
输出:
C:\python38\python.exe "C:/Users/Win 10/main.py"
<Response [200]>
My User Agent 1.0
Process finished with exit code 0
较新版本的请求允许通过创建字典直接更新标头。 在此示例中,程序设置了两个标头 - user-agent 和 from。
两者都是得到更新的有效 HTTP 标头。
request.get()
的值保存在变量 response 内部,类似于上一个程序。 要检查 HTTP 标头用户代理是否正确更新,使用函数 default_user_agent();
此函数从 URL 中获取默认的用户代理值。
在变量 previous-agent 中,使用 requests 函数保存默认的用户代理。 使用语法 previous_agent = requests.utils.default_user_agent()
,打印该值。
我们发送的标头由函数 response.request.headers 访问,因此新更新的用户代理标头使用语法 updated_agent = response.request.headers['user-agent']
保存在变量 updated_agent 中,然后 它被打印出来。
创建一个新变量 all_headers 来检查所有标头,包括更新的标头。 它再次使用 response.request.headers 函数来存储使用请求的标头。
import requests
url = 'https://httpbin.org/get'
headers = {
'User-Agent': 'My User Agent 1.0',
'From': '[email protected]'
}
response = requests.get(url, headers=headers)
print(response)
previous_agent = requests.utils.default_user_agent()
print("Default user-agent header = ", previous_agent)
updated_agent = response.request.headers['user-agent']
print("Updated user-agent header = ", updated_agent)
all_headers = response.request.headers
print(all_headers)
输出:
C:\python38\python.exe "C:/Users/Win 10/main.py"
<Response [200]>
Default user-agent header = python-requests/2.28.1
Updated user-agent header = My User Agent 1.0
{'User-Agent': 'My User Agent 1.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'From': '[email protected]'}
Process finished with exit code 0
另一种使用请求设置用户代理的方法是像浏览器一样发送请求。 在下面的示例中,在标头变量中,用户代理字段使用浏览器类型的数据进行更新。
import requests
url = 'http://httpbin.org/user-agent'
headers = {'User-Agent': 'user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
'like Gecko) Chrome/105.0.0.0 Safari/537.36'}
response = requests.get(url.strip(), headers=headers, timeout=10)
previous_agent = requests.utils.default_user_agent()
print("Default user-agent header = ", previous_agent)
updated_agent = response.request.headers['user-agent']
print("Updated user-agent header = ", updated_agent)
输出:
C:\python38\python.exe "C:/Users/Win 10/main.py"
Default user-agent header = python-requests/2.28.1
Updated user-agent header = user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Process finished with exit code 0
另一种使用请求设置用户代理的简单方法是使用模块会话,这样就无需重复设置标头。
对象变量会话使用函数 requests.Session()
加载 URL 会话。 它类似于早期程序使用的 get 请求。
新的用户代理标头通过 session.headers.update()
函数更新。
然后,session.get()
函数从 URL 加载标头信息。 最后,打印 session.headers['user-agent'])
语法以使用请求获取设置的用户代理的更新信息。
import requests
session = requests.Session()
session.headers.update({'User-Agent': 'Custom user agent'})
session.get('https://httpbin.org/headers')
print(session.headers['user-agent'])
程序使用请求和会话设置用户代理后,它会打印会话中加载的更新标头。
输出:
C:\python38\python.exe "C:/Users/Win 10/main.py"
Custom user agent
Process finished with exit code 0
这篇文章已经彻底解释了如何使用请求设置用户代理以及如何获取它们。 阅读完本文后,读者可以轻松地在 Python 中使用 requests 设置 user-agent。