Python使用Selenium设置爬虫代理

如何通过Python使用Selenium设置爬虫代理

使用Selenium可以抓取动态网站,但是您的脚本可能会被检测为机器人并且您的 IP 被禁止。从好的方面来说,您可以使用 Selenium 代理来避免这一切。

什么是Selenium代理?

代理充当客户端和服务器之间的中介。通过它,客户端可以匿名和安全地向其他服务器发出请求,并避免地域限制。

无头浏览器支持像 HTTP 客户端这样的代理服务器。Selenium 代理有助于保护您的 IP 地址并避免在访问网站时被阻止。

继续阅读以了解如何在 Selenium 中设置代理以进行网络抓取!

准备工作

首先,您需要安装 Python 3。大多数平台默认都有它,因此您可以使用以下命令检查是否安装:

python --version

它应该返回这样的东西:

Python 3.11.2

如果出现错误或打印版本为2.x,则应下载Python 3.x并按照安装说明进行设置。

接下来,初始化一个新的 Python 项目并添加Selenium Python 绑定包

pip install selenium

Selenium 可以控制许多浏览器,但我们将使用 Google Chrome,因为它是最常用的浏览器。确保您安装了最新的 Chrome 版本

现在,将WebDriver Manager添加到您的项目中:

pip install webdriver-manager

这是一个简化驱动程序管理的 Python 包。详细来说,它可以让您免于每次升级 Chrome 时都下载新的 ChromeDriver 版本。

是时候使用您在 Python 脚本中安装的内容开始使用 Selenium 控制 Chrome 了。下面的代码片段导入工具,初始化ChromeWebDriver实例并使用它来访问示例目标页面。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get('https://example.com/')

您刚刚了解了如何在 Python 中开始使用 Selenium。让我们看看如何使用代理!

如何在 Selenium 中设置代理

要在 Selenium 中设置代理,您需要:

  1. 检索有效的代理服务器。
  2. 在 Chrome 选项中指定它--proxy-server
  3. 访问您的目标页面。

让我们一步步回顾整个过程。

首先,从Free Proxy List获取代理服务器 URL 。然后,配置 Selenium 以使用Options以下标志启动 Chrome --proxy-server

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

# define custom options for the Selenium driver
options = Options()
# free proxy server URL
proxy_server_url = "157.245.97.60"
options.add_argument(f'--proxy-server={proxy_server_url}')

# create the ChromeDriver instance with custom options
driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    options=options
)

Chrome 的受控实例现在将通过指定的代理执行所有请求。

接下来,导航到http://httpbin.org/ip作为目标站点:

driver.get('http://httpbin.org/ip')

注意:此站点将返回请求来自的 IP,这对于本示例来说很方便。

您可以像这样打印目标网页中包含的 JSON 值:

print(driver.find_element(By.TAG_NAME, "body").text)

把它们放在一起:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# define custom options for the Selenium driver
options = Options()
# free proxy server URL
proxy_server_url = "157.245.97.60"
options.add_argument(f'--proxy-server={proxy_server_url}')

# create the ChromeDriver instance with
# custom options
driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    options=options
)

# print the IP the request comes from 
print(driver.find_element(By.TAG_NAME, "body").text)

这是它将返回的内容:

{ "origin": "157.245.97.60" }

站点响应与代理服务器 IP 匹配。这意味着 Selenium 正在根据需要通过代理服务器访问页面。🥳

注意:免费代理是短暂且不可靠的,所以上面代码片段中使用的代理很可能不起作用。我们将在本教程后面看到一个更好的选择。

您现在了解了使用 Python Selenium 代理的基础知识。让我们深入研究更高级的概念!

使用 Python Selenium 进行代理身份验证:用户名和密码

一些代理服务器依靠身份验证来限制对具有有效凭据的用户的访问。商业解决方案或高级代理通常就是这种情况。

在经过身份验证的代理 URL 中指定用户名和密码的语法对于 Selenium 如下所示:

<PROXY_PROTOCOL>://<USERNAME>:<PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>

请注意,使用这样的 URL 是--proxy-server行不通的,因为 Chrome 驱动程序默认会忽略用户名和密码。这就是第三方插件(例如Selenium Wire )的用武之地。

它扩展了 Selenium,使您可以访问浏览器发出的请求并根据需要更改它们。启动下面的命令来安装它:

pip install selenium-wire

接下来,使用 Selenium Wire 处理代理身份验证,如下例所示:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

# Selenium Wire configuration to use a proxy
proxy_username = 'fgrlkbxt'
proxy_password = 'cs01nzezlfen'
seleniumwire_options = {
    'proxy': {
        'http': f'http://{proxy_username}:{proxy_password}@185.199.229.156:7492',
        'verify_ssl': False,
    },
}

driver = webdriver.Chrome(
    seleniumwire_options=seleniumwire_options
)
driver.get('http://httpbin.org/ip')
print(driver.find_element(By.TAG_NAME, 'body').text) # { "origin": "185.199.229.156" }

注意:此代码可能会导致407: Proxy Authentication Required error. 当凭据不正确时,代理服务器会以该 HTTP 状态进行响应,因此请确保代理 URL 包含有效的用户名和密码。

Selenium 代理的最佳协议:HTTP、HTTPS、SOCKS5

在为 Selenium 代理选择协议时,最常见的选项是 HTTP、HTTPS 和 SOCKS5。

HTTP 代理通过 Internet 发送数据,而 HTTPS 代理对其进行加密以提供额外的安全层。这就是为什么后者更受欢迎的原因。

