Selenium爬取亚马逊时触发TimeoutException错误求解决方案
解决Selenium爬取亚马逊商品时的TimeoutException问题
核心问题定位
你代码里的元素定位写法有误:By.CLASS_NAME, "s-result-item s-asin" 中,CLASS_NAME 不支持多个类名(空格分隔的是多类选择器),这是导致超时的直接原因之一。
具体解决步骤
1. 修复元素定位方式
替换原定位代码为以下两种可行方式之一:
方式一:使用CSS选择器(推荐)
items = wait(driver, 30).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".s-result-item.s-asin")))
CSS选择器里的.代表类名,多个类名直接拼接(无空格)表示同时匹配这两个类的元素。
方式二:使用XPATH
items = wait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class, 's-result-item') and contains(@class, 's-asin')]")))
2. 应对亚马逊反爬机制
亚马逊有严格的反爬策略,即使定位正确也可能因被识别为爬虫而无法加载元素:
- 配置浏览器参数模拟真实用户:
from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--start-maximized") 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) # 隐藏webdriver标识 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") - 添加随机延迟与滚动加载:
import random import time # 页面加载后滚动到底部触发动态加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(random.uniform(2, 5)) - 检查是否出现验证码:手动打开目标URL,确认页面是否需要验证码验证,若有需先完成验证(或集成验证码识别工具)。
3. 确保页面完全加载
在等待元素前,先等待页面加载完成:
wait(driver, 30).until(lambda d: d.execute_script('return document.readyState') == 'complete')
4. 同步SelectorLib配置
- 检查
search_results.yml中的选择器是否与当前亚马逊页面结构匹配:亚马逊会频繁更新页面类名/结构,需手动打开页面审查元素,更新配置文件中的选择器。 - 验证配置文件语法是否正确,避免因选择器错误导致SelectorLib无法解析元素。
测试建议
- 手动访问目标搜索URL,打开开发者工具(F12),确认商品元素的类名是否仍为
s-result-item和s-asin,若已变更需同步更新定位代码与SelectorLib配置。 - 分步执行代码,先打开浏览器加载页面,确认页面正常显示商品列表后再执行元素等待逻辑。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

