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

使用Selenium抓取Yelp站点时触发TimeoutException异常如何解决

Selenium抓取Yelp页面出现TimeoutException的修复方案

错误根因排查

  • 多类名使用By.CLASS_NAME定位错误:By.CLASS_NAME仅支持传入单个CSS类名,你代码里的stickySidebar__373c0__3MPss border-color--default__373c0__r305k包含两个类名(中间有空格),定位规则直接不生效,触发超时。
  • 使用前端动态生成类名定位:你用到的css-ac8spe、带__373c0__后缀的类都是Yelp前端工程化打包生成的动态类,版本更新或者页面刷新都可能变化,稳定性极低,很容易定位失败。
  • 元素交互逻辑错误:你在调用WebDriverWait判断下一页按钮存在前,就先执行了driver.find_element_by_class_name("css-ac8spe"),如果此时页面还没加载完,这行代码本身就会先报错,后续等待逻辑完全没生效。
  • 方法混用错误:你代码里side.find("p", {"class": " css-chtywg"})是BeautifulSoup的元素查找语法,不能直接用在Selenium返回的WebElement对象上,语法不匹配会导致报错。

修复后的代码实现

首先确保你已经导入了必要依赖:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

下一页点击逻辑修复

用按钮的固定aria-label属性定位,比动态类名稳定性高:

try:
    # 等待下一页按钮可点击再操作,比判断存在更符合交互逻辑
    # 英区Yelp的下一页按钮aria-label为Next Page,若访问其他语言站点对应修改属性值即可
    next_btn = WebDriverWait(driver, 15).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[aria-label="Next Page"]'))
    )
    next_btn.click()
    # 点击后等待页面跳转完成,避免后续操作在旧页面执行
    WebDriverWait(driver, 10).until(lambda d: "start=" in d.current_url)
except TimeoutException as e:
    print("没有更多页面了,或者下一页按钮加载失败:", e)

侧边栏信息抓取逻辑修复

用模糊匹配规则适配动态类名,多类名统一用CSS选择器定位:

try:
    WebDriverWait(driver, 10).until(
        EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'div[class*="stickySidebar__"]'))
    )
    sidebars = driver.find_elements(By.CSS_SELECTOR, 'div[class*="stickySidebar__"]')
    for side in sidebars:
        # 地址定位同样用属性模糊匹配规避动态类名问题
        address = side.find_element(By.CSS_SELECTOR, 'p[class*="css-chtywg"]')
        print(address.text)
except TimeoutException as e:
    print("侧边栏加载超时:", e)

额外优化建议

  • 给Selenium配置常规浏览器的User-Agent,避免Yelp的反爬机制拦截页面加载,导致元素一直无法加载触发超时。
  • 如果反爬限制严格,可以先手动在本地浏览器访问一次Yelp,将登录状态的Cookie导出后注入到Selenium会话中,降低被识别为爬虫的概率。
  • 后续定位元素优先用标签的固有属性比如aria-label、data-*属性,或者文本内容、父子层级关系定位,不要依赖前端自动生成的动态类名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:33:02