异步加载下实现用 Python + Selenium 高效爬取天猫商品评论(支持动态滚动和去重)
一、环境准备
-
Python 版本:建议 Python 3.8+
-
依赖库:
pip install selenium -
浏览器驱动:本文使用 Edge + EdgeDriver(配置好谷歌驱动也可以使用谷歌浏览器)
-
配置好
msedgedriver.exe的路径,例如D:\edgedriver_win64\msedgedriver.exe
二、爬虫思路
-
打开天猫商品详情页,扫码登录
-
点击「全部评价」按钮,加载评论弹层
-
激活评论区域焦点,便于模拟滚动
-
动态滚动页面,抓取最新评论
-
评论内容去重,并写入 CSV
-
设定最大评论数量,达到则停止
三、核心代码
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和评论互动数据,构建用户画像。 -
帮助电商平台实现精准推荐、个性化推送和促销策略优化。
更多推荐


所有评论(0)