使用Selenium+WebDriver实现谷歌新闻随机分类文章点击问题求助
问题分析与修复方案
核心问题点
- 浏览器自动关闭/崩溃:默认Selenium执行完脚本就会关闭浏览器,另外ChromeDriver和Chrome版本不匹配也会直接导致崩溃;
- 绝对XPath完全不可靠:谷歌新闻的DOM结构(比如
yDmH0d、c2642-panel这类id)是动态生成的,刷新一次页面就会变,用这种固定层级的XPath根本没法稳定定位元素; - 硬编码sleep太脆弱:固定5秒等待没法适配不同网络速度,页面没加载完就找元素会直接抛出异常,脚本终止后浏览器也跟着关闭。
修复后的代码
import random from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 修正了BUSINESS参数里的hl=enUS为hl=en-US,避免URL格式错误 BUSINESS = 'CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtVnVHZ0pWVXlnQVAB?hl=en-US&gl=US&ceid=US%3Aen' WORLD = 'CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx1YlY4U0FtVnVHZ0pWVXlnQVAB?hl=en-US&gl=US&ceid=US%3Aen' categories = [WORLD, BUSINESS] random_category = random.choice(categories) # 配置Chrome选项,解决浏览器关闭和崩溃问题 options = webdriver.ChromeOptions() options.add_experimental_option("detach", True) # 脚本跑完后浏览器保持打开 options.add_argument("--disable-blink-features=AutomationControlled") # 避免被谷歌反爬检测 options.add_argument("--start-maximized") # 最大化窗口,防止布局变化影响元素定位 driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, 10) # 显式等待最长10秒,比固定sleep靠谱 try: # 跳转到随机分类的谷歌新闻页面 driver.get(f"https://news.google.com/topics/{random_category}") # 等待第一篇文章加载完成并可点击,用通用定位适配所有分类 first_article = wait.until(EC.element_to_be_clickable((By.XPATH, "//article//a[contains(@href, '/articles/')]"))) first_article.click() # 可选:等待文章详情页标题加载完成,确认跳转成功 wait.until(EC.presence_of_element_located((By.TAG_NAME, "h1"))) finally: # 不需要自动关闭的话就注释掉下面一行,因为detach已经让浏览器保持打开 # driver.quit() pass
关键修复说明
- 浏览器保持打开:通过
detach参数让脚本执行结束后不关闭浏览器,方便调试; - 通用元素定位:用
//article//a[contains(@href, '/articles/')]这种相对XPath,不管分类如何变化,都能准确找到新闻文章的链接; - 显式替代固定sleep:
WebDriverWait会自动等待元素可点击,避免因页面加载慢导致的元素找不到异常; - 版本匹配:务必确保ChromeDriver的版本和你本地Chrome浏览器的版本完全一致,这是解决浏览器崩溃的核心前提。
内容的提问来源于stack exchange,提问作者Jalen Pless
相关产品推荐
相关产品推荐

