为何我的爬虫无法抓取目标元素?DeWalt网站爬取求助
DeWalt官网SKU与产品描述爬取失败原因及修复方案
核心问题:元素定位错误
你的代码无法抓取目标元素的主要原因是使用By.CLASS_NAME定位多类名元素,Selenium的CLASS_NAME方法不支持空格分隔的多个类名(空格会被识别为类名的一部分,而非多个类的组合)。此外,等待条件和滚动后的元素加载逻辑也需要优化。
具体错误点分析
多类名定位失效:
原代码中: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无法识别这种格式,导致返回空列表。等待条件不够精准:
原代码仅等待#product-list容器存在,但容器内的产品元素可能尚未完全加载,直接定位会抓不到内容。
修复方案
- 替换元素定位方式:
改用By.CSS_SELECTOR定位多类名元素,格式为.类名1.类名2(类名之间用点连接,无空格)。 - 优化等待逻辑:
滚动后等待产品元素可见,确保元素已加载完成再进行抓取。 - 调整滚动策略:
滚动到页面底部触发更多产品加载(可根据实际情况调整滚动次数)。
修复后的完整代码
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
相关产品推荐
相关产品推荐

