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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:30:42