Selenium定位器无法抓取亚马逊全部商品URL的问题排查
问题:亚马逊印度站搜索“iphone charger”时页面显示22个商品但仅抓取到17个URL
我使用以下代码从亚马逊印度站提取“iphone charger”的搜索结果,页面显示有22个商品URL,但程序仅抓取到17个,遗漏了部分URL,请问可能的原因是什么?
import selenium.webdriver as webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait as wait from selenium.webdriver.support import expected_conditions as EC import time # 修正原代码的首字母大写错误 chrome_driver_path = "driver/chromedriver" driver = webdriver.Chrome(ChromeDriverManager().install()) url = 'https://www.amazon.in/' driver.get(url) keyword = 'iphone charger' search_box = driver.find_element_by_id('twotabsearchtextbox') search_box.send_keys(keyword) search_button = driver.find_element_by_id('nav-search-submit-text') search_button.click() driver.implicitly_wait(15) product_link = [] items = wait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//div[contains(@class, "s-result-item s-asin sg-col-0-of-12 sg-col-16-of-20 sg-col s-widget-spacing-small sg-col-12-of-16")]'))) for item in items: link = item.find_element_by_xpath('.//a[@class="a-link-normal s-underline-text s-underline-link-text s-link-style a-text-normal"]').get_attribute('href') print(link) product_link.append(link) time.sleep(6) print(len(product_link)) driver.quit()
可能的原因分析
元素定位规则过于严苛:你用的XPATH指定了过多的class组合,而亚马逊搜索结果里的商品item可能有不同的class配置——比如赞助商品、广告商品的class和普通商品存在差异,这类商品会被你的定位规则直接排除,导致数量遗漏。
等待机制冲突:代码同时混用了
driver.implicitly_wait(15)和显式等待wait(driver, 10),两种等待逻辑的判断规则不同,可能导致显式等待提前触发,此时页面还未完全加载所有22个商品,自然只能抓取到已加载的17个。子元素定位无异常处理:抓取商品链接时你用了固定class的XPATH,但部分商品的链接元素class可能不同(比如自营商品、套装商品的链接class会有变化),此时
find_element_by_xpath会抛出异常,若没有try-except捕获异常,循环会直接中断,后续商品都无法被抓取。未触发动态加载:亚马逊搜索结果是滚动加载的,页面初始可能只加载部分商品,剩余商品需要滚动页面后才会加载。你的代码没有执行滚动操作,导致未加载的商品无法被定位到。
原代码的拼写错误:原代码中
Import time的首字母大写会导致语法错误,若实际运行时未修正,程序会直接报错终止;如果是粘贴时的笔误,可忽略此条。
内容的提问来源于stack exchange,提问作者sebastian
相关产品推荐
相关产品推荐

