为何Selenium爬虫代码无法统计亚马逊商品总数?
亚马逊印度站商品爬取数据为空的问题分析
问题场景
以下是用于爬取亚马逊印度站10页“10000卢比以下智能手机”商品数据的Selenium代码,目标是统计商品总数并展示商品名称:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from time import sleep from selenium.webdriver.common.by import By path = r'C:\Users\.wdm\drivers\chromedriver\win32\108.0.5359\chromedriver.exe' # open the browser # browser = webdriver.Chrome(executable_path=path) s=Service(r'C:\Users\.wdm\drivers\chromedriver\win32\108.0.5359\chromedriver.exe') browser = webdriver.Chrome(service=s) # load the webpage browser.get('https://www.amazon.in') browser.maximize_window() # get the input elements input_search = browser.find_element(By.ID,'twotabsearchtextbox') search_button = browser.find_element(By.XPATH,"(//input[@type='submit'])[1]") # send the input to the webpage input_search.send_keys("Smartphones under 10000") sleep(1) search_button.click() products = [] for i in range(10): print('Scraping page', i+1) product = browser.find_elements(By.CLASS_NAME,'a-size-medium a-color-base a-text-normal') for p in product: products.append(p.text) next_button = browser.find_element(By.CLASS_NAME,'a-last') next_button.click() sleep(3) print(len(products)) products[:5] brower.quit()
运行后未获取到商品数据,输出如下:
Scraping page 1 Scraping page 2 Scraping page 3 Scraping page 4 Scraping page 5 Scraping page 6 Scraping page 7 Scraping page 8 Scraping page 9 Scraping page 10 0 Process finished with exit code 0
统计结果为0,问题原因如下:
问题原因分析
CLASS_NAME定位规则错误:
Selenium的By.CLASS_NAME不支持传入多个类名(空格分隔的字符串),代码中'a-size-medium a-color-base a-text-normal'是三个不同的类,Selenium会将其当作一个完整的类名去查找,而页面中不存在该类,因此无法定位到商品元素。正确的做法是使用By.CSS_SELECTOR,写法为.a-size-medium.a-color-base.a-text-normal,或者用By.XPATH来定位。页面等待机制不可靠:
代码中使用固定时长的sleep()等待页面加载,但网络波动或页面加载缓慢时,可能在商品元素未渲染完成就执行查找操作,导致获取不到元素。建议改用显式等待(WebDriverWait),等待目标元素出现后再进行操作,稳定性更强。代码拼写错误:
最后一行退出浏览器的代码写成了brower.quit(),正确的变量名是browser,虽然这个错误不会直接导致数据为空,但会引发程序退出失败的问题。亚马逊反爬机制影响:
亚马逊会检测自动化爬虫,可能返回不同的页面结构或限制访问,导致元素定位失效。可以尝试配置ChromeOptions添加模拟浏览器的User-Agent,或者使用无头模式,降低被识别为爬虫的概率。
修正后的示例代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC path = r'C:\Users\.wdm\drivers\chromedriver\win32\108.0.5359\chromedriver.exe' s = Service(path) # 配置浏览器选项,添加User-Agent options = webdriver.ChromeOptions() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36") browser = webdriver.Chrome(service=s, options=options) browser.get('https://www.amazon.in') browser.maximize_window() # 显式等待搜索框加载 input_search = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.ID, 'twotabsearchtextbox')) ) search_button = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.XPATH, "(//input[@type='submit'])[1]")) ) input_search.send_keys("Smartphones under 10000") search_button.click() products = [] wait = WebDriverWait(browser, 15) for i in range(10): print('Scraping page', i+1) # 等待商品元素加载完成 product_elements = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.a-size-medium.a-color-base.a-text-normal')) ) for p in product_elements: if p.text: # 过滤空文本元素 products.append(p.text) try: # 等待下一页按钮可点击 next_button = wait.until( EC.element_to_be_clickable((By.CLASS_NAME, 'a-last')) ) next_button.click() except: print("已无更多页面,停止爬取") break print(f"商品总数:{len(products)}") print("前5个商品名称:") for name in products[:5]: print(name) browser.quit()
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

