Python爬虫系列教程之第十五篇:爬取电商网站商品信息与数据分析

news/2025/2/25 6:02:35

大家好,欢迎继续关注本系列爬虫教程!
在前面的文章中,我们已经学习了如何构建爬虫、如何应对反爬机制以及如何将数据存储到数据库或文件中。随着业务场景的不断扩展,电商网站的数据采集和分析已成为实际项目中非常重要的一环。

本篇博客我们将以电商网站中的图书信息为例(使用 Books to Scrape 这一专门用于爬虫练习的网站),详细介绍如何从网站中爬取商品信息,并利用数据清洗和数据分析技术对采集到的数据进行进一步处理和可视化展示。整篇文章将分为以下几个部分:

  • 项目背景与目标介绍
  • 使用 Requests 与 BeautifulSoup 爬取图书信息
  • 数据存储:将爬取的数据保存为 CSV 文件
  • 数据清洗与分析:利用 Pandas 进行数据处理和简单统计
  • 数据可视化:使用 Matplotlib 绘制图表展示数据分布
  • 总结与展望

1. 项目背景与目标

在实际的电商平台中,商品信息(如名称、价格、库存、评分等)是非常宝贵的数据资源。通过爬虫技术采集这些数据,并对数据进行清洗、统计与可视化分析,可以帮助我们了解商品的价格趋势、用户评价分布等信息,从而辅助业务决策或开展进一步的数据挖掘工作。

本项目的目标是:

  • 爬取 Books to Scrape 网站中所有图书的基本信息
  • 将采集的数据保存为 CSV 文件,便于后续处理
  • 利用 Pandas 对数据进行清洗和简单的统计分析
  • 绘制图表展示图书价格与评分的分布情况

2. 使用 Requests 与 BeautifulSoup 爬取图书信息

在本部分,我们将利用 Python 中的 requests 库发送 HTTP 请求,利用 BeautifulSoup 解析 HTML 页面,从目标网站中提取图书的标题、价格、库存状态以及评分信息。由于该网站采用分页显示图书,我们需要遍历所有页面,采集所有数据。

下面是完整的爬虫代码,代码中均附有详细的中文注释,帮助大家理解每一步操作。

python">import requests            # 用于发送HTTP请求
from bs4 import BeautifulSoup  # 用于解析HTML页面
import csv                 # 用于CSV文件读写

def scrape_books():
    """
    爬取Books to Scrape网站中所有图书的信息
    :return: 包含图书信息的列表,每个元素是一个字典,包含图书标题、价格、库存和评分
    """
    # 网站基础URL
    base_url = "http://books.toscrape.com/"
    # 初始页面,注意这里的第一页实际URL为catalogue/page-1.html
    next_page_url = "catalogue/page-1.html"
    
    # 用于存储所有图书数据的列表
    books = []
    
    # 循环遍历所有分页,直到没有“下一页”为止
    while next_page_url:
        # 构造完整的URL
        url = base_url + next_page_url
        print(f"正在爬取页面:{url}")
        # 发送HTTP GET请求
        response = requests.get(url)
        if response.status_code != 200:
            print(f"请求失败: {url}")
            break
        
        # 使用lxml解析器解析页面内容
        soup = BeautifulSoup(response.text, 'lxml')
        
        # 查找页面中所有图书信息块,每本图书在<article class="product_pod">标签中
        book_list = soup.find_all('article', class_='product_pod')
        for book in book_list:
            # 提取图书标题:标题存放在<h3><a title="..."></a></h3>中
            title = book.h3.a['title']
            # 提取图书价格:存放在<p class="price_color">标签中,格式例如'£53.74'
            price = book.find('p', class_='price_color').get_text().strip()
            # 提取库存信息:存放在<p class="instock availability">标签中
            availability = book.find('p', class_='instock availability').get_text().strip()
            # 提取评分:评分通过<p class="star-rating X">标签的class属性表示,X为评级(如One, Two等)
            rating_class = book.find('p', class_='star-rating')['class']
            # rating_class一般为['star-rating', 'Three'],取第二个元素为实际评级
            rating = rating_class[1] if len(rating_class) > 1 else 'None'
            
            # 将提取到的数据存入字典,并添加到列表中
            books.append({
                'title': title,
                'price': price,
                'availability': availability,
                'rating': rating
            })
        
        # 查找“下一页”链接,判断是否还有下一页需要爬取
        next_button = soup.find('li', class_='next')
        if next_button:
            # 获取下一页的相对URL
            next_page_relative = next_button.a['href']
            # 注意:由于除第一页外,其他页面URL格式在/catalogue/下,因此统一构造为下面的格式
            next_page_url = "catalogue/" + next_page_relative
        else:
            # 没有“下一页”,则结束循环
            next_page_url = None
    
    return books

