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

Lowes数据爬虫分页失效问题排查及修复请求

问题描述

开发了一个爬取Lowes网站数据的程序,此前针对Home Depot开发的同类爬虫运行正常。该程序可成功爬取单页数据,但设置爬取多页时,始终重复爬取第一页内容,无法切换至后续页面。

问题原因分析
  • 分页等待逻辑缺失:调用driver.get请求新页面后,未等待页面完全刷新就立即抓取数据,Selenium仍读取旧页面的DOM元素,导致重复获取第一页内容。
  • 元素定位复用旧DOM:仅依赖pl类名定位产品容器,该容器在分页后未被DOM移除,仍保留第一页的元素内容,抓取时误读旧数据。
  • 分页参数未验证:假设分页参数Nao步长为24,但未确认Lowes网站实际的分页规则,可能参数名称或步长与网站实际逻辑不符。
修复方案

1. 强化页面加载验证

请求新页面后,先等待URL更新为当前分页的URL,确保页面完成跳转;同时等待新页面的产品元素加载完成,彻底避免读取旧DOM。

2. 重置元素定位

每次抓取前重新定位产品容器,强制获取当前页的最新DOM元素,不再复用之前的定位结果。

3. 确认分页参数规则

手动访问目标页面并点击分页,确认实际的分页参数(如Nao的步长是否为24),确保参数规则匹配网站逻辑。

修改后的完整代码

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


def scrape_page_data(current_page_offset):
    # 等待URL更新到当前分页,确保页面跳转完成
    WebDriverWait(driver, 10).until(EC.url_contains(f'Nao={current_page_offset}'))
    # 等待当前页的产品容器加载,确保是新页面的元素
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'pl')))
    # 重新定位容器,避免复用旧元素
    container = driver.find_element(By.CLASS_NAME, 'pl')

    # 滚动加载所有内容
    for _ in range(4):
        driver.execute_script("window.scrollBy(0, 2000);")
        time.sleep(2)

    prices = container.find_elements(By.CSS_SELECTOR, 'div.prdt-actl-pr')
    description = container.find_elements(By.CSS_SELECTOR, '.titl-cnt.titl.brnd-desc')

    return prices, description


def pagination(url, pages=1):
    prod_price = []
    prod_desc = []

    page_num = 0
    for i in range(1, pages + 1):
        target_url = f"{url}?Nao={page_num}"
        driver.get(target_url)

        prices, description = scrape_page_data(page_num)

        # 仅当当前页有有效数据时才添加,避免重复空数据
        if prices and description:
            prod_price.extend([p.text for p in prices])
            prod_desc.extend([d.text for d in description])

        print(f"已爬取第{i}页,累计价格数据:{len(prod_price)}条,描述数据:{len(prod_desc)}条")

        # 按网站实际每页产品数调整步长,需手动验证后修改
        page_num += 24
        time.sleep(3)  # 增加等待时间,降低反爬风险

    return prod_price, prod_desc


# 初始化配置
website = 'https://www.lowes.com/pl/Drywall-tape-Drywall-Building-supplies/4294769459'
options = Options()
driver = uc.Chrome(options=options)

# 爬取指定页数数据
prod_price, prod_desc = pagination(website, pages=2)

# 保存数据到CSV
df = pd.DataFrame({'price': prod_price, 'brand': prod_desc})
df.to_csv('lowestape.csv', index=False)
print(df)

driver.quit()

额外注意事项

  • 手动验证Lowes分页URL:点击第二页后查看地址栏,确认参数是否为Nao=24,若步长不符需调整page_num +=后的数值。
  • 若仍存在重复数据,可在driver.get后添加driver.refresh()强制刷新页面,或进一步延长等待时间。

内容的提问来源于stack exchange,提问作者ryan houghton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:07:16