Python机器人无法选中Google Ads且浏览器自动关闭问题求助
解决Google Ads交互机器人的两个核心问题
一、无法选中Google Ads元素的解决方案
Google搜索的广告DOM结构会频繁更新,当前你使用的data-text-ad='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: # 后续逻辑不变优化等待逻辑,确保广告完全加载
原代码等待普通搜索结果.g加载,但广告可能滞后出现,应直接等待广告元素:# 替换原有的搜索结果等待代码 WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".g div[data-ad='1']")) )禁用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")
二、浏览器意外自动关闭的解决方案
浏览器异常关闭通常和驱动版本不匹配、自动化检测触发拦截、资源不足有关,可按以下修复:
自动匹配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)添加稳定性参数
补充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()优化异常处理与资源释放
原代码中切换窗口、关闭页面的逻辑可能因超时触发未捕获异常,导致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避免提前触发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
相关产品推荐
相关产品推荐

