当前位置: 首页 > news >正文

爬虫实战案例(两个)

该博客展示两个简单的爬虫实战案例,一个是从人民邮电出版社上爬取其中一个分类的全部图书信息,另一个是在苏宁易购上爬取某个商品的好评和差评,用两个简单的案例讲解爬虫在实际情况下的运作流程

一、获取图书信息

需求:统计人民邯电出版社官网中与关键词“python”有关的全部图书,包含图书名、价格、作者名等信息,并将获取的信息写入“Excel图书汇总,txt”文件中。

流程:

  1. 配置浏览器并打开目标网站
  2. 搜索 "Python" 相关图书,进入完整列表页
  3. 遍历当前页图书,打开详情页提取信息并写入文件
  4. 自动点击下一页,重复爬取直到没有更多页面
  5. (理论上)完成后关闭文件

第一部分:导入依赖库

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
  1. selenium.webdriver:Selenium 的核心模块,用于控制浏览器
  2. Options:Edge 浏览器的配置选项类,用于设置浏览器启动参数
  3. Keys:提供键盘按键模拟(如回车、空格等)
  4. By:定位元素的方式集合(如通过类名、ID、XPATH 等定位元素)
  5. time:用于添加等待时间,确保页面元素加载完成

第二部分:定义信息获取函数 get_information

def get_information(driver):time.sleep(2)  # 等待2秒,确保页面加载完成# 定位所有图书图片元素(class为'book_img')eles_p = driver.find_elements(by=By.CLASS_NAME, value='book_img')for ele_p in eles_p:ele_p.click()  # 点击图书图片,打开图书详情页(新窗口)time.sleep(2)  # 等待新窗口加载# 获取所有窗口句柄,切换到最新打开的窗口(详情页)handles = driver.window_handlesdriver.switch_to.window(handles[-1])time.sleep(2)  # 等待详情页元素加载# 提取图书信息:书名、作者、价格、亮点(通过class定位元素并获取文本)name = driver.find_element(by=By.CLASS_NAME, value='book-name').textauthor = driver.find_element(by=By.CLASS_NAME, value='book-author').textprice = driver.find_element(by=By.CLASS_NAME, value='price').textsummary = driver.find_element(by=By.CLASS_NAME, value='book-summary').text# 将信息写入文件,用制表符分隔file.write(f'书名:{name}\t,作者:{author}\t,价格:{price}\t,亮点:{summary}\n')time.sleep(2)  # 等待写入完成driver.close()  # 关闭当前详情页窗口# 切换回图书列表页窗口handles = driver.window_handlesdriver.switch_to.window(handles[-1])time.sleep(1)  # 短暂等待,确保切换完成
  • 功能:从图书列表页遍历每本图书,打开详情页提取信息并写入文件
  • 关键逻辑:
    1. 通过find_elements批量获取图书图片元素
    2. 循环点击图片打开新窗口(详情页)
    3. 通过window_handles管理窗口切换(句柄是窗口的唯一标识)
    4. 提取信息后关闭详情页,切回列表页继续下一本

第三部分:初始化文件和浏览器配置

# 打开文件准备写入,编码为utf-8防止中文乱码
file = open('python图书信息汇总.txt', 'w', encoding='utf-8')# 配置Edge浏览器选项
edge_options = Options()
# 指定Edge浏览器的安装路径(非默认路径时需要手动设置)
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# 注释掉的代码:开启无头模式(不显示浏览器窗口,适合后台运行)
# edge_options.add_argument('--headless')# 初始化Edge浏览器驱动
driver = webdriver.Edge(options=edge_options)
  • 文件操作:以写入模式打开python图书信息汇总.txt,用于保存爬取的图书信息
  • 浏览器配置:
    1. 指定 Edge 可执行文件路径(解决浏览器安装路径非默认的问题)
    2. 无头模式被注释,说明当前会显示浏览器窗口(方便调试)

第四部分:访问网站并执行搜索

