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

Python机器人无法选中Google Ads且浏览器自动关闭问题求助

解决Google Ads交互机器人的两个核心问题

一、无法选中Google Ads元素的解决方案

Google搜索的广告DOM结构会频繁更新,当前你使用的data-text-ad='1'属性可能已失效,同时等待逻辑不够精准,可按以下方式调整:

  1. 更换广告元素定位策略
    中文环境下,Google广告结果通常会带有「广告」标识,可结合该标识+父容器定位;同时优先使用Google官方标记的广告属性(如data-ad='1'):

    # 替换原有的ad_elements定位逻辑
    # 方式1:通过"广告"文本标识定位
    ad_badge = result.find_elements(By.XPATH, ".//span[contains(text(), '广告')]")
    # 方式2:通过Google官方广告属性定位
    ad_mark = result.find_elements(By.CSS_SELECTOR, "div[data-ad='1']")
    if ad_badge or ad_mark:
        # 后续逻辑不变
    
  2. 优化等待逻辑,确保广告完全加载
    原代码等待普通搜索结果.g加载,但广告可能滞后出现,应直接等待广告元素:

    # 替换原有的搜索结果等待代码
    WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, ".g div[data-ad='1']"))
    )
    
  3. 禁用Selenium自动化检测
    Google会识别Selenium特征,导致广告渲染异常,在ChromeOptions中添加防检测参数:

    chrome_options = webdriver.ChromeOptions()
    # 禁用自动化控制检测
    chrome_options.add_argument("--disable-blink-features=AutomationControlled")
    # 隐藏Chrome正被自动化控制的提示条
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    # 保留你的guest模式或改用普通模式
    chrome_options.add_argument("--guest")
    

二、浏览器意外自动关闭的解决方案

浏览器异常关闭通常和驱动版本不匹配、自动化检测触发拦截、资源不足有关,可按以下修复:

  1. 自动匹配ChromeDriver版本
    手动指定驱动路径易出现版本不兼容问题,改用webdriver-manager自动管理:

    # 先安装库:pip install webdriver-manager
    from webdriver_manager.chrome import ChromeDriverManager
    
    # 替换原有的service初始化代码
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)
    
  2. 添加稳定性参数
    补充Chrome启动参数,避免因资源限制或沙箱机制导致崩溃:

    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--disable-extensions")
    chrome_options.add_argument("--start-maximized")  # 替代手动maximize_window()
    
  3. 优化异常处理与资源释放
    原代码中切换窗口、关闭页面的逻辑可能因超时触发未捕获异常,导致finally块提前执行driver.quit(),需细化异常处理:

    # 在点击广告后的逻辑中添加更严谨的等待与异常捕获
    try:
        result.find_element(By.CSS_SELECTOR, "a").click()
        # 等待新窗口出现,最多等待30秒
        wait = WebDriverWait(driver, 30)
        wait.until(EC.number_of_windows_to_be(2))
        # 切换窗口前先保存主窗口句柄
        main_window = driver.window_handles[0]
        driver.switch_to.window(driver.window_handles[-1])
        # 等待页面核心元素加载,而非仅body
        wait.until(EC.visibility_of_element_located((By.TAG_NAME, "h1")))
        time.sleep(5)  # 缩短不必要的等待时间
        driver.close()
        driver.switch_to.window(main_window)
    except Exception as e:
        print(f"处理广告页面失败: {e}")
        # 若切换窗口失败,强制切回主窗口
        if len(driver.window_handles) > 0:
            driver.switch_to.window(driver.window_handles[0])
        continue
    
  4. 避免提前触发driver.quit()
    若机器人需长时间运行,finally块的driver.quit()会在函数结束时关闭浏览器,可根据需求调整:比如将driver.quit()移出finally,改为在机器人任务全部完成后再执行,或者添加判断逻辑避免意外退出。

完整修改后的示例代码

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from urllib.parse import urlparse
from webdriver_manager.chrome import ChromeDriverManager

def is_allowed_domain(url, allowed_domains):
    domain = urlparse(url).netloc
    return any(domain.endswith(allowed_domain) for allowed_domain in allowed_domains)

def search_and_save_ads_to_excel(search_keyword, allowed_domains, output_excel_path):
    # 配置Chrome选项
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--guest")
    # 防自动化检测参数
    chrome_options.add_argument("--disable-blink-features=AutomationControlled")
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    # 稳定性参数
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--disable-extensions")
    chrome_options.add_argument("--start-maximized")

    # 自动获取匹配的ChromeDriver
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)
    wait = WebDriverWait(driver, 30)

    try:
        driver.get("https://www.google.com")
      
        # 搜索关键词
        search_box = wait.until(EC.presence_of_element_located((By.NAME, "q")))
        search_box.send_keys(search_keyword)
        search_box.submit()
      
        # 等待广告元素加载
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".g div[data-ad='1']")))

        search_results = driver.find_elements(By.CSS_SELECTOR, ".g")
        ad_data = []
        
        for result in search_results:
            try:
                # 识别广告:通过官方属性或中文标识
                ad_mark = result.find_elements(By.CSS_SELECTOR, "div[data-ad='1']")
                ad_badge = result.find_elements(By.XPATH, ".//span[contains(text(), '广告')]")
                if ad_mark or ad_badge:
                    ad_url = result.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
                    if is_allowed_domain(ad_url, allowed_domains):
                        ad_title = result.find_element(By.CSS_SELECTOR, "h3").text
                        ad_data.append({"Title": ad_title, "URL": ad_url})
                        print(f"找到广告标题: {ad_title}")
                        print(f"找到广告URL: {ad_url}")
                        # 处理广告点击与页面切换
                        result.find_element(By.CSS_SELECTOR, "a").click()
                        wait.until(EC.number_of_windows_to_be(2))
                        main_window = driver.window_handles[0]
                        driver.switch_to.window(driver.window_handles[-1])
                        # 等待页面核心元素加载
                        wait.until(EC.visibility_of_element_located((By.TAG_NAME, "h1")))
                        time.sleep(5)
                        driver.close()
                        driver.switch_to.window(main_window)
            except (NoSuchElementException, TimeoutException) as e:
                print(f"处理结果失败: {e}")
                # 异常时强制切回主窗口
                if len(driver.window_handles) > 0:
                    driver.switch_to.window(driver.window_handles[0])
                continue

        # 保存数据
        df = pd.DataFrame(ad_data)
        df.to_excel(output_excel_path, index=False)
        print(f"广告数据已保存至 {output_excel_path}")

    finally:
        # 若需长时间运行,可将driver.quit()移至外部调用
        # driver.quit()
        pass

# 示例调用
search_keyword = "Sikka Kaamya Greens"
allowed_domains = ["sikka.ixapl.com", "99acres.com"]
output_excel_path = "ad_data.xlsx"
search_and_save_ads_to_excel(search_keyword, allowed_domains, output_excel_path)

内容的提问来源于stack exchange,提问作者Junaid Amir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:07:01