You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium浏览器IP轮换方案咨询:Python定时访问需每次更换IP

嘿,针对你每30秒换IP访问网站的需求,我整理了几个从高效到备选的方案,还有你问到的具体实现细节:

一、最省时高效的首选方案:Tor + Selenium(适合AWS EC2 Ubuntu环境)

免费、无需额外付费,而且IP更换逻辑成熟稳定,完全满足你每30秒换IP的需求。下面是Ubuntu服务器上的完整配置步骤:

1. 安装Tor、Firefox和依赖

登录你的EC2 Ubuntu实例,执行以下命令:

# 更新系统包
sudo apt update && sudo apt upgrade -y
# 安装Tor和控制工具
sudo apt install tor -y
# 安装Firefox和geckodriver(Selenium需要)
sudo apt install firefox firefox-geckodriver -y
# 安装Python依赖
sudo apt install python3-pip -y
pip3 install selenium stem requests

2. 配置Tor允许远程控制

编辑Tor的配置文件:

sudo nano /etc/tor/torrc

找到并修改以下配置(没有的话就添加):

ControlPort 9051
CookieAuthentication 1

保存后重启Tor服务:

sudo systemctl restart tor

注意:因为是本地进程控制Tor,所以不需要在EC2安全组开放9051端口,仅本地访问即可。

3. Python脚本实现自动换IP + Selenium访问

这个脚本会每次访问前通过Tor控制端口更换IP,然后用Selenium加载目标网站:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from stem import Signal
from stem.control import Controller
import requests
import time

# 配置Tor代理的Firefox选项(无头模式适配EC2无桌面环境)
def setup_firefox_with_tor():
    options = Options()
    options.add_argument('--headless')  # 无头模式,适合服务器环境
    options.add_argument('--proxy-server=socks5://127.0.0.1:9050')
    # 禁用WebRTC防止IP泄漏
    options.set_preference("media.peerconnection.enabled", False)
    driver = webdriver.Firefox(options=options)
    return driver

# 更换Tor IP的函数
def renew_tor_ip():
    with Controller.from_port(port=9051) as controller:
        controller.authenticate()  # 使用Cookie认证,无需手动设置密码
        controller.signal(Signal.NEWNYM)
        time.sleep(5)  # 给Tor预留切换节点的时间

# 主逻辑
if __name__ == "__main__":
    target_url = "你的目标网站URL"
    while True:
        renew_tor_ip()
        driver = setup_firefox_with_tor()
        try:
            driver.get(target_url)
            # 验证当前Tor出口IP
            ip_resp = requests.get(
                "http://httpbin.org/ip",
                proxies={"http": "socks5://127.0.0.1:9050", "https": "socks5://127.0.0.1:9050"},
                timeout=10
            )
            print(f"成功访问,当前出口IP: {ip_resp.json()['origin']}")
            # 这里可以添加你的业务逻辑,比如页面数据提取、表单提交等
        except Exception as e:
            print(f"访问出错: {str(e)}")
        finally:
            driver.quit()
        time.sleep(30)  # 等待30秒后再次执行访问
二、免费代理池抓取方案(多源收集)

如果不想用Tor,也可以自己搭建一个简单的免费代理池,从多个免费代理源抓取并验证可用IP。下面是一个基础的Python脚本示例:

import requests
from bs4 import BeautifulSoup
import threading
from queue import Queue
import time

# 代理验证函数,验证通过的代理放入队列
def check_proxy(proxy, queue):
    try:
        response = requests.get(
            "http://httpbin.org/ip",
            proxies={"http": proxy, "https": proxy},
            timeout=5,
            headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
        )
        if response.status_code == 200:
            queue.put(proxy)
            print(f"发现可用代理: {proxy}")
    except Exception:
        pass

# 从多源抓取免费代理
def get_free_proxies():
    proxies = set()
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}

    # 源1:国内免费代理站
    try:
        resp = requests.get("https://www.xicidaili.com/nn/", headers=headers)
        soup = BeautifulSoup(resp.text, "html.parser")
        for row in soup.find_all("tr")[1:10]:  # 取前10条代理
            cols = row.find_all("td")
            proxy = f"{cols[1].text}:{cols[2].text}"
            proxies.add(proxy)
    except Exception:
        pass

    # 源2:另一个免费代理站
    try:
        resp = requests.get("https://www.kuaidaili.com/free/inha/", headers=headers)
        soup = BeautifulSoup(resp.text, "html.parser")
        for row in soup.find_all("tr")[1:10]:
            cols = row.find_all("td")
            proxy = f"{cols[0].text}:{cols[1].text}"
            proxies.add(proxy)
    except Exception:
        pass

    # 多线程验证代理可用性
    queue = Queue()
    threads = []
    for proxy in proxies:
        t = threading.Thread(target=check_proxy, args=(proxy, queue))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

    # 收集所有可用代理
    valid_proxies = []
    while not queue.empty():
        valid_proxies.append(queue.get())
    return valid_proxies

# 主使用逻辑
if __name__ == "__main__":
    target_url = "你的目标网站URL"
    while True:
        valid_proxies = get_free_proxies()
        if valid_proxies:
            for proxy in valid_proxies:
                try:
                    resp = requests.get(
                        target_url,
                        proxies={"http": proxy, "https": proxy},
                        timeout=10,
                        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
                    )
                    print(f"用代理{proxy}访问成功,状态码: {resp.status_code}")
                    # 添加你的业务逻辑
                    break
                except Exception:
                    print(f"代理{proxy}不可用,跳过")
                    continue
        time.sleep(30)

缺点:免费代理稳定性极差,大部分会在几分钟内失效,适合临时测试,长期使用不推荐。

三、其他备选方案
  • 付费代理服务:如果预算允许,这是最省心的方案。选择支持API批量获取代理的服务商,脚本直接调用API获取可用IP(比如住宅代理,IP更贴近真实用户,不容易被网站封禁),无需自己维护代理池或Tor配置。
  • AWS EC2弹性IP:成本极高,且AWS对弹性IP的创建/释放有配额限制,每30秒换IP的操作很容易触发限制,完全不推荐。

内容的提问来源于stack exchange,提问作者Timothé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:51