一、环境准备

  1. Python 版本:建议 Python 3.8+

  2. 依赖库:

    pip install selenium
    
  3. 浏览器驱动:本文使用 Edge + EdgeDriver(配置好谷歌驱动也可以使用谷歌浏览器)

    • 下载地址:Microsoft Edge WebDriver

    • 配置好 msedgedriver.exe 的路径,例如 D:\edgedriver_win64\msedgedriver.exe

二、爬虫思路

  1. 打开天猫商品详情页,扫码登录

  2. 点击「全部评价」按钮,加载评论弹层

  3. 激活评论区域焦点,便于模拟滚动

  4. 动态滚动页面,抓取最新评论

  5. 评论内容去重,并写入 CSV

  6. 设定最大评论数量,达到则停止

三、核心代码

1.Edge 配置(反自动化检测)

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options

# Edge 配置
edge_options = Options()
edge_options.add_argument("--start-maximized")  # 启动时最大化窗口
edge_options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用自动化检测
edge_options.add_experimental_option("excludeSwitches", ["enable-automation"])
edge_options.add_experimental_option("useAutomationExtension", False)

service = Service(r"PATH_TO_EDGEDRIVER")  # 替换为你本地 EdgeDriver 路径
driver = webdriver.Edge(service=service, options=edge_options)

# 隐藏 navigator.webdriver 标识,提高反爬成功率
driver.execute_cdp_cmd(
    "Page.addScriptToEvaluateOnNewDocument",
    {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"}
)

解析:

  • --start-maximized:确保页面元素加载正常,避免隐藏元素无法操作。

  • AutomationControlled & excludeSwitches:防止网站检测到 Selenium 自动化标识。

  • execute_cdp_cmd:通过 Chrome DevTools Protocol 隐藏 navigator.webdriver,提升反爬能力。

2.打开商品页并扫码登录

import time

PRODUCT_URL = "YOUR_PRODUCT_PAGE_URL"  # 替换为目标商品链接
driver.get(PRODUCT_URL)

print("🕒 请在 30 秒内完成扫码登录")
time.sleep(30)  # 等待扫码完成登录

解析:

  • 天猫或淘宝需要扫码登录,不能直接使用账号密码。

  • time.sleep(30) 给用户充足时间扫码,实际可根据网络和设备调整。

  • 登录完成后才能访问评论层,否则后续元素无法加载。

3.点击「全部评价」并加载评论

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 30)

# 滚动到底部,确保按钮可见
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

all_comments_btn = wait.until(
    EC.presence_of_element_located((By.XPATH, "//div[contains(text(),'全部评价')]"))
)
driver.execute_script("arguments[0].click();", all_comments_btn)

print("✅ 已点击全部评价")

解析:

  • WebDriverWait + EC.presence_of_element_located:显式等待按钮加载完成,防止找不到元素报错。

  • 滚动到底部保证「全部评价」按钮可点击,因为很多动态加载页面按钮默认不可见。

  • 使用 execute_script 点击按钮,提高稳定性,避免覆盖或被其他元素遮挡。

4.激活评论区域焦点

from selenium.webdriver.common.action_chains import ActionChains

comment_layer = wait.until(
    EC.presence_of_element_located((By.XPATH, "//div[contains(@class,'comment-layer')]"))
)

# 点击评论层空白区域,激活焦点
ActionChains(driver).move_to_element_with_offset(comment_layer, 50, 10).click().perform()
time.sleep(1)
print("✅ 评论区域已激活焦点")

解析:

  • 动态评论通常在弹层,需要点击才能滚动。

  • move_to_element_with_offset:点击评论区域的空白处,避免点击到评论按钮或链接导致弹窗。

  • 激活焦点后,才能使用 Keys.PAGE_DOWN 模拟滚动加载更多评论。

5.解析网页

import hashlib

def hash_text(text):
    """生成评论哈希,用于去重"""
    return hashlib.md5(text.encode("utf-8")).hexdigest()

seen_comments = set()
TARGET_COUNT = 500
comments_scraped = 0

while comments_scraped < TARGET_COUNT:
    comment_blocks = driver.find_elements(By.XPATH, "//div[contains(@class,'comment-item')]")
    
    for block in comment_blocks[-10:]:  
        try:
            comment_text = block.find_element(By.CSS_SELECTOR, "div.comment-content").text.strip()
            if not comment_text or hash_text(comment_text) in seen_comments:
                continue  # 跳过空评论或重复评论
            seen_comments.add(hash_text(comment_text))

            username = block.find_element(By.CSS_SELECTOR, "span.username").text.strip()
            purchase_info = block.find_element(By.CSS_SELECTOR, "div.purchase-info").text.split("\n")
            purchase_time = purchase_info[0] if len(purchase_info) > 0 else ""
            purchase_model = purchase_info[1] if len(purchase_info) > 1 else ""
            likes = block.find_element(By.CSS_SELECTOR, "span.likes").text.strip() or "0"
            replies = block.find_element(By.CSS_SELECTOR, "span.replies").text.strip() or "0"

            print(username, purchase_time, purchase_model, likes, replies, comment_text)
            comments_scraped += 1
            if comments_scraped >= TARGET_COUNT:
                break
        except:
            continue

解析:

  • 动态去重:通过 hashlib.md5 对评论内容生成哈希值,避免重复抓取。

  • 只解析最后几条评论,防止重复处理前面已经抓取过的评论,提高性能。

  • 使用 try/except 捕获异常,避免某些元素缺失导致整个爬虫崩溃。

6.写入csv

import csv

csv_path = "comments_output.csv"

with open(csv_path, "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["username", "purchase_time", "purchase_model", "likes", "replies", "comment"])

    # 假设 comments_data_list 是解析后的数据列表
    for data in comments_data_list:
        writer.writerow([
            data['username'],
            data['purchase_time'],
            data['purchase_model'],
            data['likes'],
            data['replies'],
            data['comment']
        ])

print(f"✅ 已保存评论到 {csv_path}")

解析:

  • utf-8-sig 避免 Excel 打开 CSV 出现乱码。

  • 边爬边写 CSV 可以减少数据丢失风险。

  • CSV 列与爬取字段对应,便于后续分析和处理。

四、结果展示

1.字段说明

  • username:评论用户昵称

  • buy_time:购买时间(年月)

  • buy_model:购买的商品型号

  • reply_cnt:该评论的回复数量

  • like_cnt:该评论的点赞数量

  • comment:用户评论内容

2.数据展示

成功爬取5000条天猫评论数据~(代码设定,也可以设置成1000、10000等等)

五、应用

1.词云图

词云图能够直观显示评论文本中高频词,帮助我们快速识别用户关注的重点。

2.语义网络分析

语义网络分析可以展示评论中词与词之间的关系,帮助识别关键词之间的关联及用户关注的核心主题。

3.数据可视化与趋势分析

基于评论数据进行可视化趋势分析:

  • 点赞数与评论数分布:分析评论的受欢迎程度及互动活跃度。

  • 购买时间分布:分析产品的销售高峰和用户活跃时间段。

4.情感分析与产品改进

  • 对 comment 文本进行情感分类,统计正面/负面评论比例。

  • 识别用户痛点,例如“电池续航短”“拍照模糊”,为研发团队提供改进方向。

  • 评论情感变化:结合情感分析工具,观察不同时间段用户的满意度变化。

5.用户画像与精准营销

  • 基于 buy_model、buy_time 和评论互动数据,构建用户画像。

  • 帮助电商平台实现精准推荐、个性化推送和促销策略优化。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