def save_to_csv(books, filename):
    """
    将爬取的图书数据保存到CSV文件中
    :param books: 图书数据列表,每个元素为字典
    :param filename: 保存的CSV文件名
    """
    with open(filename, 'w', encoding='utf-8', newline='') as csvfile:
        # 定义CSV文件的字段名称
        fieldnames = ['title', 'price', 'availability', 'rating']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        # 写入表头
        writer.writeheader()
        # 逐行写入每本图书的数据
        for book in books:
            writer.writerow(book)

if __name__ == '__main__':
    # 调用爬虫函数获取所有图书数据
    books = scrape_books()
    # 保存数据到CSV文件
    save_to_csv(books, 'books.csv')
    print(f"爬取到 {len(books)} 本图书的信息,并已保存到 books.csv 文件中")

在上述代码中,我们依次完成了以下步骤:

  1. 构造初始页面 URL 并通过循环遍历所有分页;
  2. 利用 BeautifulSoup 提取每本图书的标题、价格、库存状态及评分;
  3. 将所有数据保存到一个列表中,并最终写入 CSV 文件。

3. 数据清洗与分析

采集到的数据可能存在格式不统一的问题,比如价格带有货币符号、评分以英文单词表示等。接下来,我们将利用 Pandas 对 CSV 数据进行清洗和简单的统计分析。

3.1 使用 Pandas 加载与清洗数据

下面的代码展示了如何加载 CSV 数据,并对价格和评分字段进行转换处理。

python">import pandas as pd

# 从CSV文件中加载数据
df = pd.read_csv('books.csv')

# 查看数据前5行
print("原始数据预览:")
print(df.head())

# 数据清洗步骤:
# 1. 将价格字段从字符串转换为浮点数,去除货币符号(例如'£')
df['price'] = df['price'].apply(lambda x: float(x.replace('£', '')))

# 2. 将评分字段(英文单词)转换为数字:映射关系如下
rating_mapping = {'One': 1, 'Two': 2, 'Three': 3, 'Four': 4, 'Five': 5}
df['rating_num'] = df['rating'].map(rating_mapping)

# 查看清洗后的数据
print("\n清洗后的数据预览:")
print(df.head())

# 基本统计:计算所有图书的平均价格
avg_price = df['price'].mean()
print(f"\n所有图书的平均价格为:£{avg_price:.2f}")

3.2 数据分析示例

利用 Pandas,我们可以进一步对数据进行统计分析,例如分析不同评分的图书价格分布、库存情况等。

python"># 统计各个评分对应的图书数量
rating_counts = df['rating_num'].value_counts().sort_index()
print("\n各评分图书数量:")
print(rating_counts)

# 按评分分组计算平均价格
avg_price_by_rating = df.groupby('rating_num')['price'].mean()
print("\n不同评分图书的平均价格:")
print(avg_price_by_rating)


4. 数据可视化

为了更直观地展示分析结果,我们将使用 Matplotlib 绘制图表。下面的代码展示了如何绘制图书评分分布和各评分图书的平均价格柱状图。

python">import matplotlib.pyplot as plt

# 设置中文字体(如需要显示中文,需确保系统安装中文字体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定黑体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

# 绘制图书评分分布直方图
plt.figure(figsize=(8, 6))
rating_counts.plot(kind='bar', color='skyblue', edgecolor='black')
plt.title('图书评分分布')
plt.xlabel('评分')
plt.ylabel('图书数量')
plt.xticks(rotation=0)
plt.tight_layout()
plt.savefig('rating_distribution.png')  # 保存图表为图片
plt.show()

# 绘制不同评分图书平均价格柱状图
plt.figure(figsize=(8, 6))
avg_price_by_rating.plot(kind='bar', color='lightgreen', edgecolor='black')
plt.title('不同评分图书的平均价格')
plt.xlabel('评分')
plt.ylabel('平均价格 (英镑)')
plt.xticks(rotation=0)
plt.tight_layout()
plt.savefig('avg_price_by_rating.png')
plt.show()

上述代码中:

  • 我们首先设置了中文字体参数,以便图表中能正常显示中文。
  • 利用 Pandas 的 plot 方法绘制了图书评分分布的直方图,以及按评分分组的平均价格柱状图;
  • 同时保存了图表为图片文件,以便后续查看或报告使用。

