使用Selenium与BeautifulSoup爬取数据仅前50条导出至CSV是什么原因?
问题根因
你生成BeautifulSoup对象的时机错误:当前代码在执行点击「加载更多」的循环操作前,就已经调用driver.page_source获取了初始页面的源码并生成了soup对象,后续加载出来的新商品数据完全没有被同步到这个soup里,所以最终查找元素时只能拿到页面初始加载的50条数据。
修复方案
调整代码逻辑顺序,将获取页面源码、生成soup的操作移动到所有加载操作完成之后,同时优化冗余逻辑:
import csv import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup wait = WebDriverWait(driver, 30) # 加载更多逻辑 while True: try: # 等待加载按钮可点击 load_more_btn = wait.until(EC.element_to_be_clickable((By.ID, 'showmoreresult'))) # 点击按钮 driver.execute_script("arguments[0].click();", load_more_btn) # 滚动到底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待1秒确保新内容渲染完成,可根据实际加载速度调整时长 time.sleep(1) except TimeoutException: # 按钮消失,全部加载完成,跳出循环 break # 全部加载完成后,再获取最新页面源码生成soup html = driver.page_source soup = BeautifulSoup(html, features="html.parser") # 导出描述信息 records_list = soup.find_all("div", class_="desc") print(records_list) with open(r'C:\directory\details.csv', 'a', newline='', encoding='utf-8') as f: writer = csv.writer(f) for item in records_list: # 直接提取纯文本内容,无需存储完整div标签,减少后续数据处理成本 writer.writerow([item.get_text(strip=True)]) writer.writerow(["New webpage"]) # 导出图片链接 image_links = soup.find_all("div", class_="thumb") print(image_links) with open(r'C:\directory\image_urls.csv', 'a', newline='', encoding='utf-8') as f: writer = csv.writer(f) for item in image_links: img_tag = item.find("img") if img_tag: # 直接提取图片链接存储 writer.writerow([img_tag.get("src", "")]) writer.writerow(["New webpage"])
额外优化建议
- 写CSV时指定
encoding='utf-8'可以避免特殊字符、外文乱码问题 with open上下文会自动关闭文件,不需要手动调用f.close()- 原逻辑中的标志变量X可以直接省略,用try-except捕获超时直接跳出循环更简洁
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

