中 title = book.h3.a['title'] # 提取图书价格:存放在
标签中,格式例如'£53.74' price = book.find('p', class_='price_color').get_text().strip() # 提取库存信息:存放在
标签中 availability = book.find('p', class_='instock availability').get_text().strip() # 提取评分:评分通过
大家好,欢迎继续关注本系列爬虫教程!
在前面的文章中,我们已经学习了如何构建爬虫、如何应对反爬机制以及如何将数据存储到数据库或文件中。随着业务场景的不断扩展,电商网站的数据采集和分析已成为实际项目中非常重要的一环。
本篇博客我们将以电商网站中的图书信息为例(使用 Books to Scrape 这一专门用于爬虫练习的网站),详细介绍如何从网站中爬取商品信息,并利用数据清洗和数据分析技术对采集到的数据进行进一步处理和可视化展示。整篇文章将分为以下几个部分:
在实际的电商平台中,商品信息(如名称、价格、库存、评分等)是非常宝贵的数据资源。通过爬虫技术采集这些数据,并对数据进行清洗、统计与可视化分析,可以帮助我们了解商品的价格趋势、用户评价分布等信息,从而辅助业务决策或开展进一步的数据挖掘工作。
本项目的目标是:
在本部分,我们将利用 Python 中的 requests
库发送 HTTP 请求,利用 BeautifulSoup
解析 HTML 页面,从目标网站中提取图书的标题、价格、库存状态以及评分信息。由于该网站采用分页显示图书,我们需要遍历所有页面,采集所有数据。
下面是完整的爬虫代码,代码中均附有详细的中文注释,帮助大家理解每一步操作。
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')
# 查找页面中所有图书信息块,每本图书在标签中
book_list = soup.find_all('article', class_='product_pod')
for book in book_list:
# 提取图书标题:标题存放在
中
title = book.h3.a['title']
# 提取图书价格:存放在标签中,格式例如'£53.74'
price = book.find('p', class_='price_color').get_text().strip()
# 提取库存信息:存放在
标签中
availability = book.find('p', class_='instock availability').get_text().strip()
# 提取评分:评分通过
在上述代码中,我们依次完成了以下步骤:
采集到的数据可能存在格式不统一的问题,比如价格带有货币符号、评分以英文单词表示等。接下来,我们将利用 Pandas 对 CSV 数据进行清洗和简单的统计分析。
下面的代码展示了如何加载 CSV 数据,并对价格和评分字段进行转换处理。
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}")
利用 Pandas,我们可以进一步对数据进行统计分析,例如分析不同评分的图书价格分布、库存情况等。
# 统计各个评分对应的图书数量
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)
为了更直观地展示分析结果,我们将使用 Matplotlib 绘制图表。下面的代码展示了如何绘制图书评分分布和各评分图书的平均价格柱状图。
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()
上述代码中:
plot
方法绘制了图书评分分布的直方图,以及按评分分组的平均价格柱状图;本篇博客详细讲解了如何从电商网站中爬取图书商品信息,并对采集到的数据进行清洗、统计与可视化分析。全文内容主要包括:
爬取数据
数据清洗与分析
数据可视化
通过本项目,我们不仅掌握了电商网站数据采集的基本流程,还了解了如何将爬虫采集的数据与数据分析工具相结合,从而为业务决策提供数据支持。
在未来的工作中,你可以尝试:
希望本篇博客能为你在电商数据爬取和分析方面提供实战经验和思路!如果你有任何问题或建议,欢迎在评论区留言讨论。请点赞、收藏并分享给需要的朋友,我们下篇博客再见!