文章目录
Python Selenium 搜索和点击
🔧 1. 环境准备
- 安装依赖
安装 Selenium 库并配置浏览器驱动(以 Chrome 为例):uv add selenium webdriver-manager # 自动管理驱动版本
- 初始化浏览器
使用webdriver-manager
自动处理驱动路径问题:from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.maximize_window() # 最大化窗口避免元素遮挡
🔍 2. 执行 Google 搜索
- 输入关键词并提交
定位 Google 搜索框并模拟回车键提交搜索:from selenium.webdriver.common.keys import Keys driver.get("https://www.google.com") search_box = driver.find_element("name", "q") # 通过 name 定位搜索框 search_box.send_keys("Python 自动化测试") search_box.send_keys(Keys.RETURN) # 回车提交搜索
🖱️ 3. 定位并点击搜索结果
- 等待结果加载
使用显式等待确保结果加载完成,避免因网络延迟失败:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待结果区域出现(最长10秒) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.g")) )
- 点击指定结果
- 方案1:点击特定位置结果(如第一条)
first_result = driver.find_element(By.CSS_SELECTOR, "div.g a") # 定位第一条结果的链接 first_result.click()
- 方案2:随机点击一个结果
from random import choice all_results = driver.find_elements(By.CSS_SELECTOR, "div.g a") # 获取所有结果链接 random_result = choice(all_results) # 随机选择一个 random_result.click()
- 方案1:点击特定位置结果(如第一条)
⚠️ 4. 处理特殊情况
- 元素不可点击时
若普通点击失效(如元素被遮挡),用 JavaScript 强制执行点击:driver.execute_script("arguments[0].click();", random_result)
- 过滤广告链接
通过选择器排除广告区域(通常包含class="ads"
的元素):valid_results = driver.find_elements(By.XPATH, '//div[@class="g"]/a[not(ancestor::div[@class="ads"])]')
🛠️ 5. 完整代码示例
实际上,检索的代码会发生变化,需要我们如实调整,实测有效的代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from random import choice
options = webdriver.ChromeOptions()
# 绕过人机检测
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.get("https://www.google.com")
# 搜索关键词
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Python Selenium 教程")
search_box.send_keys(Keys.RETURN)
# 等待结果加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.b8lM7"))
)
results = driver.find_elements(By.CSS_SELECTOR, "a h3")
if results:
target = choice(results)
target.click() # 或 driver.execute_script("arguments[0].click();", target)
else:
print("未找到有效结果")
# 后续操作(如数据提取)
print("当前页面标题:", driver.title)
# 关闭浏览器
driver.quit()
📌 6. 关键注意事项
- 反爬虫机制:Google 会检测自动化行为,需控制频率(如添加
time.sleep(2)
),避免 IP 被封。 - 元素定位更新:Google 页面结构可能变化,若 CSS 选择器失效需调整(如改用 XPath)。
- 浏览器兼容性:若使用 Firefox 或 Edge,需替换为对应驱动(如
GeckoDriverManager
)。
此方案覆盖了从环境配置到动态交互的全流程,适用于自动化测试或数据采集场景。实际使用时建议结合异常处理(如
try/except
)增强稳定性。