Python爬虫实践:如何抓取天猫商品数据并分析销售趋势? 随着电商的不断发展,越来越多的人开始关注电商平台上商品的销售情况。而爬虫技术的应用,则可以让我们轻松地抓取到大量的商品数据,从而对销售情况进行深入分析。本篇文章将介绍如何使用Python爬虫抓取天猫商品数据,并通过数据分析工具对销售趋势进行分析。 一、数据抓取 1.1网站分析 首先我们需要确定要抓取的网站和我们要获取的数据。本文以天猫为例,我们要抓取的是天猫上所有的iPhone手机的商品信息,并获取以下数据: 商品名称、价格、销量、评价数量、评分等信息。 1.2 环境搭建 本文使用的是Python3.6版本,开发环境是PyCharm。需要安装的库有requests、BeautifulSoup4、pandas、matplotlib、seaborn等。 1.3 抓取逻辑 我们需要先确定要抓取的网站页面,以及要访问的参数。 以天猫的iPhone分类页面为例,页面地址为: 'https://list.tmall.com/search_product.htm?spm=a220m.1000858.1000724.5.305d4a70Hoaz7D&cat=50025135&q=iphone&sort=d&style=g&from=.list.pc_1_searchbutton' 其中的一些参数含义如下: cat:商品分类 q:搜索关键词 sort:排序方式 style:显示方式 我们可以通过BeautifulSoup库解析页面内容,从而获取到我们需要的数据。 1.4 代码实现 爬取天猫商品数据的核心代码如下: ```python import requests from bs4 import BeautifulSoup import pandas as pd def get_tmall_goods(cat, keyword, sort_type=0): """获取天猫商品数据""" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} url = 'https://list.tmall.com/search_product.htm' params = { 'cat': cat, 'q': keyword, 'sort': 'd', 'style': 'g', } res = requests.get(url, headers=headers, params=params) soup = BeautifulSoup(res.text, 'html.parser') goods_list = soup.find_all('div', class_='product-item') data_list = [] for item in goods_list: name = item.find('p', class_='productTitle').text.strip() price = item.find('p', class_='productPrice').find('em').text sales = item.find('p', class_='productStatus').find_all('span')[0].text.replace('笔', '') score = item.find('p', class_='productStatus').find_all('span')[1].text data_list.append({ 'name': name, 'price': price, 'sales': sales, 'score': score, }) df = pd.DataFrame(data_list) return df ``` 1.5 数据存储 我们可以将抓取到的数据存储到本地文件中,方便下一步的数据分析。在这里我们选择存储为csv格式的文件。 ```python df = get_tmall_goods(50025135, 'iphone') df.to_csv('tmall_goods.csv', index=False) ``` 二、数据分析 经过数据抓取,我们得到了所有的iPhone商品数据。下面我们将使用pandas、matplotlib以及seaborn等库进行数据分析。 2.1 数据读取 首先我们需要将之前存储的数据文件读取进来,以便后续的数据分析。 ```python import pandas as pd df = pd.read_csv('tmall_goods.csv') ``` 2.2 数据预处理 在进行数据分析之前,我们需要对数据进行预处理,包括数据清洗、缺失值处理等。 首先我们来看一下数据的基本情况: ```python print(df.info()) ``` 输出结果如下: ```RangeIndex: 60 entries, 0 to 59 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 60 non-null object 1 price 60 non-null object 2 sales 60 non-null object 3 score 60 non-null object dtypes: object(4) memory usage: 2.0+ KB None ``` 可以看到,我们的数据集中共有60个样本,其中没有缺失值。但是需要注意的是,价格、销量和评分这些列的数据类型都是object,我们需要将其转化为数值类型才能进行后续的数据分析。 ```python df['price'] = df['price'].str.replace(',', '').astype(float) df['sales'] = df['sales'].astype(int) df['score'] = df['score'].astype(float) ``` 2.3 数据分析 接下来我们将对数据进行分析,探索商品销售的趋势和规律。 2.3.1 商品价格分布情况 我们可以使用直方图来显示iPhone商品价格的分布情况。 ```python import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(8, 6)) sns.histplot(df['price'], bins=10, kde=False) plt.xlabel('Price') plt.title('Distribution of iPhone Prices') plt.show() ``` 输出结果如下: ![image-20211022112840789](https://gitee.com/rainbow-wq/images-for-md/raw/master/img/image-20211022112840789.png) 可以看到,iPhone商品的价格大多在5000元以下,其中以4000-4500元的商品最多。 2.3.2 商品价格和销售量的关系 接下来我们将探索商品价格和销售量之间的关系。我们可以使用散点图来显示这个关系。 ```python plt.figure(figsize=(8, 6)) sns.scatterplot(x='price', y='sales', data=df) plt.xlabel('Price') plt.ylabel('Sales') plt.title('Relationship Between Price and Sales') plt.show() ``` 输出结果如下: ![image-20211022112221348](https://gitee.com/rainbow-wq/images-for-md/raw/master/img/image-20211022112221348.png) 可以看到,价格和销售量之间存在一定的负相关关系,价格越高的商品销售量越低。 2.3.3 商品评分和销售量的关系 接下来我们将探索商品评分和销售量之间的关系。同样可以使用散点图来显示这个关系。 ```python plt.figure(figsize=(8, 6)) sns.scatterplot(x='score', y='sales', data=df) plt.xlabel('Score') plt.ylabel('Sales') plt.title('Relationship Between Score and Sales') plt.show() ``` 输出结果如下: ![image-20211022113343797](https://gitee.com/rainbow-wq/images-for-md/raw/master/img/image-20211022113343797.png) 可以看到,评分和销售量之间存在着一定的正相关关系,评分高的商品销售量也越高。 2.3.4 商品价格和评分的关系 我们还可以探索商品价格和评分之间的关系。同样可以使用散点图来显示这个关系。 ```python plt.figure(figsize=(8, 6)) sns.scatterplot(x='price', y='score', data=df) plt.xlabel('Price') plt.ylabel('Score') plt.title('Relationship Between Price and Score') plt.show() ``` 输出结果如下: ![image-20211022113842757](https://gitee.com/rainbow-wq/images-for-md/raw/master/img/image-20211022113842757.png) 可以看到,价格和评分之间没有太大的关系,高价格的商品评分并不一定高。 2.3.5 商品排行榜 最后我们来看一下商品排行榜,排名按照销售量从高到低排序。 ```python df_rank = df.sort_values(by='sales', ascending=False).reset_index(drop=True) df_rank['rank'] = range(1, len(df) + 1) print(df_rank[['rank', 'name', 'sales']].head(10)) ``` 输出结果如下: ``` rank name sales 0 1 Apple iPhone 12 (128GB)-黑色 1813 1 2 Apple iPhone XR (64GB) 1606 2 3 Apple iPhone 11 Pro Max 1345 3 4 Apple iPhone 12 Mini 64GB 1229 4 5 Apple iPhone 12 Pro 128GB 1039 5 6 Apple iPhone 12 Pro 256GB 959 6 7 【抢购价仅需6599】Apple iPhone 12 Pro Max 512GB金色 805 7 8 Apple iPhone 12 Pro Max 128GB 5G智能手机(浅金色) 670 8 9 【秒杀】Apple iPhone SE 2(第二代)128G版黑色苹果SE2 601 9 10 【抢购价低至5399】Apple iPhone 11 64G 558 ``` 可以看到,销量最高的iPhone是iPhone 12 (128GB)-黑色。