🥳加入Scrapeless 社区申请免费试用以访问我们强大的网页抓取工具包!
返回博客

在 Python 中使用 Selenium 代理

James Thompson
James Thompson

Scraping and Proxy Management Expert

12-Sep-2024

您是否因使用 Selenium 进行网页抓取而被识别为机器人?

可以理解。尽管 Selenium 是抓取动态网页的绝佳工具,但它本身无法抵御复杂的防机器人防御。您可以在 Selenium 爬虫中添加代理,以控制速率限制、避免地理位置限制并防止 IP 限制。

Selenium 代理:它是什么?

代理充当客户端和服务器之间的中介。通过使用它,客户端可以绕过地理位置限制并将匿名、安全的请求发送到其他服务器。

代理服务器可以像 HTTP 客户端一样被无头浏览器使用。在访问网站时,Selenium 代理有助于保护您的 IP 地址并绕过封禁。

支持代理的 Selenium 对浏览器自动化任务(如网站抓取和测试)非常有用。要了解如何在 Selenium 中设置代理以进行网页抓取,请继续阅读!

如何配置 Selenium 代理

以下代码行加载了一个无头 Chrome 驱动程序并导航到 httpbin,一个提供客户端 IP 地址的网站。脚本最后会打印 HTML 答案。

language Copy
# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

# 设置 Chrome 选项以无头模式运行
options = Options()
options.add_argument("--headless=new")

# 初始化 Chrome 驱动程序
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()), 
    options=options
)

# 导航到目标网页
driver.get("https://httpbin.io/ip")

# 打印目标网页的 HTML
print(driver.page_source)

# 释放资源并关闭浏览器
driver.quit()

代码将打印以下 HTML:

language Copy
<html><head><meta name="color-scheme" content="light dark"><meta charset="utf-8"></head><body><pre>{
  "origin": "50.217.226.40:80"
}
</pre><div class="json-formatter-container"></div></body></html>

在 Selenium 中,要设置代理,您必须:

  • 获取一个可靠的代理服务器
  • 将其输入 Chrome 选项的 --proxy-server 字段
  • 访问您要访问的页面。

首先,访问 Free Proxy List 网站获取一个免费的代理地址。使用 Options 设置 Selenium,以便使用代理打开 Chrome。之后,打印目标网页的正文内容。

language Copy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# 定义代理地址和端口
proxy = "20.235.159.154:80"

# 设置 Chrome 选项以使用代理无头模式运行
options = Options()
options.add_argument("--headless=new")
options.add_argument(f"--proxy-server={proxy}")

# 初始化 Chrome 驱动程序
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# 导航到目标网页
driver.get("https://httpbin.io/ip")

# 打印目标网页的正文内容
print(driver.find_element(By.TAG_NAME, "body").text)

# 释放资源并关闭浏览器
driver.quit()

现在,受控的 Chrome 实例发出的所有请求都将通过指定的代理路由。

代理服务器 IP 和网站响应匹配。这表明 Selenium 正在使用代理服务器来查看网站。

Selenium 中的代理身份验证

某些代理服务器使用身份验证来防止没有合法凭据的用户访问其服务器。在使用高级代理或商业解决方案时,通常是这种情况。

以下是在经过身份验证的代理 URL 中提供用户名和密码的 Selenium 语法:

language Copy
<PROXY_PROTOCOL>://<YOUR_USERNAME>:<YOUR_PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>

但是,由于 Chrome 驱动程序默认情况下会忽略用户名和密码,因此在 --proxy-server 中输入 URL 不会起作用。这种情况可以使用 Selenium Wire 等第三方插件来解决。

借助 Selenium Wire,您可以根据需要修改浏览器请求并访问请求本身。要安装它,请使用以下命令:

language Copy
pip install blinker==1.7.0 selenium-wire

要处理代理身份验证,请使用 Selenium Wire,如下所示:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# 配置代理
proxy_username = "<YOUR_USERNAME>"
proxy_password = "<YOUR_PASSWORD>"
proxy_address = "20.235.159.154"
proxy_port = "80"

# 使用身份验证构建代理 URL