# 打开目标网站(人民邮电出版社官网)
driver.get('https://www.ptpress.com.cn/')# 定位搜索框(通过XPATH找第一个type为text的输入框),输入"Python"并回车搜索
element = driver.find_elements(By.XPATH, '//input[@type="text"]')[0].send_keys("Python" + Keys.RETURN)# 切换到搜索结果新窗口
handles = driver.window_handles
driver.switch_to.window(handles[-1])# 点击"查看更多"按钮(ID为'booksMore'),加载更多图书
elements = driver.find_element(by=By.ID, value='booksMore').click()# 切换到新打开的更多图书列表页
handles = driver.window_handles
driver.switch_to.window(handles[-1])
  • 访问网站:通过driver.get打开出版社官网
  • 搜索逻辑:
    1. 定位搜索框并输入 "Python",用Keys.RETURN模拟回车提交搜索
    2. 搜索结果会打开新窗口,通过switch_to.window切换到结果页
    3. 点击 "查看更多" 按钮加载完整列表,再次切换到新窗口

第五部分:爬取信息并翻页

# 调用函数爬取当前页图书信息
get_information(driver)# 循环点击下一页,继续爬取(无限循环,直到没有下一页会报错终止)
while True:driver.find_element(by=By.CLASS_NAME, value='ivu-page-next').click()  # 点击下一页按钮get_information(driver)  # 爬取下一页信息# 关闭文件(注:由于上面是无限循环,这行代码可能永远执行不到,需要手动处理循环终止)
file.close()
  1. 爬取逻辑:先爬取第一页信息,然后通过while True循环点击 "下一页" 按钮,持续爬取后续页面
  2. 潜在问题:循环没有终止条件,当没有下一页时(找不到ivu-page-next元素)会抛出异常,导致程序终止,文件可能无法正常关闭(实际使用时需要添加异常处理)

二、获取评价

平时训练模型时需要用到大量数据 ,而这些数据不是人工一步步输入的,爬虫这这方被大量使用,获取商品的好评和差评是最常见的操作。现在需要获取苏宁易购上面某个商品的好评和差评。

流程:

  1. 定义获取评价的通用函数get_pj
  2. 配置浏览器并爬取优质评价(多页)
  3. 切换到差评页面,爬取所有差评(多页)
  4. 分别将优质评价和差评保存到不同文件

第一部分:导入依赖库

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time
  1. 导入 Selenium 相关模块用于浏览器控制和元素定位
  2. By用于指定元素定位方式
  3. time用于添加等待时间,确保页面加载完成

第二部分:定义获取评价的函数 get_pj

def get_pj(file):# 定位所有评价内容元素(class为'body-content')pj_element_content = driver.find_elements(by=By.CLASS_NAME, value='body-content')# 遍历所有评价元素,将文本写入文件for i in range(len(pj_element_content)):file.write(pj_element_content[i].text + '\n')
  • 功能:从当前页面提取所有评价内容并写入指定文件
  • 实现逻辑:
    1. 通过find_elements批量获取 class 为body-content的评价元素
    2. 循环遍历每个评价元素,将文本内容写入文件(每条评价后加换行)

第三部分:爬取优质评价

