如何在Python中使用请求设置用户代理
您是否曾经尝试过使用 Python Requests 库进行网络抓取,结果却被您的目标网站阻止了?你不是一个人!用户代理 (UA) 字符串是网站检测中最关键的因素之一,因为它就像识别客户端的指纹,因此很容易将您暴露为机器人。
但是,您可以通过在 Python Requests 中随机化用户代理来低调地获取所需的数据。您将在本教程中学习如何大规模地执行此操作。
什么是 Python 请求中的用户代理
用户代理是与每个 HTTP 请求一起发送的 HTTP 标头的关键组件。
这些标头包含服务器用于定制其响应的信息,例如首选内容格式和语言。此外,UA 标头告诉 Web 服务器什么操作系统和浏览器正在发出请求,等等。
例如,Google Chrome 浏览器可能有以下字符串:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
它共享请求者使用 Mozilla 产品令牌,AppleWebKit 作为其 537.36 版本的渲染引擎,在 64 位 Windows 10 上运行,显示与 Firefox 和 Konqueror 渲染引擎的兼容性,作为浏览器的 Google Chrome 111,并且具有 Safari 兼容性.
同样,这里有一个 Firefox UA 的例子:
Mozilla/5.0 (X11; Linux i686; rv:110.0) Gecko/20100101 Firefox/110.0.
接下来你会看到一个移动 UA:
Mozilla/5.0 (iPhone; CPU iPhone OS 15_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'
您的 Python Request 网络抓取工具被拒绝访问,因为它的默认 UA 尖叫着“我是一个机器人”。让我们看看如何!
以下脚本向 发送 HTTP 请求http://httpbin.org/headers
。
import requests response = requests.get('http://httpbin.org/headers') print(response.status_code) print(response.text)
由于 HTTPBin 是一个 API,它会将请求的默认标头生成为 HTML 内容。所以,上面的代码带来了这个结果:
200 { "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.28.2", "X-Amzn-Trace-Id": "Root=1-64107531-3d822dab0eca3d0a07faa819" } }
查看 User-Agent 字符串python-requests/2.28.2
,您会同意任何网站都可以判断它不是来自实际浏览器。这就是为什么您必须为 Python 请求指定一个自定义且格式良好的用户代理。
使用 Python 请求设置用户代理
要设置 Python 请求用户代理,请在您的请求配置中传递一个包含新字符串的字典。
首先导入 Python Requests 库,然后创建一个包含新用户代理的 HTTP 标头字典,并使用您指定的 User-Agent 字符串发送请求。最后一步是打印响应。
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'} response = requests.get('http://httpbin.org/headers', headers=headers) print(response.status_code) print(response.text)**Bold**
注意:您可以在我们的另一篇文章中找到一些用于网络抓取的格式良好的 用户代理。
如果你得到类似于下面例子的结果,你就成功地伪造了你的用户代理。
200 { "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-6410831d-666f197b78c8e97a3013bea9" } }
对 Python 请求使用随机用户代理
您需要在 Python 请求中使用随机用户代理以避免被阻止,因为它有助于识别您。
您可以使用该random.choice()
方法在 UA 之间轮换。这是一个分步示例:
- 导入
random
。
import random
- 创建一个包含要轮换的用户代理的数组。
user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15' ]
- 创建字典,设置
random.choice()
为 User-Agent 字符串。
headers = {'User-Agent': random.choice(user_agents)}
- 在您的请求中包含随机 UA 字符串。
response = requests.get('https://www.example.com', headers=headers)
- 使用 for 循环为多个请求重复步骤 3 和 4。
for i in range(7): headers = {'User-Agent': random.choice(user_agents)} response = requests.get('https://www.example.com', headers=headers) print(response.headers)
将它们放在一起,您的完整代码将如下所示:
import requests import random user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15' ] for i in range(7): headers = {'User-Agent': random.choice(user_agents)} response = requests.get('http://httpbin.org/headers', headers=headers) print(response.text)
结果如下:
{ "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-64109cab-38fc3e707383ccc92fda9034" } } { "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15", "X-Amzn-Trace-Id": "Root=1-64109cac-3971637b5318a6f87c673747" } } { "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-64109cac-42301391639825ca0497d9a3" } } // ...
但是,这适用于少数请求。让我们看看如何大规模地进行网络抓取。
如何轮换无限假用户代理
如何想出一个巨大的真实用户代理列表?如果您创建一些指示矛盾信息、遗漏信息或包含过时软件版本的信息,您的流量可能会被阻止。此外,标题的顺序很重要。
网站有可疑标头和相关组件的数据库。此外,您还必须应对其他反抓取挑战,例如验证码、用户行为分析等。
- 注册zenrows以获取免费的 API 密钥。
- 在您的脚本中,设置您的目标 URL、API 密钥和 ZenRows 基本 URL。
url = "http://httpbin.org/headers" # ... your URL here apikey = "Your_API_key" zenrows_api_base = "https://api.zenrows.com/v1/"
3. 使用所需的 ZenRows 参数提出您的请求。例如,要绕过反机器人措施,请添加参数antibot
(此外,高级代理和 JavaScript 渲染会有所帮助)。
response = requests.get(zenrows_api_base, params={ "apikey": apikey, "url": url, "antibot": True, })
- 这是你的完整代码应该是这样的:
import requests url = "http://httpbin.org/headers" # ... your URL here apikey = "Your_API Key" zenrows_api_base = "https://api.zenrows.com/v1/" response = requests.get(zenrows_api_base, params={ "apikey": apikey, "url": url, "antibot": True, }) print(response.text) # pages's HTML
从现在开始,您将不再需要担心您的用户代理使用 Python 请求。
使用会话设置用户代理的选项
另一种指定自定义标头的方法是使用 Python Requests 库Session
对象。当您希望为特定网站的每个请求保持一致的标头时,它特别有用。
以下是使用该对象设置用户代理的方法Session
:
- 从创建一个
Session
对象开始。
session = requests.Session()
- 然后,在标题中设置用户代理
Session
。
session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'})
- 最后,请使用
Session
.
response = session.get('http://httpbin.org/headers')
这是我们的完整代码:
import requests session = requests.Session() session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}) response = session.get('http://httpbin.org/headers') # print response print(response.content)
你的结果应该是这样的:
{ "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-6410bb12-31fe62664c156c98547c1fd8" } }
恭喜,您已经学会了一种设置用户代理的新方法。
Python 中的浏览器用户代理:如何在流行的库中进行更改
与请求一样,您可以使用其他Python 网络抓取库更改用户代理标头。两个流行的工具是 aiohttp 和 HTTPX。
HTTPX 是一个高性能的同步和异步 HTTP 客户端,而 aiohttp 是一个用于发出异步请求的库。
让我们探讨如何使用这两个库完成工作。
使用 aiohttp 的用户代理
这些是使用 aiohttp 设置自定义用户代理所需的步骤:
- 使用以下命令安装库:
pip install aiohttp
- 在标头字典中指定您的 UA。
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' }
- 将标头字典作为参数传递给客户端
Session
对象。
async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/headers', headers=headers) as response: print(await response.text())
您的完整代码应如下所示:
import aiohttp headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' } async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/headers', headers=headers) as response: print(await response.text())
要轮换用户代理,请创建一个数组并使用该random.choice()
方法,就像在 Python 请求中一样。这样,您的代码将如下所示:
import aiohttp import random user_agents = [ YOUR_USER_AGENT_LIST ] headers = { 'User-Agent': random.choice(user_agents) } async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/headers', headers=headers) as response: print(await response.text())
使用 HTTPX 的用户代理
下面是使用 HTTPX 设置用户代理的替代方法:
- 与 aiohttp 一样,安装 HTTPX。
pip install httpx
- 创建包含您的用户代理的标头字典。
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' }
- 创建一个新的 HTTPX 客户端实例并将标头字典作为参数传递。
async with httpx.AsyncClient() as client: response = await client.get('http://httpbin.org/headers', headers=headers)
将它们放在一起,这是您的完整代码:
import httpx headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' } async with httpx.AsyncClient() as client: response = await client.get('http://httpbin.org/headers', headers=headers) print(response.text)
要轮换 UA,请创建一个列表并使用与random.choice()
上一个示例中类似的方法。
import httpx import random user_agents = [ YOUR_USER_AGENT_LIST ] headers = { 'User-Agent': random.choice(user_agents) } async with httpx.AsyncClient() as client: response = await client.get('https://www.example.com', headers=headers) print(response.text)
常见问题
Python 中请求的默认用户代理是什么?
Python 的默认请求用户代理是Python-requests/x.y.z
,其中x.y.z
代表请求的版本。例如,python-requests/2.28.2
。
如何在 Python 中伪造用户代理?
要在 Python 中伪造用户代理,您需要在标头字典中指定一个新的用户代理,然后将其作为请求中的参数传递。
你如何在 Python 3 中伪造和轮换用户代理?
按照以下步骤在 Python 3 中伪造和轮换用户代理:
- 安装 HTTP Python 库,例如 Requests、aiohttp 或 HTTPX。
- 导入安装的库和
random
模块。 - 创建一组用户代理以供选择。
random.choice()
使用从列表中选择一个用户代理的方法创建一个标题字典。- 将字典传递到请求的标头属性中。