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

如何使用Python+Selenium抓取谷歌People also ask板块文本

定位失效原因
  • 谷歌搜索结果页的短class名(比如你代码里写的ULSxyf)是前端构建时自动生成的动态混淆类名,会随页面版本迭代、访问环境变化随机变更,直接写死这类class做定位,失效概率极高。
  • 你触发搜索后直接执行元素查找,没有等待搜索结果页渲染完成,此时目标「People also ask」板块还没加载到DOM树中,自然无法定位。用固定时长的time.sleep()属于硬等待,既拖慢程序效率,也没法保证元素已经完成渲染。
  • 「People also ask」板块是动态加载逻辑:页面初始仅加载3-4个问题,答案面板默认隐藏,只有点击对应问题触发后才会异步拉取答案内容;每展开几个问题,板块还会自动追加新的问题条目,直接一次性查找拿不到完整内容。
可直接运行的实现代码
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
import time

driver = webdriver.Firefox()
driver.maximize_window()

try:
    driver.get('https://google.com/')
    # 等待搜索框加载完成后输入关键词
    search_box = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, 'q'))
    )
    search_box.send_keys('cars')
    search_box.submit()

    # 等待People also ask板块加载,使用jsname这类前端逻辑绑定的固定属性定位
    paa_section = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div[jsname="yEVEwb"]'))
    )

    # 获取当前加载的所有可点击问题项
    question_items = paa_section.find_elements(By.CSS_SELECTOR, 'div[jsname="tJHJj"]')
    
    result = []
    # 遍历点击问题展开,提取问答内容
    for idx, item in enumerate(question_items):
        # 滚动元素到可视区域,避免点击被遮挡
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", item)
        time.sleep(0.5)
        # 点击触发答案加载
        item.click()
        # 等待答案面板渲染完成
        WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'div[jsname="cgNMyc"]'))
        )
        # 提取问题和答案文本
        q_text = item.find_element(By.CSS_SELECTOR, 'span[class^="wQiwMc"]').text
        a_text = item.find_element(By.CSS_SELECTOR, 'div[jsname="cgNMyc"]').text
        result.append({"question": q_text, "answer": a_text})
        print(f"第{idx+1}个问题:{q_text}")
        print(f"答案:{a_text}\n")

    # 如需提取全部PAA内容,可在此处加循环:重新拉取question_items,跳过已提取的条目重复上述操作,直到无新问题加载
    time.sleep(5)

finally:
    driver.quit()
实现注意事项
  • 不要使用动态混淆类名作为定位依据,优先选择jsname、data-*这类固定属性,或者元素角色、固定文本内容做定位,稳定性会提升数个量级。
  • 所有页面跳转、点击触发后的元素查找,统一用WebDriverWait显式等待替代固定时长的time.sleep(),既可以压缩程序运行时长,也能从逻辑上保证元素加载完成后再执行操作,避免偶发的定位失败。
  • 点击问题项前必须先将元素滚动到页面可视区域,谷歌搜索页存在懒加载和固定栏遮挡逻辑,不在可视区域的元素点击会被直接拦截,触发元素不可交互的报错。
  • 如果运行时提示找不到对应元素,可打开浏览器开发者工具的元素搜索栏,搜索对应jsname属性值,根据当前访问的页面版本微调定位选择器即可,不同地区、不同语言的谷歌搜索页可能存在细微属性差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:00:58