5. 总结与展望

本篇博客详细讲解了如何从电商网站中爬取图书商品信息,并对采集到的数据进行清洗、统计与可视化分析。全文内容主要包括:

  1. 爬取数据

    • 使用 Requests 与 BeautifulSoup 结合循环遍历分页,提取图书标题、价格、库存和评分等信息。
    • 将采集到的数据保存为 CSV 文件,便于后续处理。
  2. 数据清洗与分析

    • 利用 Pandas 对价格数据进行格式转换,并将英文评分映射为数字。
    • 进行基本统计,计算平均价格、各评分图书数量以及按评分分组的平均价格。
  3. 数据可视化

    • 使用 Matplotlib 绘制图书评分分布和不同评分图书平均价格的图表,直观展示数据分布情况。

通过本项目,我们不仅掌握了电商网站数据采集的基本流程,还了解了如何将爬虫采集的数据与数据分析工具相结合,从而为业务决策提供数据支持。
在未来的工作中,你可以尝试:

  • 扩展爬虫采集更多细节信息(如商品详情、评论数据等),并进一步进行情感分析;
  • 将数据存储到数据库中,构建更复杂的数据仓库系统;
  • 利用高级数据可视化技术制作动态报表或仪表盘,实现实时监控数据变化。

希望本篇博客能为你在电商数据爬取和分析方面提供实战经验和思路!如果你有任何问题或建议,欢迎在评论区留言讨论。请点赞、收藏并分享给需要的朋友,我们下篇博客再见!


http://www.niftyadmin.cn/n/5865075.html

相关文章

Linux:自定义协议+序列反序列化

我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层. 一&#xff0c;再次理解协议 思考1: 我们究竟是如何将数据发送出去的&#xff1f; --------> &#xff08;1&#xff09;我们都知道TCP是双加工的&#xff0c;所以在内核中存在着发送…

每天一个Flutter开发小项目 (3) : 高效Flutter学习与产出 - 构建简易天气应用

引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前两篇博客中,我们分别构建了计数器应用和待办事项列表应用,相信您已经对Flutter开发有了一定的基础认识。今天,我们将更进一步,探讨如何更高效地学习Flutter,并构建一个更有意思的小项目——简易天气应用。 高效学…

RawShaderMaterial 与 ShaderMaterial

目录 自动添加的 Uniforms 和 Attributes ShaderMaterial RawShaderMaterial GLSL 预处理 ShaderMaterial RawShaderMaterial 使用场景 ShaderMaterial RawShaderMaterial 代码示例对比 使用 ShaderMaterial 使用 RawShaderMaterial 常见问题与注意事项 总结 在 Th…

每日一题之铠甲合体

问题描述 暗影大帝又开始搞事情了&#xff01;这次他派出了 MM 个战斗力爆表的暗影护法&#xff0c;准备一举摧毁 ERP 研究院&#xff01;MM 个暗影护法的战斗力可分别用 B1,⋯,BMB1​,⋯,BM​ 表示。 ERP 研究院紧急召唤了 NN 位铠甲勇士前来迎战&#xff01;每位铠甲勇士都…

【Java 优选算法】模拟

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 模拟算法的思路比较简单,根据题目描述列出流程,找出规律,将流程转化为代码 替换所有的问号 题目链接 解法 直接根据题目给出条件模拟 示例,找出规律 1.先找出字符?,再…

Android开发数据持久化

Android系统中主要提供了三种方式用于简单的实现数据持久化功能&#xff0c; 分别是&#xff1a;文件存储&#xff0c;SharedPreferences存储以及数据库存储。 文件存储&#xff1a;核心技术就是用Context 类中提供openFileInput()和openFileOutput()方法&#xff0c;之后利用…

以 Tomcat 为例分析 Java 中的线程池

以 Tomcat 为例分析 Java 中的线程池 首先&#xff0c;为什么会有“池”的概念&#xff1f; 我们的项目在运行过程中&#xff0c;需要使用系统资源&#xff08;CPU、内存、网络、磁盘等&#xff09;来完成信息的处理&#xff0c;比如在 JVM 中新建对象就需要消耗 CPU 和内存资…

docker 一键部署wvp+zlm

拉取容器 docker pull 648540858/wvp_pro启动容器 docker run --env WVP_IP"自己电脑的ip" -it -p 18080:18080 -p 30000-30500:30000-30500/udp -p 30000-30500:30000-30500/tcp -p 80:80 -p 5060:5060 -p 5060:5060/udp 648540858/wvp_pro3.浏览器访问测试摄像头…