大家好,欢迎继续关注本系列爬虫教程!
在前面的文章中,我们已经学习了如何构建爬虫、如何应对反爬机制以及如何将数据存储到数据库或文件中。随着业务场景的不断扩展,电商网站的数据采集和分析已成为实际项目中非常重要的一环。
本篇博客我们将以电商网站中的图书信息为例(使用 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 文件中")
在上述代码中,我们依次完成了以下步骤:
- 构造初始页面 URL 并通过循环遍历所有分页;
- 利用 BeautifulSoup 提取每本图书的标题、价格、库存状态及评分;
- 将所有数据保存到一个列表中,并最终写入 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. 总结与展望
本篇博客详细讲解了如何从电商网站中爬取图书商品信息,并对采集到的数据进行清洗、统计与可视化分析。全文内容主要包括:
-
爬取数据
- 使用 Requests 与 BeautifulSoup 结合循环遍历分页,提取图书标题、价格、库存和评分等信息。
- 将采集到的数据保存为 CSV 文件,便于后续处理。
-
数据清洗与分析
- 利用 Pandas 对价格数据进行格式转换,并将英文评分映射为数字。
- 进行基本统计,计算平均价格、各评分图书数量以及按评分分组的平均价格。
-
数据可视化
- 使用 Matplotlib 绘制图书评分分布和不同评分图书平均价格的图表,直观展示数据分布情况。
通过本项目,我们不仅掌握了电商网站数据采集的基本流程,还了解了如何将爬虫采集的数据与数据分析工具相结合,从而为业务决策提供数据支持。
在未来的工作中,你可以尝试:
- 扩展爬虫采集更多细节信息(如商品详情、评论数据等),并进一步进行情感分析;
- 将数据存储到数据库中,构建更复杂的数据仓库系统;
- 利用高级数据可视化技术制作动态报表或仪表盘,实现实时监控数据变化。
希望本篇博客能为你在电商数据爬取和分析方面提供实战经验和思路!如果你有任何问题或建议,欢迎在评论区留言讨论。请点赞、收藏并分享给需要的朋友,我们下篇博客再见!