匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python爬虫实践:如何抓取天猫商品数据并分析销售趋势?

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)-黑色。