```python
proxy_url = f"http://{proxy_username}:{proxy_password}@{proxy_address}:{proxy_port}"

# 设置 selenium-wire 选项以使用代理
seleniumwire_options = {
    "proxy": {
        "http": proxy_url,
        "https": proxy_url
    },
}

# 设置 Chrome 选项以无头模式运行
options = Options()
options.add_argument("--headless=new")

# 使用服务、selenium-wire 选项和 chrome 选项初始化 Chrome 驱动程序
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# 导航到目标网页
driver.get("https://httpbin.io/ip")

# 打印目标网页的正文内容
print(driver.find_element(By.TAG_NAME, "body").text)

# 释放资源并关闭浏览器
driver.quit()

您是否厌倦了持续的网页抓取阻止?

Scrapeless:最好的在线抓取一体化解决方案!

使用我们的智能、高性能代理轮换保持匿名并避免基于 IP 的封禁:

免费试用!

最佳 Selenium 代理协议

选择 Selenium 代理协议的最流行的替代方案是 HTTP、HTTPS 和 SOCKS5。

与 HTTP 代理相比,HTTPS 代理通过对它们在互联网上传输的数据进行加密来增加额外的安全性。因此,后者更受青睐且更安全。

SoCKS5 或 SOCKS 是 Selenium 代理的另一个有用的协议。它是一个更灵活的协议,因为它可以处理更多种类的在线流量,例如电子邮件和文件传输协议。

综合考虑,网页抓取和爬取从 HTTP 和 HTTPS 代理中受益匪浅,而非 HTTP 流量任务适合使用 SOCKS。

在 Python 中使用旋转代理进行 Selenium

如果您的脚本在很短的时间内发送了多个查询,服务器可能会将其标记为可疑并封锁您的 IP。当您尝试使用特定 IP 地址时,您的抓取数据成功率较低,因为网站可能会识别并阻止来自这些地址的请求。

但是,这个问题可以通过使用旋转代理策略来解决。随着时间的推移或请求次数的增加,您的最终 IP 将不断变化,因为您会不断更改代理。这使您每次都看起来像一个不同的用户,从而防止服务器封锁您。

让我们看看如何使用 selenium-wire 在 Selenium 中创建一个代理轮换器。

首先需要建立一个代理池。在本例中,我们将使用一些免费代理。

将它们放在数组中,如下所示:

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

接下来,使用 random.choice() 提取一个随机代理,然后可以使用它来启动驱动程序的新实例。这是您完成的代码的样子:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

import random

# 要轮换的代理列表
PROXIES = [
    "http://20.235.159.154:80",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

# 随机选择一个代理
proxy = random.choice(PROXIES)

# 设置 selenium-wire 选项以使用代理
seleniumwire_options = {
    "proxy": {
        "http": proxy,
        "https": proxy
    },
}

# 设置 Chrome 选项以无头模式运行
options = Options()
options.add_argument("--headless=new")

# 使用服务、selenium-wire 选项和 chrome 选项初始化 Chrome 驱动程序
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# 导航到目标网页
driver.get("https://httpbin.io/ip")

# 打印目标网页的正文内容
print(driver.find_element(By.TAG_NAME, "body").text)

# 释放资源并关闭浏览器
driver.quit()

实际上,使用免费代理通常会导致封锁。虽然我们使用它们来说明基本原理,但您永远不应该将它们用于实际项目。

Selenium Grid 的错误 403:代理被禁止

Selenium Grid 使跨平台脚本的并行执行和远程浏览器控制成为可能。但是,如果您使用它,您可能会在网页抓取过程中遇到最常见的问题之一:错误 403:代理被禁止。出现这种情况有两个原因:

  • 端口 4444 正在被另一个进程使用。
  • 您的 RemoteWebDriver 请求没有收到正确的 URL。
    如果问题仍然存在,请确保将远程驱动程序连接到正确的集线器 URL,如下所示:
language Copy
import selenium.webdriver as webdriver
# ...
webdriver.Remote('http://localhost:4444/wd/hub', {})

结论

代理服务器可以帮助绕过反机器人检测系统,但它们需要大量人工维护,而且并不总是可靠。使用网页抓取 API,例如 Scrapeless,可以可靠地绕过任何反机器人措施,并省去您查找和设置代理的麻烦。免费试用 Scrapeless!

在Scrapeless,我们仅访问公开数据,同时严格遵守适用的法律、法规和网站隐私政策。 本博客内容仅用于演示目的,不涉及任何非法或侵权行为。 对于使用本博客或第三方链接的信息,我们不做任何保证,也不承担任何责任。 在参与任何抓取活动之前,请咨询您的法律顾问并查看目标网站的服务条款或获取必要的权限。

最受欢迎的文章

目录