Selenium 代理的另一个有用协议是 SOCKS5,也称为 SOCKS。它支持范围更广的网络流量,包括电子邮件和 FTP,这使其成为一种更加通用的协议。

总体而言,HTTP 和 HTTPS 代理适用于网络抓取和爬网,SOCKS 在涉及非 HTTP 流量的任务中找到应用程序。

Selenium Grid 中的“错误 403:禁止代理”

Selenium Grid允许您控制远程浏览器并并行运行跨平台脚本。您可能遇到的最常见的错误之一是Error 403: Forbidden for Proxy。发生这种情况有两个原因:

  1. 另一个进程已经在端口 4444 上运行。
  2. 您没有RemoteWebDriver向正确的 URL 发送请求。

默认情况下,Selenium 服务器集线器侦听http://localhost:4444. 因此,如果您有另一个进程在 4444 端口上运行,请结束它或使用另一个端口启动 Selenium Grid。

如果这不能解决问题,请确保将远程驱动程序连接到正确的中心 URL,如下所示:

import selenium.webdriver as webdriver
# ...
webdriver.Remote('http://localhost:4444/wd/hub', {})

通过 Python 在 Selenium 中使用旋转代理

如果您的脚本在短时间内发出多个请求,服务器可能会认为它可疑并阻止您的 IP。然而,这不会发生在轮换代理方法中,这是一种涉及在特定时间段或请求数量之后切换代理的技术。

您的最终 IP 将不断变化,使您每次都显示为不同的用户,从而防止服务器禁止您。这就是代理轮换的力量!

是时候学习如何使用selenium-wire.

首先,您必须找到一个代理池。在本例中,我们将使用一些免费代理。

将它们存储在一个数组中,如下所示:

PROXIES = [
    'http://19.151.94.248:88',
    'http://149.169.197.151:80',
    # ...
    'http://212.76.118.242:97'
]

然后,提取一个随机代理random.choice()并用它来初始化一个新的驱动程序实例:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import random

# the list of proxy to rotate on 
PROXIES = [
    'http://19.151.94.248:88',
    'http://149.169.197.151:80',
    # ...
    'http://212.76.118.242:97'
]

# randomly extract a proxy
random_proxy = random.choice(PROXIES)

# set the proxy in Selenium Wire
seleniumwire_options = {
    'proxy': {
        'http': f'{random_proxy}',
        'https': f'{random_proxy}',
        'verify_ssl': False,
    },
}

# create a ChromeDriver instance
driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options
)

driver.visit('https://example.com/')

# scraping logic...

driver.quit()

# visit other pages...

每次要访问新页面时重复此逻辑。

做得好!您构建了一个 Selenium 旋转代理。在我们关于如何在 Python 中轮换代理的权威指南中了解更多信息。

但是,大多数请求都会失败,因为免费代理很容易出错。这就是为什么您应该添加带有随机超时的重试逻辑。

但这不是唯一的问题。尝试针对使用反机器人技术的目标测试 IP 旋转器逻辑:

driver.visit('https://www.g2.com/products/asana/reviews')

输出:

medium_G2_access_denied_c25fa90864

目标服务器将旋转代理 Selenium 请求检测为机器人并响应错误403 Unauthorized

事实上,免费代理大多数时候会让你被封锁。我们使用它们来展示基础知识,但您永远不应该在真实世界的脚本中依赖它们。

哪个代理最适合 Selenium?

如上所示,免费代理是不可靠的,您应该更喜欢高级代理来进行网络抓取。如果您需要了解从哪里获得它们,请查看我们的最佳抓取代理提供商列表。

同时,高级代理并不是最终的解决方案。由于 Selenium 的自动化特性,反抓取技术可以检测并阻止它,即使它与高级代理一起使用也是如此。

避免被阻止的更好选择是 ZenRows。此抓取 API 提供与 Selenium 类似的功能,但成功率更高。与代理公司不同,ZenRows 只对成功的请求收费。这使它成为一种更便宜、更灵活的解决方案。此外,它还消除了设置和维护代理的基础设施难题。

要像在 Selenium 中那样抓取动态网站,您需要选中“JavaScript Rendering”选项。此外,您应该选择Premium Proxy最大匿名选项并避免IP封锁。接下来,选择右侧的Python语言和模式,然后单击“复制到剪贴板”按钮。

medium_Zen_Rows_Dashboard_6258dd6541

注意:通常也建议激活该Anti-bot功能。

现在,安装requests库:

pip install requests

然后,将 Python 代码粘贴到您的脚本中:

import requests

proxy = "http://<YOUR_ZENROWS_API_KEY>:[email protected]:8001"
proxies = {"http": proxy, "https": proxy}
response = requests.get("https://www.g2.com/products/asana/reviews", proxies=proxies, verify=False)
print(response.status_code)

这一次,代码片段将返回200,不再是403.

极好的!现在您有了一个具有 Selenium 功能的代理抓取解决方案,但效率更高!

结论

这个分步教程展示了如何使用 Python 在 Selenium 中设置代理。您从基础开始,已成为 Selenium Python 代理高手!

现在你知道了:

  • 什么是 Selenium 代理。
  • 在 Python 中使用 Selenium 设置代理的基础知识。
  • 如何在 Selenium 中处理经过身份验证的代理。
  • 如何实施轮换代理以及为什么这种方法不适用于免费代理。
  • 什么是高级代理以及如何使用它。

类似文章