使用Selenium爬取Influenseter仅获单条评论数据的问题求助
解决Influenster评论爬取仅获取单条数据的问题
问题根源
你当前的XPath //*[@id="app-base"]/div[1]/div[4]/div[1]/div[1]/div[3] 定位的是整个评论列表的外层容器,而非每条评论的独立节点,所以find_elements_by_xpath只会返回1个元素,循环自然只执行一次,最终只拿到一条数据。
另外,你使用的find_elements_by_xpath是Selenium已弃用的旧API,建议替换为符合最新规范的定位方式。
修复方案
1. 定位每条评论的正确节点
观察目标页面的DOM结构,每条评论的独立容器可以用以下XPath定位://div[@data-testid='review-card']
或者更通用的类名定位://div[contains(@class, 'review-card')]
2. 添加滚动加载逻辑
Influenster的评论是滚动加载模式,仅获取当前可见区域的评论会遗漏后续内容,需要模拟滚动到底部触发加载,直到没有新评论出现。
3. 替换为Selenium最新API
将旧的find_element_by_xpath/find_elements_by_xpath替换为find_element(By.XPATH, ...)/find_elements(By.XPATH, ...)。
完整修复代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import configparser from datetime import datetime import time parser = configparser.RawConfigParser() parser.read('config.ini') url = parser['PROPERTIES']['URL'] END_DATE = datetime.strptime(parser['DATE']['END'], '%Y-%m-%d') START_DATE = datetime.strptime(parser['DATE']['START'], '%Y-%m-%d') # 配置Chrome选项 options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) CHROMEDRIVER_PATH = r'C:\Users\HP\Desktop\INTERNSHIP\influenster\chromedriver.exe' service = ChromeService(executable_path=CHROMEDRIVER_PATH) driver = webdriver.Chrome(service=service, options=options) driver.get(url) # 等待页面加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//div[@data-testid='review-card']"))) item_list = [] last_height = driver.execute_script("return document.body.scrollHeight") while True: # 获取当前页面所有评论节点 reviews = driver.find_elements(By.XPATH, "//div[@data-testid='review-card']") # 遍历评论,提取用户名(跳过已爬取的内容) for review in reviews[len(item_list):]: try: username = review.find_element(By.XPATH, ".//a[contains(@class,'name')]").text item_list.append({'username': username}) except Exception as e: print(f"提取用户名失败: {str(e)}") continue # 滚动到底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) # 等待加载新内容 # 检查是否加载了新内容,没有则退出循环 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 打印结果 print(f"共爬取到 {len(item_list)} 条用户名") for item in item_list: print(item) driver.quit()
关键说明
- 滚动加载逻辑:通过对比滚动前后的页面高度,判断是否还有新评论加载,避免无限循环。
- 异常处理:添加
try-except避免单个评论提取失败导致整个程序崩溃。 - 显式等待:用
WebDriverWait确保评论节点加载完成后再开始爬取,避免空列表。
内容的提问来源于stack exchange,提问作者user16508648
相关产品推荐
相关产品推荐

