使用Python版Selenium WebDriver自动化访问亚马逊时,Amazon Bestsellers Rank无法稳定显示的问题求助
解决亚马逊Selenium无法获取畅销排名的问题
我之前也碰到过完全一样的情况!亚马逊对自动化工具的检测特别严格,而且页面里很多内容是动态加载的,这两个因素加起来就导致了手动能看到排名,但Selenium经常抓不到的问题,偶尔能显示纯粹是运气好没被盯上😂。
下面是我亲测有效的几个解决方案,按优先级排序:
1. 隐藏Selenium的自动化特征(最关键)
亚马逊会通过检查浏览器的navigator.webdriver属性、窗口特征等判断是不是自动化工具。普通的Selenium很容易被识别,这时候页面会故意不加载部分内容(包括畅销排名)。
推荐用undetected_chromedriver这个库,它专门针对反爬做了优化,能自动隐藏Selenium的特征:
import undetected_chromedriver as uc # 初始化浏览器 driver = uc.Chrome() # 打开商品页面 driver.get("https://www.amazon.com/your-t-shirt-product-url")
如果不想用第三方库,也可以手动修改ChromeOptions来伪装:
from selenium import webdriver 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) # 执行JS重写webdriver属性 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
2. 优化等待逻辑,确保元素完全加载
手动浏览时,页面会逐步加载内容,但Selenium可能在页面还没完全渲染好就开始查找元素。别用time.sleep()这种硬等待,改用显式等待,直到排名元素出现再去提取:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 设置10秒超时等待 wait = WebDriverWait(driver, 10) # 定位畅销排名元素(xpath可能需要根据实际页面调整) rank_element = wait.until( EC.presence_of_element_located( (By.XPATH, "//span[contains(text(), 'Amazon Bestsellers Rank')]/following-sibling::span") ) ) print("畅销排名:", rank_element.text)
另外,有时候排名区域在页面下方,需要滚动到对应位置才会触发加载:
# 滚动到商品详情区域 detail_section = driver.find_element(By.ID, "detailBulletsWrapper_feature_div") driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth'});", detail_section) # 滚动后再等待一下元素加载 import time time.sleep(2) # 这里短时间sleep辅助,结合显式等待效果更好
3. 模拟人类行为(辅助手段)
偶尔可以加一些人类浏览的小动作,比如随机点击页面空白处、滚动页面上下移动,降低被判定为机器人的概率:
import random # 点击页面空白区域 driver.find_element(By.TAG_NAME, "body").click() # 随机滚动一点距离 driver.execute_script(f"window.scrollBy(0, {random.randint(100, 300)});")
总结一下:核心是先解决被亚马逊识别为自动化的问题,再确保元素加载完成,这两个步骤搞定后,基本就能稳定获取到畅销排名了。
内容的提问来源于stack exchange,提问作者Iman
相关产品推荐
相关产品推荐

