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
相关产品推荐
相关产品推荐

