Selenium爬虫抓取电商商品数据行字段错配问题排查
Selenium爬取商品列表字段错位问题修复
问题根因
字段错位完全是元素定位逻辑错误导致的:
- 你代码里定位的
//div[@class="product-collection products-grid row"]是整个商品列表的外层大容器,不是单个商品卡片 - 循环过程中你每次都从整个列表容器全局查找全页所有的商品标题、原价、特价元素,再按下标强行和成色标签匹配。只要页面上某类元素(比如部分商品没有原价划线标签)的总数和成色标签数量不一致,就会直接出现下标错位,把A商品的价格匹配到B商品上。
修正逻辑
必须以单个商品卡片为最小提取单位:先拿到页面所有独立的商品卡片元素,再逐个在每个卡片的内部范围查找对应的成色、标题、价格字段,从根源上避免跨商品匹配元素。
修正后可运行代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager import pandas as pd import time driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) search_url = "https://dealt.ae/collections/laptops" driver.get(search_url) time.sleep(3) ALL_ITEMS = [] # 定位所有单个商品卡片,页面单个商品对应class为product-item all_product_cards = driver.find_elements(By.CSS_SELECTOR, 'div.product-item') for card in all_product_cards: # 所有字段仅在当前商品卡片范围内查找,不会串到其他商品 # 提取成色 grade_ele = card.find_elements(By.CSS_SELECTOR, 'div.product-top span.product-metafild') grade = grade_ele[0].text if grade_ele else "" # 提取商品标题 title_ele = card.find_elements(By.CLASS_NAME, 'product-title') title = title_ele[0].text if title_ele else "" # 提取原价 old_price_ele = card.find_elements(By.CLASS_NAME, 'old-price') old_price = old_price_ele[0].text if old_price_ele else "" # 提取特价 special_price_ele = card.find_elements(By.CLASS_NAME, 'special-price') special_price = special_price_ele[0].text if special_price_ele else "" item = [grade, title, old_price, special_price] ALL_ITEMS.append(item) print(item) # 导出时加表头和utf-8-sig编码,避免Windows打开乱码 my_df = pd.DataFrame(ALL_ITEMS, columns=["成色等级", "商品描述", "原价", "特价"]) my_df.to_csv('laptop.csv', index=False, encoding='utf-8-sig') # 跑完关闭浏览器释放资源 driver.quit()
额外优化点
- 增加了元素非空判断,遇到缺字段(比如无原价)的商品不会触发索引越界报错,缺失值自动留空
- 去掉了循环内重复全局查找元素的冗余逻辑,爬取速度更快
- 导出csv默认加了表头和适配Windows的编码,不需要后续手动调整格式
内容的提问来源于stack exchange,提问作者user19399799
相关产品推荐
相关产品推荐

