你是否想过,那些电商平台上成千上万的商品评论,其实可以用代码批量抓取?今天,我将以爬取苏宁手机评论为例,从零开始讲解 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安装 Python(已安装可跳过)
\n- \n
- 打开 Python 官网(https://www.python.org/downloads/),下载对应系统的安装包。 \n
- 安装时勾选 Add Python to PATH(关键!否则后续无法在命令行调用 Python)。 \n
- 验证:打开电脑的命令提示符(CMD),输入
,如果显示 Python 版本号,说明安装成功。python --version\n
安装 Selenium 库
\n- \n
- 打开 CMD,输入命令:
。pip install selenium\n - 等待安装完成,输入
,如果显示 Selenium 的版本信息,说明安装成功。pip show selenium\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)库导入部分:
\nfrom 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
:指定 Edge 浏览器的安装路径,不同电脑可能路径不同(比如有的是__browser_url)。C:\Program Files\Microsoft\Edge\Application\msedge.exe\n :创建浏览器配置对象,相当于给浏览器设置参数。chrome_options\n :创建浏览器驱动对象,后续所有操作(打开网页、点击按钮)都通过这个对象完成。driver = webdriver.Edge(...)\n
(3)访问网页 + 保存文件:
\nreview_url = '目标URL'
driver.get(review_url) # 打开指定网页
yzpj_file = open('优质评价.txt', 'w') # 打开本地文件,'w'表示“写入模式”\n- \n
:模拟手动在浏览器地址栏输入 URL 并回车。driver.get(url)\n :在代码同级目录创建/打开优质评价.txt 文件,准备写入评论内容。open('优质评价.txt', 'w')\n
(4)提取评论的函数:
\ndef 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
:按类名查找网页中所有评论元素(打开苏宁评论页,按 F12 可看到评论内容的 class 是 body-content)。driver.find_elements(By.CLASS_NAME, 'body-content')\n :提取元素的文本内容(也就是评论本身)。element.text\n :把提取的评论写入文件,file.write(...)表示换行。\n\n
(5)翻页逻辑:
\nnext_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
:按 XPath 定位下一页按钮。find_elements_by_xpath(...)\n :如果找到下一页按钮,就进入循环。while next_elements != []\n :模拟手动点击下一页按钮。next_element.click()\n
循环执行点击下一页→提取评论,直到找不到下一页按钮为止。
\n\n基础版代码的问题与优化
\n运行上面的基础版代码,大概率会报错或出现各种问题,主要原因有:
\n问题 1: 已被废弃find_elements_by_xpath
新版 Selenium 中,、find_elements_by_xpath() 等写法已经被移除,必须改用统一的写法 find_elements_by_class_name(),否则会直接报错。find_elements(By.XPATH, '路径')
问题 2:缺少等待机制,页面加载不完整
\n基础版只用了 (固定等待 1 秒),但网页加载速度受网络影响,1 秒可能不够——代码执行到查找评论元素时,页面还没加载完,就会出现找不到元素的错误。time.sleep(1)
问题 3:文件操作不规范,容易丢失数据
\n直接用 打开文件,如果代码中途报错,文件会来不及关闭,导致已写入的内容丢失;且没有指定编码,爬取中文评论时会出现乱码。open(...)
问题 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:自动检测浏览器路径
\nedge_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
优化 3:规范的文件操作
\nwith open('优质评价.txt', 'w', encoding='utf-8') as yzpj_file:
# 写入操作...\n- \n
:无论代码是否报错,都会自动关闭文件,避免数据丢失。with语句\n :指定编码格式,彻底解决中文乱码问题。encoding='utf-8'\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步骤 1:新建 Python 文件
\n在电脑桌面(或任意文件夹)右键 → 新建 → 文本文档;将文本文档重命名为 (注意:后缀必须是 苏宁评论爬虫.py,如果看不到后缀,需要在文件夹选项中勾选显示文件扩展名)。.py
步骤 2:粘贴代码
\n双击打开 文件,将上面的好评/差评代码完整粘贴进去,保存并关闭。苏宁评论爬虫.py
步骤 3:运行代码
\n右键点击 → 选择用 Python 打开(或打开方式→选择 Python);此时会弹出一个命令行窗口,同时自动打开 Edge 浏览器,开始爬取评论;等待运行完成(命令行窗口显示爬取完成),关闭窗口即可。苏宁评论爬虫.py
步骤 4:查看结果
\n回到代码所在文件夹,会看到生成的 /好评.txt 文件,双击打开即可查看爬取的评论内容。差评.txt
常见问题解决
\n问题 1:运行代码时提示找不到 Python
\n原因:安装 Python 时未勾选 Add Python to PATH;解决:重新安装 Python,务必勾选该选项;或手动配置环境变量(新手建议重新安装)。
\n问题 2:爬取的文件为空/只有部分评论
\n原因:页面加载不完整,或元素定位失败;解决:增加 中的数字(比如改为 3);检查网页中评论元素的 class 是否为 time.sleep(2)(按 F12 查看);确保网络通畅,避免页面加载超时。body-content
问题 3:中文乱码
\n原因:文件写入时未指定编码;解决:确保 中包含 open(...)。encoding='utf-8'
问题 4:浏览器打开后立即关闭
\n原因:代码执行完成后调用了 ,属于正常现象;解决:如果想保留浏览器,可注释掉 driver.quit()(但不推荐,会残留进程)。driver.quit()
问题 5:提示找不到下一页按钮
\n原因:当前页面已经是最后一页,或下一页按钮的 XPath 路径变化;解决:这是正常提示,说明爬取已完成;如果确认有下一页但未爬取,需重新检查下一页按钮的 XPath。
\n\n[AFFILIATE_SLOT_2]
\n\n进阶思考:爬虫可以做什么?
\n爬取到评论后,我们还可以做更多事情:
\n- \n
- 评论分词/词云分析:用 jieba 库对评论分词,生成词云,直观看到高频词汇(比如电池耐用、拍照清晰、卡顿等)。 \n
- 情感分析:用第三方库(比如 snownlp)分析评论的情感倾向,统计好评/差评的占比。 \n
- 数据可视化:用 matplotlib 绘制好评/差评数量对比图,或高频问题的柱状图。 \n
- 批量爬取多个商品:修改代码,循环爬取多个商品的评论,做竞品分析。 \n
爬虫的注意事项
\n⚠️ 爬虫虽好,但也要注意规范使用:
\n- \n
- 遵守网站规则:爬取前查看网站的
文件(比如robots.txt),确认允许爬取的内容。https://www.suning.com/robots.txt\n - 控制爬取速度:不要频繁请求,避免给网站服务器造成压力(本文代码中设置了
,就是为了控制速度)。time.sleep(2)\n - 仅用于学习:本文代码仅作为学习用途,请勿用于商业用途或恶意爬取。 \n
- 注意 IP 封禁:如果频繁爬取,
浙公网安备 33010602011771号