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()
```
输出结果如下:

可以看到,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()
```
输出结果如下:

可以看到,价格和销售量之间存在一定的负相关关系,价格越高的商品销售量越低。
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()
```
输出结果如下:

可以看到,评分和销售量之间存在着一定的正相关关系,评分高的商品销售量也越高。
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()
```
输出结果如下:

可以看到,价格和评分之间没有太大的关系,高价格的商品评分并不一定高。
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)-黑色。