如何在Python中使用请求设置用户代理

如何在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 之间轮换。这是一个分步示例:

  1. 导入random
import random
  1. 创建一个包含要轮换的用户代理的数组。
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'
]
  1. 创建字典,设置random.choice()为 User-Agent 字符串。
headers = {'User-Agent': random.choice(user_agents)}
  1. 在您的请求中包含随机 UA 字符串。
response = requests.get('https://www.example.com', headers=headers)
  1. 使用 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"
  }
}
 
// ...

但是,这适用于少数请求。让我们看看如何大规模地进行网络抓取。

如何轮换无限假用户代理

如何想出一个巨大的真实用户代理列表?如果您创建一些指示矛盾信息、遗漏信息或包含过时软件版本的信息,您的流量可能会被阻止。此外,标题的顺序很重要。

网站有可疑标头和相关组件的数据库。此外,您还必须应对其他反抓取挑战,例如验证码、用户行为分析等。

  1. 注册zenrows以获取免费的 API 密钥。

medium_Zenrows_Dashboard_e44bdcba1c

  1. 在您的脚本中,设置您的目标 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,
}) 
  1. 这是你的完整代码应该是这样的:
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

  1. 从创建一个Session对象开始。
session = requests.Session()
  1. 然后,在标题中设置用户代理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'})
  1. 最后,请使用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 网络抓取库更改用户代理标头。两个流行的工具是 aiohttp 和 HTTPX。

HTTPX 是一个高性能的同步和异步 HTTP 客户端,而 aiohttp 是一个用于发出异步请求的库。

让我们探讨如何使用这两个库完成工作。

使用 aiohttp 的用户代理

这些是使用 aiohttp 设置自定义用户代理所需的步骤:

  1. 使用以下命令安装库:
pip install aiohttp
  1. 在标头字典中指定您的 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'
}
  1. 将标头字典作为参数传递给客户端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 设置用户代理的替代方法:

  1. 与 aiohttp 一样,安装 HTTPX。
pip install httpx
  1. 创建包含您的用户代理的标头字典。
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'
}
  1. 创建一个新的 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 中伪造和轮换用户代理:

  1. 安装 HTTP Python 库,例如 Requests、aiohttp 或 HTTPX。
  2. 导入安装的库和random模块。
  3. 创建一组用户代理以供选择。
  4. random.choice()使用从列表中选择一个用户代理的方法创建一个标题字典。
  5. 将字典传递到请求的标头属性中。

类似文章