Selenium+BeautifulSoup爬取带Load more页无法获取新加载商品问题
问题根源
你的代码存在两个核心逻辑错误,导致无法获取动态加载的商品:
- 解析用的数据源完全错误:你单独写了
r=requests.get(url)发起独立HTTP请求,这份响应内容是网页首次加载的静态初始数据,和Selenium控制的浏览器环境完全隔离。你后续在浏览器里执行的所有点击"Load more"操作,都不会更新requests拿到的这份静态内容,因此不管点击多少次加载按钮,你用r.content初始化的soup里永远只有初始加载的36条商品。 - 点击加载后未等待内容渲染:循环点击加载按钮时没有加等待新内容加载的逻辑,点击后直接进入下一轮操作,很容易出现新商品还没完成渲染就执行后续解析的问题,进一步导致数据遗漏。
修复方案
- 删除多余的requests相关请求逻辑,所有页面内容统一从Selenium控制的浏览器实例中获取
- 所有"Load more"点击操作全部完成后,再通过
driver.page_source获取当前浏览器内渲染完成的完整页面源码,初始化BeautifulSoup做解析 - 每次点击加载按钮后增加显式等待,确认新商品已经渲染完成再执行下一步操作
修复后可运行代码
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager 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 allinfo=[] chrome_options = Options() chrome_options.add_experimental_option("detach", True) chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) url="https://zadaa.co/de-en/products/women/clothes-dresses/" driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),chrome_options=chrome_options) driver.get(url) wait = WebDriverWait(driver, 10) # 关闭初始弹窗 closebutton=wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="content"]/div[5]/button'))) closebutton.click() # 循环点击加载更多,每次点击后等待新商品加载 for x in range(9): button = wait.until(EC.element_to_be_clickable((By.ID, "load-more-products"))) # 滚动到按钮位置避免元素遮挡导致点击失败 driver.execute_script("arguments[0].scrollIntoView();", button) button.click() # 等待商品列表元素数量增加,确认新内容加载完成 wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, 'a.product-list-item')) > 36 + x*24) time.sleep(0.5) # 所有内容加载完成后,从浏览器当前渲染的页面源码初始化soup soup=BeautifulSoup(driver.page_source,"html.parser") content=soup.find_all('a',class_='product-list-item') for properties in content: brand=properties.find("p",class_='product-list-item-title').text.strip() info={ 'name':brand, } allinfo.append(info) df=pd.DataFrame(allinfo) print(f"共获取到{len(df)}条商品数据") print(df.head()) df.to_csv('zadaa.csv', index=False) driver.quit()
注:代码中每次点击后判断商品数量的阈值匹配目标站点加载规律:初始加载36条,每次点击加载更多新增24条,你可以根据实际页面加载的单页商品数调整阈值,确保所有新内容渲染完成后再执行下一步。
内容的提问来源于stack exchange,提问作者ähh24
相关产品推荐
相关产品推荐

