Skip to content
Intermediate / 2 min read

如何在Python中使用Selenium配合IPRoyal轮换住宅代理进行网页抓取

一份将IPRoyal住宅代理与Python中的Selenium WebDriver集成的实用指南,包括认证、轮换和故障排除。

SOCKS5 HTTP(S) 网页抓取

概述

Selenium 是一款流行的浏览器自动化工具,但大规模抓取通常需要轮换 IP 地址以避免被封禁。IPRoyal 的住宅代理网络提供了大量 IP 和灵活的轮换选项。本教程将向您展示如何使用 Python 将 Selenium 连接到 IPRoyal 住宅代理,处理身份验证,并在请求之间轮换 IP。

由于 Selenium 并非在所有驱动程序中原生支持代理认证,我们将使用 selenium-wire 包,它扩展了 Selenium 并干净地处理代理凭据。下面的示例使用 Chrome,但相同的方法也适用于 Selenium 支持的其他浏览器。

先决条件

  • Python 3.8 或更高版本
  • 拥有住宅代理凭据的 IPRoyal 账户
  • 基本熟悉 Python 和 Selenium
  • 已安装 Chrome 浏览器和 ChromeDriver(或其他浏览器驱动程序)

第 1 步:收集您的 IPRoyal 代理凭据

登录到您的 IPRoyal 仪表板,找到住宅代理端点详细信息。您需要:

  • 代理主机(例如 geo.iproyal.com 或仪表板中显示的主机)
  • 端口号
  • 用户名
  • 密码

IPRoyal 住宅代理通常提供轮换和粘性会话。对于轮换会话,每个请求(或每个新的浏览器会话)可以使用不同的 IP。对于粘性会话,您可以通过在用户名中使用会话标识符来在一段时间内保持相同的 IP。请查看您的仪表板以获取确切格式——通常您会在用户名后附加会话 ID,例如 yourusername-session-abc123。

第 2 步:安装 Selenium 和 selenium-wire

使用 pip 安装所需的包:

pip install selenium selenium-wire

确保 ChromeDriver 版本与您安装的 Chrome 版本匹配。您可以从 Chrome for Testing 页面下载 ChromeDriver,或使用像 webdriver-manager 这样的管理器。

第 3 步:配置 Selenium 以使用 IPRoyal 代理认证

创建一个 Python 脚本,使用您的 IPRoyal 代理凭据设置 Selenium Wire 驱动程序。将占位符替换为您的实际值。

from seleniumwire import webdriver

# 替换为您的 IPRoyal 代理详细信息
proxy_user = "your_username"
proxy_pass = "your_password"
proxy_host = "your-iproyal-host"
proxy_port = "your_port"

# 构建代理 URL
proxy_url = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"

# 配置 Selenium Wire 代理选项
proxy_options = {
    'proxy': {
        'http': proxy_url,
        'https': proxy_url,
        'no_proxy': 'localhost,127.0.0.1'
    }
}

# 使用 Selenium Wire 启动 Chrome
driver = webdriver.Chrome(seleniumwire_options=proxy_options)

try:
    driver.get("https://httpbin.org/ip")
    print(driver.find_element("tag name", "body").text)
finally:
    driver.quit()

运行脚本。如果代理工作正常,您应该会看到一个属于 IPRoyal 网络的 IP 地址,而不是您的真实 IP。

第 4 步:在请求之间轮换 IP

使用 IPRoyal 住宅代理轮换 IP 有两种常见方法:

  1. 轮换端点:为每个请求使用相同的主机和端口。代理会自动为每个连接分配一个新的 IP。这是无状态抓取的最简单方法。
  2. 带有会话 ID 的粘性会话:将唯一的会话 ID 附加到您的用户名(例如 yourusername-session-abc123)。使用该会话 ID 的所有请求将使用相同的 IP,直到会话过期或您更改 ID。这对于多步骤流程(如登录然后抓取数据)很有用。

要在 Selenium 中手动轮换 IP,您可以为每个抓取任务创建一个具有不同会话 ID 的新驱动程序实例。以下是一个循环遍历会话 ID 列表的示例:

import time
from seleniumwire import webdriver

base_username = "your_username"
base_password = "your_password"
proxy_host = "your-iproyal-host"
proxy_port = "your_port"

session_ids = ["session1", "session2", "session3"]

for session_id in session_ids:
    # 使用会话 ID 构造用户名(根据 IPRoyal 文档调整语法)
    username = f"{base_username}-session-{session_id}"
    proxy_url = f"http://{username}:{base_password}@{proxy_host}:{proxy_port}"

    proxy_options = {
        'proxy': {
            'http': proxy_url,
            'https': proxy_url,
            'no_proxy': 'localhost,127.0.0.1'
        }
    }

    driver = webdriver.Chrome(seleniumwire_options=proxy_options)
    try:
        driver.get("https://httpbin.org/ip")
        print(f"Session {session_id}:", driver.find_element("tag name", "body").text)
    finally:
        driver.quit()
    time.sleep(1)

如果 IPRoyal 提供了一个每次请求都会更改 IP 的轮换端点,您可以跳过会话 ID 逻辑并重用相同的凭据。请在您的仪表板中验证行为。

第 5 步:处理地理定位和粘性会话

IPRoyal 住宅代理支持国家和城市定位。您通常可以通过在用户名中添加国家代码或使用专用端点来指定位置。例如,许多提供商使用类似 yourusername-country-us 的用户名格式。请查看您的 IPRoyal 仪表板以获取确切语法。

要为多步骤抓取(例如,添加到购物车,然后结账)保持粘性会话,请在所有操作中使用单个会话 ID,并保持相同的驱动程序实例打开。更改驱动程序或会话 ID 将导致不同的 IP。

第 6 步:验证代理并处理错误

始终验证您的请求是否通过代理。一个简单的检查是访问 https://httpbin.org/ip 或 https://ipinfo.io/ip,并确认 IP 不是您自己的。如果您需要检查标头,Selenium Wire 允许您访问请求和响应对象:

for request in driver.requests:
    if request.response:
        print(request.url, request.response.status_code)

故障排除

问题 可能原因 修复
407 需要代理认证 用户名/密码不正确或特殊字符未进行 URL 编码 对用户名/密码中的特殊字符进行 URL 编码(例如,@ 变为 %40)。在您的 IPRoyal 仪表板中验证凭据。
连接超时 主机/端口错误或防火墙阻止 仔细检查主机和端口。如果 IPRoyal 提供替代端口,请尝试不同的端口。确保您的防火墙允许出站连接。
IP 未更改 使用粘性会话 ID 或缓存连接 使用轮换端点或更改会话 ID。关闭驱动程序并打开一个新的。
启动时 WebDriver 错误 ChromeDriver 版本不匹配 更新 ChromeDriver 以匹配您的 Chrome 版本。
SSL 错误 代理未正确处理 HTTPS 确保在代理 URL 中使用 http://,即使对于 HTTPS 网站(代理会隧道 HTTPS)。

总结

在本教程中,您学习了如何使用 selenium-wire 进行身份验证,将 IPRoyal 住宅代理与 Python 中的 Selenium 集成。您配置了单个代理,通过粘性会话 ID 实现了轮换,并验证了设置。请记住,对于大批量抓取使用轮换端点,对于多步骤工作流使用粘性会话。在运行大型任务之前,始终测试您的代理连接,并参考您的 IPRoyal 仪表板以获取确切的端点格式和会话参数。