如何使用Python+Selenium爬取宜家新加坡站点门店库存弹窗数据
基于Selenium的宜家新加坡站弹窗库存信息爬取实操步骤
- 前置准备:确保你的chromedriver版本和本地安装的Chrome浏览器版本完全匹配,调试阶段建议不开启无头模式,方便直观观察页面交互情况,排查问题。
- 第一步:处理页面遮挡元素,页面加载完成后优先点击cookie同意按钮,避免拦截后续按钮点击操作,代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化driver driver = webdriver.Chrome() driver.get("https://www.ikea.com/sg/en/p/knapper-standing-mirror-white-80396243/") driver.maximize_window() wait = WebDriverWait(driver, 10) # 点击接受cookie try: cookie_btn = wait.until(EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler"))) cookie_btn.click() except: # 没有cookie弹窗则跳过 pass
- 第二步:点击库存查询按钮,等待按钮完全可点击后再执行点击操作,避免点击失效:
stock_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Check in-store stock']/ancestor::button"))) stock_btn.click()
- 第三步:等待弹窗加载完成,宜家的库存弹窗为页面内动态生成的模态框,默认不需要切换新窗口,若定位不到元素可先检查是否嵌套了iframe,如有则先切换到对应iframe:
# 可选:若弹窗嵌套在iframe中则执行切换,否则跳过 try: stock_iframe = wait.until(EC.presence_of_element_located((By.XPATH, "//iframe[contains(@src, 'stock-check')]"))) driver.switch_to.frame(stock_iframe) except: pass
- 第四步:提取门店和库存信息,定位弹窗内的所有门店条目,循环读取对应字段即可:
store_list = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "range-revamp-stock-check__store"))) result = [] for store in store_list: name = store.find_element(By.CLASS_NAME, "range-revamp-stock-check__store-name").text.strip() status = store.find_element(By.CLASS_NAME, "range-revamp-stock-check__stock-status-text").text.strip() result.append({ "门店名称": name, "库存状态": status }) # 输出结果验证 for item in result: print(item)
补充说明:如果点击按钮后弹出的是独立新窗口,可以通过
driver.window_handles获取所有窗口句柄,切换到新打开的窗口句柄后再执行元素定位,操作完成后如需返回原页面再切回原窗口句柄即可。若页面类名有更新,直接打开浏览器F12开发者工具,选中对应元素替换代码中的类名即可。
内容的提问来源于stack exchange,提问作者mathlau
相关产品推荐
相关产品推荐

