爬虫实战案例(两个)

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

一、获取图书信息

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

流程:

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

第一部分:导入依赖库

python 复制代码
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

python 复制代码
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_handles
        driver.switch_to.window(handles[-1])
        time.sleep(2)  # 等待详情页元素加载
        
        # 提取图书信息:书名、作者、价格、亮点(通过class定位元素并获取文本)
        name = driver.find_element(by=By.CLASS_NAME, value='book-name').text
        author = driver.find_element(by=By.CLASS_NAME, value='book-author').text
        price = driver.find_element(by=By.CLASS_NAME, value='price').text
        summary = 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_handles
        driver.switch_to.window(handles[-1])
        time.sleep(1)  # 短暂等待,确保切换完成
  • 功能:从图书列表页遍历每本图书,打开详情页提取信息并写入文件
  • 关键逻辑:
    1. 通过find_elements批量获取图书图片元素
    2. 循环点击图片打开新窗口(详情页)
    3. 通过window_handles管理窗口切换(句柄是窗口的唯一标识)
    4. 提取信息后关闭详情页,切回列表页继续下一本

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

python 复制代码
# 打开文件准备写入,编码为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. 无头模式被注释,说明当前会显示浏览器窗口(方便调试)

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

python 复制代码
# 打开目标网站(人民邮电出版社官网)
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. 点击 "查看更多" 按钮加载完整列表,再次切换到新窗口

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

python 复制代码
# 调用函数爬取当前页图书信息
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. 分别将优质评价和差评保存到不同文件

第一部分:导入依赖库

python 复制代码
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

python 复制代码
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. 循环遍历每个评价元素,将文本内容写入文件(每条评价后加换行)

第三部分:爬取优质评价

python 复制代码
# 打开文件用于保存优质评价,编码为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. 完成后关闭文件和当前窗口

第四部分:爬取差评

python 复制代码
# 打开差评页面
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
  • 整体逻辑:打开差评页面 → 爬取当前页 → 循环翻页爬取 → 关闭文件和窗口
相关推荐
广州山泉婚姻16 小时前
如何设计一个高效的网页爬虫?
爬虫
程序小武18 小时前
爬虫实战指南:从定位数据到解析请求的全流程解析
爬虫
星期天要睡觉1 天前
python网络爬虫(第三章/共三章:驱动浏览器窗口界面,网页元素定位,模拟用户交互(输入操作、点击操作、文件上传),浏览器窗口切换,循环爬取存储)
爬虫·python·交互
过往入尘土1 天前
网络爬虫的详细知识点
爬虫
狗都不学爬虫_2 天前
JS逆向 - 东、深、昆航查询参数
爬虫·网络爬虫·wasm
失败又激情的man2 天前
爬虫逆向之JS混淆案例(全国招标公告公示搜索引擎 type__1017逆向)
爬虫
赴3352 天前
python网络爬虫之selenium库(二)
爬虫·python·selenium
爬点儿啥2 天前
[JS逆向] 微信小程序逆向工程实战
开发语言·javascript·爬虫·微信小程序·逆向
AI 嗯啦2 天前
爬虫小知识(二)网页进行交互
运维·服务器·开发语言·爬虫·python·交互