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

求助:用Selenium Python实现代理、UA、Cookie轮换及广告点击

问题分析与修复方案

核心问题点

  • 用户代理(UA)不生效:代码先初始化无配置的driver,之后重复创建带UA配置的driver,导致窗口最大化操作无效,UA配置逻辑冗余出错。
  • Cookie无法生效:添加Cookie时机错误,需在访问目标域名且页面加载完成后操作,同时要验证Cookie的domain字段是否匹配当前域名。
  • 缺失代理轮换逻辑:原代码未实现代理配置,需补充代理参数到ChromeOptions中。
  • 元素定位稳定性差:直接使用find_element易因页面未加载完成报错,需用显式等待替代强制休眠。

修复后的完整代码

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import random
import csv
import json

# 加载用户代理列表(跳过表头,清理空格)
useragents = []
with open('useragent.csv', 'r') as file:
    reader = csv.reader(file)
    next(reader, None)
    for row in reader:
        useragents.append(row[0].strip())

# 加载Cookie列表
with open('cookie.json', 'r') as file:
    cookies = json.load(file)

# 加载代理列表(需自行创建proxies.csv,每行格式:http://ip:port)
proxies = []
with open('proxies.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        proxies.append(row[0].strip())

def create_driver():
    """生成带随机UA、代理的Chrome驱动"""
    options = webdriver.ChromeOptions()
    
    # 随机设置用户代理
    random_ua = random.choice(useragents)
    options.add_argument(f'user-agent={random_ua}')
    
    # 随机设置代理
    random_proxy = random.choice(proxies)
    options.add_argument(f'--proxy-server={random_proxy}')
    
    # 防自动化检测配置
    options.add_argument('--disable-blink-features=AutomationControlled')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    
    driver = webdriver.Chrome(options=options)
    driver.maximize_window()
    return driver

# 初始化驱动与等待器
driver = create_driver()
wait = WebDriverWait(driver, 10)

try:
    # 访问Google,确保域名匹配后添加Cookie
    driver.get('https://google.com')
    
    # 添加Cookie(过滤匹配当前域名的Cookie)
    for cookie in cookies:
        if 'domain' in cookie and '.google.com' in cookie['domain']:
            try:
                driver.add_cookie(cookie)
            except Exception as e:
                print(f"Cookie添加失败: {e}")
    
    # 刷新页面使Cookie生效
    driver.refresh()
    
    # 读取并随机选择搜索链接
    with open('links.csv', 'r') as file:
        reader = csv.reader(file)
        links = [row[0].strip() for row in reader if row]
    
    random_link = random.choice(links)
    
    # 等待搜索框加载并执行搜索
    search_input = wait.until(EC.presence_of_element_located((By.NAME, "q")))
    search_input.send_keys(random_link)
    search_input.send_keys(Keys.RETURN)
    
    # 点击第一个搜索结果并切换标签页
    first_result = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div#search div.g:nth-child(1) a')))
    first_result.click()
    driver.switch_to.window(driver.window_handles[-1])
    
    # 第一篇帖子操作:悬停、滚动、点击
    first_post = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.post:nth-child(1)')))
    ActionChains(driver).move_to_element(first_post).perform()
    
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
    time.sleep(random.uniform(2,4))
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(random.uniform(2,4))
    
    first_post.click()
    time.sleep(random.uniform(4,6))
    
    # 返回上一页,处理第二篇帖子
    driver.back()
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.post:nth-child(2)')))
    
    second_post = driver.find_element(By.CSS_SELECTOR, 'div.post:nth-child(2)')
    ActionChains(driver).move_to_element(second_post).perform()
    
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
    time.sleep(random.uniform(2,4))
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(random.uniform(2,4))
    
    second_post.click()
    time.sleep(random.uniform(4,6))
    
    # 点击相关文章
    try:
        related_articles = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.related-articles')))
        related_articles.click()
    except Exception as e:
        print(f"未找到相关文章: {e}")
    
    # 处理弹窗
    try:
        popup = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.popup')))
        if popup.is_displayed():
            popup.click()
    except Exception as e:
        print(f"未找到弹窗: {e}")
    
    # 重复流程5次
    for _ in range(5):
        driver.get('https://google.com')
        search_input = wait.until(EC.presence_of_element_located((By.NAME, "q")))
        search_input.send_keys(random.choice(links))
        search_input.send_keys(Keys.RETURN)
        time.sleep(random.uniform(3,5))
        
finally:
    driver.quit()

关键修复说明

  1. UA与代理配置:将驱动初始化封装为函数,确保UA和代理在驱动启动前完成配置,避免重复创建驱动导致的配置失效。
  2. Cookie生效逻辑:访问目标域名后添加Cookie,刷新页面使Cookie生效,同时过滤不匹配当前域名的无效Cookie。
  3. 稳定性优化:使用WebDriverWait显式等待元素加载,替换强制休眠;采用随机休眠时间模拟真人操作行为。
  4. 代理轮换:新增代理列表加载逻辑,每次创建驱动时随机选择一个代理实现轮换。

内容的提问来源于stack exchange,提问作者Prince Wodu Newman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:24:52