# 打开文件用于保存优质评价,编码为utf-8防止中文乱码
yzp_file = open('优质评价.txt', 'w', encoding='utf-8')# 配置Edge浏览器选项
edge_options = Options()
# 指定Edge浏览器的安装路径
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# 注释掉的代码:开启无头模式(不显示浏览器窗口)
# edge_options.add_argument('--headless')# 初始化Edge浏览器驱动
driver = webdriver.Edge(options=edge_options)# 打开优质评价页面
driver.get('https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166')# 定位"下一页"按钮(通过CSS选择器)
next_go = driver.find_elements(By.CSS_SELECTOR, '.next.rv-maidian')
time.sleep(2)  # 等待页面加载# 调用函数获取当前页的优质评价
get_pj(yzp_file)# 循环翻页获取所有优质评价
while next_go != []:next_go = next_go[0]  # 获取第一个"下一页"按钮元素time.sleep(2)  # 等待页面稳定next_go.click()  # 点击下一页get_pj(yzp_file)  # 获取当前页评价# 重新定位下一页按钮(避免元素过时)next_go = driver.find_elements(By.CSS_SELECTOR, '.next.rv-maidian')# 关闭优质评价文件
yzp_file.close()
# 关闭当前浏览器窗口
driver.close()
  • 优质评价爬取流程:
    1. 初始化浏览器并打开优质评价页面
    2. 定位 "下一页" 按钮元素
    3. 先爬取第一页评价
    4. 通过while循环判断是否有下一页:
      • 有下一页则点击并爬取当前页评价
      • 无下一页则退出循环
    5. 完成后关闭文件和当前窗口

第四部分:爬取差评

# 打开差评页面
driver.get('https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-bad.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166')# 定位"下一页"按钮(注意:这里定位方式有语法错误,class名之间不应有空格)
next_go = driver.find_elements(by=By.CLASS_NAME, value='next rv-maidian ')# 打开文件用于保存差评
cpl_file = open('差评.txt', 'w', encoding='utf-8')# 调用函数获取当前页的差评
get_pj(cpl_file)# 循环翻页获取所有差评
while next_go != []:next_go = next_go[0]  # 获取第一个"下一页"按钮元素time.sleep(2)  # 等待页面稳定next_go.click()  # 点击下一页get_pj(cpl_file)  # 获取当前页评价# 重新定位下一页按钮(使用正确的CSS选择器)next_go = driver.find_elements(By.CSS_SELECTOR, '.next.rv-maidian')# 关闭差评文件
cpl_file.close()
# 关闭浏览器窗口
driver.close()
  • 差评爬取流程与优质评价类似,但有一个潜在问题:
    • 定位下一页按钮时使用了By.CLASS_NAME, value='next rv-maidian ',这是错误的
    • CLASS_NAME不能同时指定多个类名(空格会被当作作文本的一部分),正确做法是使用 CSS 选择器(如前面的.next.rv-maidian
  • 整体逻辑:打开差评页面 → 爬取当前页 → 循环翻页爬取 → 关闭文件和窗口

http://www.dtcms.com/a/289392.html

相关文章:

  • Open64 WHIRL
  • `tidyverse` 长表、宽表的处理
  • 使用Qt6 QML/C++ 和CMake构建海康威视摄像头应用(代码开源)
  • 看板流程标准化和灵活性如何平衡
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • 深入分析linux内核源代码
  • PID控制原理分析及应用(稳态误差详细分析)(一)
  • 【高等数学】第四章 不定积分——第四节 有理函数的积分
  • 【LeetCode 热题 100】124. 二叉树中的最大路径和——DFS
  • [Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏
  • Servlet API 详解
  • 佛经个人阅读(二)《金刚经》解析
  • git fork的项目远端标准协作流程 仓库设置[设置成upstream]
  • 基于自定义数据集微调SigLIP2-分类任务
  • C语言:深入理解指针(2)
  • FreeRTOS学习笔记之内存管理
  • Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?
  • LeetCode 121. 买卖股票的最佳时机
  • Docker安装mysql、redis
  • 学习日志15 python
  • 深入理解Graphite协议:数据采集、存储与可视化的核心技术
  • [硬件电路-57]:根据电子元器件的受控程度,可以把电子元器件分为:不受控、半受控、完全受控三种大类
  • 65-OVP保护电路
  • 医学图像超分辨率重建深度学习模型开发报告
  • [硬件电路-58]:根据电子元器件的控制信号的类型分为:电平控制型和脉冲控制型两大类。
  • FNAF同人:简陋的测试
  • Pact 合约测试框架
  • 民法学学习笔记(个人向) Part.4
  • 20250720-5-Kubernetes 调度-污点与污点容忍_笔记
  • 力扣(LeetCode)第 459 场周赛