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

如何修改Selenium代码实现Target商品全评论抓取(自动点击加载更多)

实现Target商品评论全量抓取(自动点击加载更多)

修改思路

要抓取所有评论,核心是循环定位并点击「加载更多」按钮,直到按钮不再显示(所有评论加载完成)。具体逻辑:

  • 页面加载后滚动到评论区域,确保加载按钮可见
  • 循环查找并点击加载按钮,每次点击后等待新评论加载完成
  • 所有评论加载完毕后,统一抓取并保存数据

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import configparser
from datetime import datetime
import time
import json

parser = configparser.RawConfigParser()
parser.read('config.ini')
url = parser['PROPERTIES']['URL']
OMIT_KEYWORDS = parser['FILTERS']['OMIT'].split(',')
INCLUDE_KEYWORDS = parser['FILTERS']['INCLUDE'].split(',')
END_DATE = datetime.strptime(parser['DATE']['END'], '%Y-%m-%d')
START_DATE = datetime.strptime(parser['DATE']['START'], '%Y-%m-%d')
minimum_comment_length = int(parser['PROPERTIES']['MIN_COMMENT_LENGTH'])
maximum_comment_length = int(parser['PROPERTIES']['MAX_COMMENT_LENGTH'])

# 配置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\Target\chromedriver.exe'
service = ChromeService(executable_path=CHROMEDRIVER_PATH)
driver = webdriver.Chrome(service=service, options=options)
wait = WebDriverWait(driver, 20)

try:
    driver.get(url)
    driver.implicitly_wait(10)
    time.sleep(2)

    # 滚动到页面底部,触发评论区加载
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(1)

    # 循环点击「加载更多」按钮
    while True:
        try:
            # 等待加载按钮可点击
            load_more_btn = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-test="load-more"]'))
            )
            # 滚动到按钮位置,避免被页面元素遮挡
            driver.execute_script("arguments[0].scrollIntoView(true);", load_more_btn)
            time.sleep(1)
            load_more_btn.click()
            # 等待新评论加载完成(通过按钮失效判断)
            wait.until(EC.staleness_of(load_more_btn))
            time.sleep(2)
        except Exception:
            # 按钮不存在或无法点击时,退出循环
            print("所有评论已加载完成,退出循环")
            break

    # 抓取所有评论数据
    reviews = driver.find_elements(By.CSS_SELECTOR, ".styles__ReviewRow-sc-4u2mi2-1")
    item_list = []

    for review in reviews:
        # 单条评论捕获异常,避免某条评论元素缺失导致程序崩溃
        try:
            stars = review.find_element(By.CSS_SELECTOR, '.utils__ScreenReaderOnly-sc-1b93ups-0.dsPOPg').text.replace("out of 5 stars", "")
            username = review.find_element(By.XPATH, ".//span[contains(@data-test,'review-card--username')]").text
            title = review.find_element(By.XPATH, ".//h4[contains(@data-test,'review-card--title')]").text
            review_text = review.find_element(By.CSS_SELECTOR, '.h-margin-t-default.h-text-md').text
        except Exception as e:
            print(f"抓取单条评论失败: {e}")
            continue

        item = {
            'stars': stars.strip(),
            'username': username,
            'userurl': "NA",
            'title': title,
            'review_text': review_text,
            'permalink': "NA",
            'reviewlocation': "NA",
            'subproductname': "NA",
            'subproductlink': "NA",
        }
        item_list.append(item)

    # 保存到JSON文件
    print(f"共抓取到{len(item_list)}条评论")
    with open("output.json", "w", encoding='utf-8') as outfile:
        json.dump(item_list, outfile, ensure_ascii=False, indent=4)

finally:
    # 确保浏览器资源被释放
    driver.quit()

关键修改点说明

  1. 循环加载逻辑:
    • 用while True循环配合异常捕获,自动判断是否还有更多评论可加载
    • 通过staleness_of等待按钮失效,确保新评论完全加载后再进行下一次点击
  2. 元素定位优化:
    • 替换Selenium旧版定位语法,使用Selenium 4推荐的find_elements(By.XXX, ...)格式
    • 单条评论加入异常处理,避免因个别评论元素缺失导致程序中断
  3. 文件写入优化:
    • 改用w模式覆盖写入,避免原r+模式导致的文件内容错乱
    • 添加encoding='utf-8'和ensure_ascii=False,保证中文评论正常显示
  4. 资源管理:
    • 用finally块确保浏览器一定会关闭,避免资源泄漏

注意事项

  • 若Target页面更新元素选择器,需对应调整「加载更多」按钮和评论元素的定位符
  • 可根据网络情况调整time.sleep()的时长,平衡抓取效率和稳定性
  • 频繁请求可能触发反爬,建议加入随机等待间隔降低风险

内容的提问来源于stack exchange,提问作者user16508648

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:01:16