```json { "title": "Python 爬虫实战:从零开始抓取苏宁商品评论(好评+差评)", "content": "

你是否想过,那些电商平台上成千上万的商品评论,其实可以用代码批量抓取?今天,我将以爬取苏宁手机评论为例,从零开始讲解 Python 爬虫的实现过程。即使你是刚接触编程的新手,跟着步骤走也能轻松上手,最终实现自动爬取商品好评与差评,并保存到本地文件。

\n\n

爬虫入门:核心概念速览

\n

在动手写代码之前,我们先花几分钟搞懂几个基础概念,避免后续看到代码一脸懵。

\n

什么是爬虫?简单来说,爬虫就是模拟人的操作,自动访问网页、提取指定信息的程序。比如手动打开苏宁评论页,一页一页翻、复制评论内容,这个过程重复且枯燥,而爬虫可以替我们完成这些机械操作——自动打开浏览器、加载页面、提取评论、翻页、保存内容,全程无需人工干预。

\n

为什么选 Selenium?爬取网页的工具很多(比如 Requests+BeautifulSoup),但苏宁的评论页面采用了动态加载技术,普通的请求工具无法直接获取评论内容。而 Selenium 是一款自动化测试工具,可以模拟真实的浏览器操作(比如点击、翻页、等待页面加载),完美解决动态页面的爬取问题,对新手也非常友好。

\n

核心名词解释(小白友好版):

\n
    \n
  • 驱动(Driver):可以理解为代码和浏览器之间的桥梁,比如用 Selenium 控制 Edge 浏览器,就需要 Edge 驱动来传递指令。
  • \n
  • 定位元素:爬虫要提取评论内容,首先得找到评论在网页中的位置,这个过程就是定位元素,常用方式有按类名、按 XPath、按 ID 等。
  • \n
  • 等待机制:网页加载需要时间,如果代码执行速度比页面加载快,就会出现找不到元素的错误,所以需要设置等待,等页面加载完成后再执行后续操作。
  • \n
  • 翻页逻辑:判断页面是否有下一页按钮,有就点击,没有就停止,这是爬取多页内容的核心逻辑。
  • \n
\n\n

环境搭建:准备工作一步都不能少

\n

工欲善其事,必先利其器。在写代码之前,我们需要先搭建好运行环境,这是新手最容易踩坑的环节。

\n

安装 Python(已安装可跳过)

\n
    \n
  1. 打开 Python 官网(https://www.python.org/downloads/),下载对应系统的安装包。
  2. \n
  3. 安装时勾选 Add Python to PATH(关键!否则后续无法在命令行调用 Python)。
  4. \n
  5. 验证:打开电脑的命令提示符(CMD),输入 python --version,如果显示 Python 版本号,说明安装成功。
  6. \n
\n

安装 Selenium 库

\n
    \n
  1. 打开 CMD,输入命令:pip install selenium
  2. \n
  3. 等待安装完成,输入 pip show selenium,如果显示 Selenium 的版本信息,说明安装成功。
  4. \n
\n

关于浏览器驱动(新手不用手动下载)

\n

很多教程会让新手手动下载浏览器驱动,但新版 Selenium 已经实现了驱动自动管理——运行代码时,会自动检测你的浏览器版本,并下载匹配的驱动,无需手动操作,大大降低了新手的门槛。

\n\n

核心代码解析:从基础版到完整版

\n

我们先从最基础的代码开始,逐步拆解每一个功能,再修复其中的问题,最终得到一个健壮的完整版代码。

\n

基础版代码(小白入门级)

\n

先看一段最基础的爬取苏宁好评的代码,我们逐行解析:

\n

# 导入需要的库
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time
# 1. 配置Edge浏览器
# 定义Edge浏览器的安装路径(适配大多数Windows系统)
__browser_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# 创建配置对象
chrome_options = Options()
# 指定浏览器路径
chrome_options.binary_location = __browser_url
# 初始化浏览器驱动
driver = webdriver.Edge(options=chrome_options)
# 2. 访问苏宁好评页面
review_url = 'https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCm'
driver.get(review_url)
# 3. 打开本地文件,用于保存评论
yzpj_file = open('优质评价.txt', 'w')
# 4. 定义函数:提取当前页面的评论
def get_py_content(file):
    # 按类名定位评论元素(body-content是评论内容的类名)
    pj_elements_content = driver.find_elements(by=By.CLASS_NAME, value='body-content')
    # 遍历所有评论元素,提取文本并写入文件
    for i in range(len(pj_elements_content)):
        file.write(pj_elements_content[i].text + '\n')
# 5. 调用函数,获取第一页评论
get_py_content(yzpj_file)
# 6. 翻页逻辑:循环点击“下一页”
# 按XPath定位下一页按钮
next_elements = driver.find_elements_by_xpath('//*[@class="next rv-maidian "]')
# 如果找到下一页按钮,就点击
while next_elements != []:
    next_element = next_elements[0]
    time.sleep(1)  # 等待1秒,让页面加载
    next_element.click()  # 点击下一页
    get_py_content(yzpj_file)  # 提取新页面的评论
    next_elements = driver.find_elements_by_xpath('//*[@class="next rv-maidian "]')
# 7. 关闭文件
yzpj_file.close()

\n

基础版代码逐行解析(小白必看)

\n

(1)库导入部分:

\n

from selenium import webdriver  # 核心库,用于控制浏览器
from selenium.webdriver.edge.options import Options  # 用于配置浏览器选项
from selenium.webdriver.common.by import By  # 用于定位元素的常量
import time  # 用于设置等待时间

\n

这部分是导入工具,就像做饭前先把锅碗瓢盆准备好一样,后续代码需要用到这些库的功能。

\n

(2)浏览器配置部分:

\n

__browser_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
chrome_options = Options()
chrome_options.binary_location = __browser_url
driver = webdriver.Edge(options=chrome_options)

\n
    \n
  • __browser_url:指定 Edge 浏览器的安装路径,不同电脑可能路径不同(比如有的是 C:\Program Files\Microsoft\Edge\Application\msedge.exe)。
  • \n
  • chrome_options:创建浏览器配置对象,相当于给浏览器设置参数。
  • \n
  • driver = webdriver.Edge(...):创建浏览器驱动对象,后续所有操作(打开网页、点击按钮)都通过这个对象完成。
  • \n
\n

(3)访问网页 + 保存文件:

\n

review_url = '目标URL'
driver.get(review_url)  # 打开指定网页
yzpj_file = open('优质评价.txt', 'w')  # 打开本地文件,'w'表示“写入模式”

\n
    \n
  • driver.get(url):模拟手动在浏览器地址栏输入 URL 并回车。
  • \n
  • open('优质评价.txt', 'w'):在代码同级目录创建/打开优质评价.txt 文件,准备写入评论内容。
  • \n
\n

(4)提取评论的函数:

\n

def get_py_content(file):
    pj_elements_content = driver.find_elements(by=By.CLASS_NAME, value='body-content')
    for i in range(len(pj_elements_content)):
        file.write(pj_elements_content[i].text + '\n')

\n
    \n
  • driver.find_elements(By.CLASS_NAME, 'body-content'):按类名查找网页中所有评论元素(打开苏宁评论页,按 F12 可看到评论内容的 class 是 body-content)。
  • \n
  • element.text:提取元素的文本内容(也就是评论本身)。
  • \n
  • file.write(...):把提取的评论写入文件,\n 表示换行。
  • \n
\n

(5)翻页逻辑:

\n

next_elements = driver.find_elements_by_xpath('//*[@class="next rv-maidian "]')
while next_elements != []:
    next_element = next_elements[0]
    time.sleep(1)
    next_element.click()
    get_py_content(yzpj_file)
    next_elements = driver.find_elements_by_xpath('//*[@class="next rv-maidian "]')

\n
    \n
  • find_elements_by_xpath(...):按 XPath 定位下一页按钮。
  • \n
  • while next_elements != []:如果找到下一页按钮,就进入循环。
  • \n
  • next_element.click():模拟手动点击下一页按钮。
  • \n
\n

循环执行点击下一页→提取评论,直到找不到下一页按钮为止。

\n\n

基础版代码的问题与优化

\n

运行上面的基础版代码,大概率会报错或出现各种问题,主要原因有:

\n

问题 1:find_elements_by_xpath 已被废弃

\n

新版 Selenium 中,find_elements_by_xpath()find_elements_by_class_name() 等写法已经被移除,必须改用统一的写法 find_elements(By.XPATH, '路径'),否则会直接报错。

\n

问题 2:缺少等待机制,页面加载不完整

\n

基础版只用了 time.sleep(1)(固定等待 1 秒),但网页加载速度受网络影响,1 秒可能不够——代码执行到查找评论元素时,页面还没加载完,就会出现找不到元素的错误。

\n

问题 3:文件操作不规范,容易丢失数据

\n

直接用 open(...) 打开文件,如果代码中途报错,文件会来不及关闭,导致已写入的内容丢失;且没有指定编码,爬取中文评论时会出现乱码。

\n

问题 4:浏览器驱动未关闭,残留进程

\n

代码执行完后,没有关闭浏览器驱动,会导致电脑后台残留多个 Edge 进程,占用系统资源。

\n

问题 5:浏览器路径不兼容

\n

不同电脑的 Edge 安装路径可能不同(比如 32 位系统和 64 位系统),固定路径会导致部分电脑运行失败。

\n\n

完整版代码(修复所有问题)

\n

针对上面的问题,我们对代码进行全面优化,得到最终的完整版(以爬取好评为例):

\n

'''
爬取苏宁商品评论(好评)- 完整版
适用人群:Python零基础小白
功能:自动打开浏览器、爬取多页好评、保存到本地文件、自动关闭浏览器
'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
# ===================== 第一步:初始化浏览器驱动(兼容不同系统) =====================
def init_edge_driver():
    """
    初始化Edge浏览器驱动
    功能:自动检测Edge路径、添加防检测配置、设置隐式等待
    """
    # 创建浏览器配置对象
    chrome_options = Options()
    # 1. 自动检测Edge浏览器路径(兼容32/64位系统)
    edge_paths = [
        r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
        r"C:\Program Files\Microsoft\Edge\Application\msedge.exe"
    ]
    for path in edge_paths:
        if os.path.exists(path):
            chrome_options.binary_location = path
            break
    # 2. 添加防检测配置(避免被网站识别为爬虫)
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    # 3. 创建驱动对象 + 设置隐式等待(全局等待10秒)
    driver = webdriver.Edge(options=chrome_options)
    driver.implicitly_wait(10)  # 所有元素查找操作最多等待10秒
    return driver
# ===================== 第二步:核心爬取逻辑 =====================
if __name__ == "__main__":
    # 1. 初始化浏览器
    driver = init_edge_driver()
    print("浏览器已启动...")
    # 2. 目标URL(苏宁商品好评页)
    review_url = 'https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCm'
    # 3. 打开目标网页
    driver.get(review_url)
    print(f"已打开网页:{review_url}")
    # 4. 打开本地文件(用with语句自动关闭,避免数据丢失;指定UTF-8编码防中文乱码)
    with open('优质评价.txt', 'w', encoding='utf-8') as yzpj_file:
        # 定义提取评论的函数
        def get_comment_content(file):
            """
            提取当前页面的评论内容
            参数:file - 要写入的文件对象
            """
            # 显式等待:直到评论元素加载完成(最多等10秒)
            WebDriverWait(driver, 10).until(
                EC.presence_of_all_elements_located((By.CLASS_NAME, 'body-content'))
            )
            # 查找所有评论元素
            comment_elements = driver.find_elements(By.CLASS_NAME, 'body-content')
            # 遍历并写入文件
            for element in comment_elements:
                content = element.text.strip()  # 去除首尾空格
                if content:  # 过滤空评论
                    file.write(content + '\n\n')  # 空行分隔,提升可读性
                    print(f"已抓取评论:{content[:50]}...")  # 打印预览(只显示前50字)
        # ===== 第一步:提取第一页评论 =====
        print("开始抓取第一页评论...")
        get_comment_content(yzpj_file)
        # ===== 第二步:循环翻页提取 =====
        page_num = 2
        while True:
            try:
                # 显式等待:直到下一页按钮可点击(最多等5秒)
                next_button = WebDriverWait(driver, 5).until(
                    EC.element_to_be_clickable((By.XPATH, '//*[@class="next rv-maidian "]'))
                )
                # 点击下一页
                print(f"正在跳转到第{page_num}页...")
                next_button.click()
                time.sleep(2)  # 等待页面完全加载(动态页面必备)
                # 提取当前页评论
                get_comment_content(yzpj_file)
                page_num += 1
            except:
                # 捕获异常 = 没有下一页了,退出循环
                print("已爬取完所有页面!")
                break
    # ===================== 第三步:清理资源 =====================
    print("开始关闭浏览器...")
    driver.quit()  # 关闭浏览器+驱动(区别于driver.close(),后者只关标签页)
    print("爬取完成!评论已保存到「优质评价.txt」文件中。")

\n

完整版代码核心优化点解析

\n

优化 1:自动检测浏览器路径

\n

edge_paths = [
    r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
    r"C:\Program Files\Microsoft\Edge\Application\msedge.exe"
]
for path in edge_paths:
    if os.path.exists(path):
        chrome_options.binary_location = path
        break

\n

遍历两个常见的 Edge 安装路径,自动选择存在的路径,兼容不同系统。

\n

优化 2:智能等待机制(替代固定 sleep)

\n

# 显式等待:等评论元素加载完成
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, 'body-content'))
)
# 隐式等待:全局设置,所有元素查找最多等10秒
driver.implicitly_wait(10)

\n
    \n
  • 显式等待:针对特定元素设置等待,元素加载完成后立即执行,比固定 sleep 更高效。
  • \n
  • 隐式等待:全局生效,避免重复写等待代码。
  • \n
\n

优化 3:规范的文件操作

\n

with open('优质评价.txt', 'w', encoding='utf-8') as yzpj_file:
    # 写入操作...

\n
    \n
  • with语句:无论代码是否报错,都会自动关闭文件,避免数据丢失。
  • \n
  • encoding='utf-8':指定编码格式,彻底解决中文乱码问题。
  • \n
\n

优化 4:修复废弃的 API

\n

# 错误写法(已废弃)
driver.find_elements_by_xpath('xxx')
# 正确写法
driver.find_elements(By.XPATH, 'xxx')

\n

改用新版 Selenium 的标准写法,避免报错。

\n

优化 5:资源清理 + 防检测

\n

# 关闭浏览器+驱动,彻底清理进程
driver.quit()
# 添加防检测配置,降低被封IP的风险
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

\n\n

[AFFILIATE_SLOT_1]

\n\n

功能扩展:爬取苏宁商品差评

\n

掌握了好评的爬取方法,差评的爬取只需要修改两个地方:目标 URL + 输出文件名,核心逻辑完全一致。

\n

爬取差评的完整代码

\n

'''
爬取苏宁商品评论(差评)- 完整版
适用人群:Python零基础小白
功能:自动打开浏览器、爬取多页差评、保存到本地文件、自动关闭浏览器
'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
# ===================== 第一步:初始化浏览器驱动(兼容不同系统) =====================
def init_edge_driver():
    """
    初始化Edge浏览器驱动
    功能:自动检测Edge路径、添加防检测配置、设置隐式等待
    """
    chrome_options = Options()
    # 自动检测Edge浏览器路径(兼容32/64位系统)
    edge_paths = [
        r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
        r"C:\Program Files\Microsoft\Edge\Application\msedge.exe"
    ]
    for path in edge_paths:
        if os.path.exists(path):
            chrome_options.binary_location = path
            break
    # 添加防检测配置
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    # 创建驱动对象 + 设置隐式等待
    driver = webdriver.Edge(options=chrome_options)
    driver.implicitly_wait(10)
    return driver
# ===================== 第二步:核心爬取逻辑 =====================
if __name__ == "__main__":
    # 1. 初始化浏览器
    driver = init_edge_driver()
    print("浏览器已启动...")
    # 2. 目标URL(替换为差评URL)
    review_url = 'https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-bad.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166'
    # 3. 打开目标网页
    driver.get(review_url)
    print(f"已打开网页:{review_url}")
    # 4. 打开本地文件(文件名改为“差评.txt”)
    with open('差评.txt', 'w', encoding='utf-8') as bad_comment_file:
        # 定义提取评论的函数
        def get_comment_content(file):
            """提取当前页面的差评内容"""
            # 显式等待:直到评论元素加载完成
            WebDriverWait(driver, 10).until(
                EC.presence_of_all_elements_located((By.CLASS_NAME, 'body-content'))
            )
            # 查找所有差评元素
            comment_elements = driver.find_elements(By.CLASS_NAME, 'body-content')
            # 遍历并写入文件
            for element in comment_elements:
                content = element.text.strip()
                if content:
                    file.write(content + '\n\n')
                    print(f"已抓取差评:{content[:50]}...")
        # ===== 第一步:提取第一页差评 =====
        print("开始抓取第一页差评...")
        get_comment_content(bad_comment_file)
        # ===== 第二步:循环翻页提取 =====
        page_num = 2
        while True:
            try:
                # 显式等待:直到下一页按钮可点击
                next_button = WebDriverWait(driver, 5).until(
                    EC.element_to_be_clickable((By.XPATH, '//*[@class="next rv-maidian "]'))
                )
                # 点击下一页
                print(f"正在跳转到第{page_num}页...")
                next_button.click()
                time.sleep(2)
                # 提取当前页差评
                get_comment_content(bad_comment_file)
                page_num += 1
            except:
                print("已爬取完所有差评页面!")
                break
    # ===================== 第三步:清理资源 =====================
    print("开始关闭浏览器...")
    driver.quit()
    print("爬取完成!差评已保存到「差评.txt」文件中。")

\n

差评爬取的核心改动

\n

对比好评代码,差评代码仅改动了两处:

\n
    \n
  • 目标 URL:替换为你提供的苏宁差评 URL。
  • \n
  • 输出文件:将 优质评价.txt 改为 差评.txt,同时变量名从 yzpj_file 改为 bad_comment_file,让代码语义更清晰。
  • \n
  • 提示文字:将评论改为差评,方便运行时识别进度。
  • \n
\n\n

运行代码的详细步骤

\n

步骤 1:新建 Python 文件

\n

在电脑桌面(或任意文件夹)右键 → 新建 → 文本文档;将文本文档重命名为 苏宁评论爬虫.py(注意:后缀必须是 .py,如果看不到后缀,需要在文件夹选项中勾选显示文件扩展名)。

\n

步骤 2:粘贴代码

\n

双击打开 苏宁评论爬虫.py 文件,将上面的好评/差评代码完整粘贴进去,保存并关闭。

\n

步骤 3:运行代码

\n

右键点击 苏宁评论爬虫.py → 选择用 Python 打开(或打开方式→选择 Python);此时会弹出一个命令行窗口,同时自动打开 Edge 浏览器,开始爬取评论;等待运行完成(命令行窗口显示爬取完成),关闭窗口即可。

\n

步骤 4:查看结果

\n

回到代码所在文件夹,会看到生成的 好评.txt/差评.txt 文件,双击打开即可查看爬取的评论内容。

\n\n

常见问题解决

\n

问题 1:运行代码时提示找不到 Python

\n

原因:安装 Python 时未勾选 Add Python to PATH;解决:重新安装 Python,务必勾选该选项;或手动配置环境变量(新手建议重新安装)。

\n

问题 2:爬取的文件为空/只有部分评论

\n

原因:页面加载不完整,或元素定位失败;解决:增加 time.sleep(2) 中的数字(比如改为 3);检查网页中评论元素的 class 是否为 body-content(按 F12 查看);确保网络通畅,避免页面加载超时。

\n

问题 3:中文乱码

\n

原因:文件写入时未指定编码;解决:确保 open(...) 中包含 encoding='utf-8'

\n

问题 4:浏览器打开后立即关闭

\n

原因:代码执行完成后调用了 driver.quit(),属于正常现象;解决:如果想保留浏览器,可注释掉 driver.quit()(但不推荐,会残留进程)。

\n

问题 5:提示找不到下一页按钮

\n

原因:当前页面已经是最后一页,或下一页按钮的 XPath 路径变化;解决:这是正常提示,说明爬取已完成;如果确认有下一页但未爬取,需重新检查下一页按钮的 XPath。

\n\n

[AFFILIATE_SLOT_2]

\n\n

进阶思考:爬虫可以做什么?

\n

爬取到评论后,我们还可以做更多事情:

\n
    \n
  • 评论分词/词云分析:用 jieba 库对评论分词,生成词云,直观看到高频词汇(比如电池耐用、拍照清晰、卡顿等)。
  • \n
  • 情感分析:用第三方库(比如 snownlp)分析评论的情感倾向,统计好评/差评的占比。
  • \n
  • 数据可视化:用 matplotlib 绘制好评/差评数量对比图,或高频问题的柱状图。
  • \n
  • 批量爬取多个商品:修改代码,循环爬取多个商品的评论,做竞品分析。
  • \n
\n\n

爬虫的注意事项

\n

⚠️ 爬虫虽好,但也要注意规范使用:

\n
    \n
  • 遵守网站规则:爬取前查看网站的 robots.txt 文件(比如 https://www.suning.com/robots.txt),确认允许爬取的内容。
  • \n
  • 控制爬取速度:不要频繁请求,避免给网站服务器造成压力(本文代码中设置了 time.sleep(2),就是为了控制速度)。
  • \n
  • 仅用于学习:本文代码仅作为学习用途,请勿用于商业用途或恶意爬取。
  • \n
  • 注意 IP 封禁:如果频繁爬取,