You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的爬虫无法抓取目标元素?DeWalt网站爬取求助

DeWalt官网SKU与产品描述爬取失败原因及修复方案

核心问题:元素定位错误

你的代码无法抓取目标元素的主要原因是使用By.CLASS_NAME定位多类名元素,Selenium的CLASS_NAME方法不支持空格分隔的多个类名(空格会被识别为类名的一部分,而非多个类的组合)。此外,等待条件和滚动后的元素加载逻辑也需要优化。

具体错误点分析

  1. 多类名定位失效:
    原代码中:

    skus = container.find_elements(By.CLASS_NAME, 'coh-inline-element product-sku')
    descriptions = container.find_elements(By.CLASS_NAME, 'coh-link subtitle card-link product-title')
    

    'coh-inline-element product-sku'是两个独立类名,By.CLASS_NAME无法识别这种格式,导致返回空列表。

  2. 等待条件不够精准:
    原代码仅等待#product-list容器存在,但容器内的产品元素可能尚未完全加载,直接定位会抓不到内容。

修复方案

  1. 替换元素定位方式:
    改用By.CSS_SELECTOR定位多类名元素,格式为.类名1.类名2(类名之间用点连接,无空格)。
  2. 优化等待逻辑:
    滚动后等待产品元素可见,确保元素已加载完成再进行抓取。
  3. 调整滚动策略:
    滚动到页面底部触发更多产品加载(可根据实际情况调整滚动次数)。

修复后的完整代码

import undetected_chromedriver as uc
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time

options = Options()
driver = uc.Chrome()

website = 'https://www.dewalt.com/products/power-tools/drills'
driver.get(website)

# 等待产品列表容器可见
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#product-list')))
prod_num = []
prod_desc = []
container = driver.find_element(By.CSS_SELECTOR, '#product-list')

# 滚动加载更多产品,滚动到页面底部
for _ in range(4):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    # 等待新加载的产品SKU元素可见
    WebDriverWait(driver, 5).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR, '.product-sku')))

# 改用CSS_SELECTOR定位多类名元素
skus = container.find_elements(By.CSS_SELECTOR, '.coh-inline-element.product-sku')
descriptions = container.find_elements(By.CSS_SELECTOR, '.coh-link.subtitle.card-link.product-title')

for sku in skus:
    prod_num.append(sku.text.strip())
for desc in descriptions:
    prod_desc.append(desc.text.strip())

driver.quit()
print(f"抓取到SKU数量:{len(prod_num)}")
print(f"抓取到产品描述数量:{len(prod_desc)}")

# 生成CSV文件
df = pd.DataFrame({'code': prod_num, 'description': prod_desc})
df.to_csv('dewtest1.csv', index=False)
print(df)

额外注意事项

  • 若网站存在反爬机制,undetected_chromedriver已帮你处理部分,但仍需注意请求频率,避免被封禁。
  • 部分产品可能需要点击进入详情页才能获取完整信息,若当前列表页的SKU或描述不完整,需调整逻辑进入详情页抓取。

内容的提问来源于stack exchange,提问作者Ryan Houghton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:57:15