Python网络爬虫开发实践:天猫文胸销售数据分析中国女性胸围分布
本项目将从天猫抓取文胸销售数据,将数据存储在SQLite数据库中,然后清洗数据,最后发送SQL语句、Pandas和Matplotlib 对数据进行数据可视化分析。从分析结果中我们可以得出很多有趣的结果,比如女性胸围在中国的标准尺寸是多少;胸罩与胸围的销量比例;女性最喜欢什么颜色的胸罩。
1。项目影响视图
该项目涉及网络技术、网络爬虫技术、数据库技术、数据分析技术和数据可视化技术。首先,您应该运行脚本文件 tmallbra.py 从天猫检索胸罩销售数据并将数据存储在 SQLite 数据库中。然后就可以运行分析目录下对应的Python脚本文件进行可视化数据分析。下面显示了一些分析结果。 ?和下胸围分布直方图
其实谷歌和淘宝也给出了类似的分析结果。谷歌曾提供过女性胸部尺寸在全球分布的地图。从地图上可以清楚地看到,中国大部分地区为绿色(表示平均乳房尺寸为A罩杯),少数区域为蓝色(表示平均乳房尺寸为B罩杯)。罩杯),这也基本印证了图2所示的统计结果:中国女性的胸围大多为75B和75A。
我们再看一下淘宝提供的文胸销量比例柱状图(按照罩杯尺寸和上胸围尺寸)。
图5:淘宝文胸销量比例柱状图(按罩杯尺寸和上胸围统计)
从淘宝提供的数据中我们可以看到,最畅销的文胸尺码是75B。虽然销量比例不同((由于抽取的样本不同),但根据销量数据的排名,这个分析结果与本项目的统计结果基本一致(图2)。
2.天猫销量不错数据分析
这里的销售数据实际上是评论数据,如果用户购买了商品并留下评论,就会记录销售数据。分析销售数据的第一步是了解数据是如何到达客户端浏览器的。一般来说简单来说,浏览器从服务器获取数据有两种方式:同步和异步。同步是指数据与HTML代码一起发送到客户端,但如今的大型网站很少使用同步方式传输数据。异步方式是HTML代码和数据分别发送到客户端。数据通常为JSON格式,通过AJAX技术检索。然后,JS 用于显示检索到的有关 HTML 中元素的数据。但有时会添加一些反爬虫技术,或者出于其他目的,异步数据可能不是纯JSON格式。例如,它可以是一段 JavaScript 代码或添加到 JSON 格式数据中的一些其他内容。不过,这些基本上没什么用。添加的内容必须是普通的,否则你自己的程序将无法读取。
现在进入天猫官网https://www.tmall.com,在搜索框中输入“好”,点击“搜索”按钮进行搜索。只需找到一家销售胸罩的商店并点击进去即可。然后点击页面右键菜单中的“Inspect”菜单项,打开调试窗口并切换到“Network”选项卡。然后查看产品评论,“网络”选项卡上将出现访问评论信息的 URL。在上面的搜索框中输入“list_detail”,将列出所有以“list_detail”为前缀的 URL。这些URL就是使用AJAX异步获取的评论数据。单击 URL 将显示右侧图 6 所示的数据。显然,这个数据与JSON非常相似,但是添加了一些前缀和其他信息,大概是为了满足一些特殊的需求。
图6:天猫评论数据
返回的评论数据中,rateList就是我们需要的信息。 rateList列表中共有20个对象,其中包括20条评论数据。也就是说,通过这个URL,每次返回了20条评论数据。
URL 中还有两个对我们有用的 HTTP GET 请求字段。
• itemId:当前商品的ID。通过此字段您可以获取指定产品(不仅仅是文胸)的评论数据
。
• currentPage:当前页码,从1开始。通过该字段可以检索更多评论数据。
3。记录天猫文胸销售数据
既然天猫文胸评论数据的来源已经很清楚了,本节就来捕捉一下数据。 tmallbra.py脚本文件中有一个核心函数,用于捕获指定商品的特定页面的评论数据。
def getRateDetail(itemId,currentPage):
# Url最后的callback字段是用于天猫网站内部回调的,和我们没关系,不过这个字段的值关系到
# 返回数据的前缀,我们可以利用这个值去截取返回数据
url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=' + str(itemId) +
'&spuId=837695373&sellerId=3075989694&order=3¤tPage=' + str(currentPage) +
'&append=0... ...&callback=jsonp1278'
r = http.request('GET',url,headers = headers)
# 返回数据时GB18030编码,所以要用这个编码格式进行解码
c = r.data.decode('GB18030')
# 下面的代码将返回的评论数据转换为JSON格式
c = c.replace('jsonp1278(','')
c = c.replace(')','')
c = c.replace('false','"false"')
c = c.replace('true','"true"')
# 将JSON格式的评论数据转换为字典对象
tmalljson = json.loads(c)
return tmalljson
4。抓取胸罩产品列表
该应用程序允许搜索机器人自动选择胸罩产品,而不是我们一一选择。因此,您可以使用以下搜索页面网址到天猫商城进行搜索,按销量从大到小排序。
list.tmall.com/search_prod…… ...
此网址不需要传递任何参数。该项目仅获取第一个产品页面上的所有产品。脚本文件tmallbra.py中有一个核心函数getProductIdList,用于返回第一商品页面的所有商品ID(以列表形式返回)。
def getProductIdList():
url = 'https://list.tmall.com/search_product.htm... ...'
r = http.request('GET', url,headers = headers)
c = r.data.decode('GB18030')
soup = BeautifulSoup(c,'lxml')
linkList = []
idList = []
# 用Beautiful Soup提取商品页面中所有的商品ID
tags = soup.find_all(href=re.compile('detail.tmall.com/item.htm'))
for tag in tags:
linkList.append(tag['href'])
linkList = list(set(linkList))
for link in linkList:
aList = link.split('&')
# //detail.tmall.com/item.htm?id=562173686340
# 将商品ID添加到列表中
idList.append(aList[0].replace('//detail.tmall.com/item.htm?id=',''))
return idList
4。将记录的销售数据存储在SQLite数据库中
剩下的工作就很简单了。只需要迭代商品ID列表,然后抓取每个商品的评论数据,天猫每个商品最多可以接收99页评论,最大评论页数可以通过getLastPage函数获取。
def getLastPage(itemId):
tmalljson = getRateDetail(itemId,1)
return tmalljson['rateDetail']['paginator']['lastPage']
下面的代码将捕获产品搜索首页上所有胸罩产品的评论数据,并将数据存储在 SQLite 数据库中。
# 对商品ID进行迭代
while initial < len(productIdList):
try:
itemId = productIdList[initial]
print('----------',itemId,'------------')
maxnum = getLastPage(itemId)
num = 1
while num <= maxnum:
try:
# 抓取某个商品的某页评论数据
tmalljson = getRateDetail(itemId, num)
rateList = tmalljson['rateDetail']['rateList']
n = 0
while n < len(rateList):
# 颜色分类:H007浅蓝色加粉色;尺码:32/70A
colorSize = rateList[n]['auctionSku']
m = re.split('[:;]',colorSize)
rateContent = rateList[n]['rateContent']
color = m[1]
size = m[3]
dtime = rateList[n]['rateDate']
# 将抓取的数据保存到SQLite数据库中
cursor.execute('''insert into t_sales(color,size,source,discuss,time)
values('%s','%s','%s','%s','%s') ''' % (color,size,'天猫',rateContent,dtime))
conn.commit()
n += 1
print(color)
print(num)
num += 1
except Exception as e:
continue
initial += 1
except Exception as e:
print(e)
5。数据清理
如果读者使用前面介绍的方法从天猫和京东检索胸罩销售数据,那么现在我们已经有了一个包含 t_sales 表的 SQLite 数据库,其中存储了所有注册的胸罩销售数据。数据如图7所示。
图9:使用SQL语句统计文胸的销售比例(按罩杯大小)
其他销售数据的分析类似。
7。使用Pandas和Matplotlib分析对文胸销售比率进行可视化分析
既然Python提供了这么好的Pandas和Matplotlib,那么你根本不需要使用任何SQL语句就可以进行数据分析。一切都可以 100% 使用 Python 代码完成。
本节将使用Pandas完成与上一节相同的数据分析,并使用Matplotlib以图形方式显示分析结果。
Pandas在之前的章节中已经讨论过,这里不再深入介绍。本次分析主要使用groupby方法按照罩杯尺寸(size1)进行分组,然后使用count方法统计组内的数量,最后使用insert方法添加“比例”字段。
from pandas import *
from matplotlib.pyplot import *
import sqlite3
import sqlalchemy
# 打开bra.sqlite数据库
engine = sqlalchemy.create_engine('sqlite:///bra.sqlite')
rcParams['font.sans-serif'] = ['SimHei']
# 查询t_sales表中所有的数据
sales = read_sql('select source,size1 from t_sales',engine)
# 对size1进行分组,并统计每一组的记录数
size1Count = sales.groupby('size1')['size1'].count()
print(size1Count)
# 计算总销售数量
size1Total = size1Count.sum()
print(size1Total)
print(type(size1Count))
# 将Series转换为DataFrame
size1 = size1Count.to_frame(name='销量')
print(size1)
# 格式化浮点数
options.display.float_format = '{:,.2f}%'.format
# 插入新的“比例”列
size1.insert(0,'比例', 100 * size1Count / size1Total)
print(size1)
# 将索引名改为“罩杯”
size1.index.names=['罩杯']
print(size1)
# 数据可视化
print(size1['销量'])
# 饼图要显示的文本
labels = ['A罩杯','B罩杯','C罩杯','D罩杯']
# 用饼图绘制销售比例
size1['销量'].plot(kind='pie',labels = labels, autopct='%.2f%%')
# 设置长宽相同
axis('equal')
legend()
show()
运行程序,您将在窗口中看到如图10所示的胸罩销售比例。使用Pandas分析的数据与使用SQL分析的数据完全相同。
图10:胸罩销量百分比(按罩杯大小)
其他分析也可以使用Pandas,可视化使用Matplotlib。这两个工具确实非常强大。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。