python爬取商品信息并进行数据分析

2022-08-01,,,,

众所周知,随着人们生活水平的提高,零食在人们生活中扮演的角色越来越重要。一些像“良平铺子”“三只松鼠”“百草味”这样的零食网店迅速进入人们的视野,并在零食市场中占了比重非常大的份额。

  我个人也是一位零食爱好者,因此萌生出某些疑问,是否能寻得一个平衡,既让商家谋取最高利润,也能使顾客最划算,互惠互利。本文将通过对不同的零食店铺和商品的价格、销量等方面进行分析,引导商家合理地制定商品价格和运费,引导人们正确而合理地购买零食。

分析思路

  • 利用python爬虫爬取淘宝商品信息,本文的爬取对象为“零食”
  • 分析商品价格对销量的影响
  • 分析商品价格对销售总额的影响
  • 分析商品运费对销量的影响
  • 分析商品运费对销售总额的影响
  • 分析不同省份的店铺数量分布
  • 三维绘图直观表示价格、运费、销量三者之间的关系
  • 调用百度地图API绘制热力图,比图表更直观地显示店铺在全国的分布

数据爬取部分

  1. 利用python爬取淘宝商品(我暂且只爬取9个页面的商品信息)

  2. 将数据导出为Excel

据分析部分

  1. 数据柱形图可视化:barh
  2. 数据直方图可视化:hist
  3. 数据散点图可视化:scatter
  4. 数据回归分析可视化:regplot

需要用到的工具:Anaconda的Spyder、谷歌浏览器控制台
需要用到的模块:requests、re、xlsxwriter、matplotlib、wordcloud、seaborn

这里提供给大家参考网址:
https://s.taobao.com/search?q=%E9%9B%B6%E9%A3%9F&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306

爬取过程:
1.打开谷歌浏览器,清空缓存,然后登陆淘宝官网,搜索关键词“零食”。用f12打开谷歌控制工具,点击第一行,也就是和当前网址一样的那行,点击headers,找到User-Agent。

2.在preview里面找到商品界面源代码,需要导出店铺名称、店铺ID、地址、商品价格、运费和销量。在源代码中找到对应的信息:即“nick”,”user_id”,”item_loc”,”view_price”,”view_fee”,”view_sales”.

3.开始爬取

#爬虫部分
import requests
import re
import xlsxwriter
 
def getUrl(page):   # page为[0,10]内的整数
    part1 = 'https://s.taobao.com/search?q=%E9%9B%B6%E9%A3%9F&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306'
    list = []
    for a in range(0, page):
        part2 = '{}'.format(20*a)
        url = part1 + part2
        list.append(url)
    return list
def getHtmlText(url):
    try:
        headers = {
           'User-Agent':
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
                AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
                
          'Cookie':
              'thw=cn; t=2849901e12f931031b18c00202a1bb10; \
              cna=D858FVmxHTsCAd75gxEtAE8S; tracknick=%5Cu5C0F%5Cu956D%\
              5Cu5C0F%5Cu956D%5Cu5C0F%5Cu956D%5Cu554A; lgc=%5Cu5C0F%5Cu956D%5Cu5C0F%5Cu956D%\
              5Cu5C0F%5Cu956D%5Cu554A; _cc_=VT5L2FSpdA%3D%3D; tg=0; hng=CN%7Czh-CN%7CCNY%7C156; \
              mt=ci=95_1; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%\
              3D-1%26_ato%3D0; v=0; _tb_token_=5eebbdae6736b; alitrackid=www.taobao.com; \
              lastalitrackid=www.taobao.com; swfstore=9488; uc1=cookie14=UoTZ7Yy6CVN7wA%3D%3D;\
              l=bBN_j2OVvdh6DMQQBOCN5ZayhT_OSIRYMuWbUdyDi_5C86LsFwbOlUSz9Fp6VbCRsTYB4nBALgy9-etki; \
              isg=BElJpctycQ5H-w15u2EIc4LQWHWplC9COvocyeu-xTBvMmlEM-ZNmDdgdNAhMtUA'
        }
        res = requests.get(url, headers=headers, timeout=30)
        res.raise_for_status()
        res.encoding = res.apparent_encoding
        # time.sleep(1)
        return res.text
    except:
        return '网络异常'
def getTaobaoData(text):
    shopName = re.findall('"nick":"(.*?)"', text)
    shopId = re.findall('"user_id":"(.*?)"', text)
    shopAdress = re.findall('"item_loc":(.*?),', text)
    goodPrice = re.findall('"view_price":(.*?),', text)
    postFee = re.findall('"view_fee":(.*?),', text)
    totalSales = re.findall('"view_sales":(.*?),', text)
    return shopName,shopId,shopAdress,goodPrice,postFee,totalSales
 
def main(page):
    num = 0
    List = getUrl(page)
    TaobaoData = xlsxwriter.Workbook('c:\\python1\\taobao.xlsx')
    StoresData = TaobaoData.add_worksheet()
    title = [u'店铺名称', u'店铺ID号', u'地址', u'商品价格',u'运费',u'销量']
    StoresData.write_row('A1', title)
    StoresData.set_column('A:D', 25)
    for URL in List:
        Text = getHtmlText(URL)
        name,userid,itemloc,goodprice,postfee,totalsales= getTaobaoData(Text)
        StoresData.write_column(1+20*num, 0, name)
        StoresData.write_column(1+20*num, 1, userid)
        StoresData.write_column(1+20*num, 2, itemloc)
        StoresData.write_column(1+20*num, 3, goodprice)
        StoresData.write_column(1+20*num, 4, postfee)
        StoresData.write_column(1+20*num, 5, totalsales)
        num += 1
        if not name:
            print('第{}页爬取失败'.format(num))
        else:
            print('第{}页爬取成功'.format(num))
    TaobaoData.close()
 
if __name__ == '__main__':
    a = input('请输入需要爬取的页数(建议小于10):')
    main(int(a))

4.爬取成功显示:

爬取的数据以CSV格式保存:

数据分析过程
首先需要进行数据准备准备阶段:

  1. 为方便代码编写,这里将csv文件中的导引词分别改为:店铺名称:NAME, 店铺ID号:ID,地址:LOC, 商品价格:PRICE, 运费:FEE, 销量:SALES。
  2. 用记事本将CSV文件打开,将“”换成空格,里面的数据就由object类型转换为float类型了。

开始分析:

1.分析商品价格对销量的影响

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
tbdata=pd.read_csv('c:/python1/taobaodata.csv') 
sns.set(style="darkgrid")
sns.jointplot(x='PRICE',y='SALES',data=tbdata,kind='scatter',color='purple')

由该散点图可知:

  • 总体趋势:价格在0~60元之间销量最高,而且随着价格增多,其销量减少,商品价格对其销量的影响较大。
  • 商品销量峰值是在价格为60元左右,而60左右的邻近价格区间销量较低,总体来说,商品价格在10~40元的销量较高,但销售总额不能直观看出来。

2.分析商品价格对销售总额的影响

tbdata['GMV']=tbdata['PRICE']*tbdata['SALES']
import seaborn as sns
sns.regplot(x="PRICE",y="GMV",data=tbdata,color='purple')

由图可知:

  • 显而易见,当价格处于60元时,销售总额最大,其次是介于20~40元之间。
  • 给商家的建议:商品价格定位在60元时可使销售额达到最大化,商家可对商品进行一定程度的调整,使商品既达到销售额最大化,又达到利润最大化。

3.分析商品运费对销量的影响

sns.set(style="darkgrid")
sns.jointplot(x='FEE',y='SALES',data=tbdata,kind='scatter',color='purple'

由该散点图可知:

  • 很明显可以看出来,运费为0时商品销量达到最高,商品销售额达到最大化。
  • 运费小于50时,随着运费的增高,销量递减。
  • 运费为50时销量达到250000,由此可推测此商品为进口零食。
  • 给商家的建议:根据“价格对销量的影响”和“运费对销量的影响”这两个图,商家可依据自身情况和商品属性,调节好商品的价格和运费,以达到利润最大化。

4.分析运费对销售总额的影响

tbdata['GMV']=tbdata['PRICE']*tbdata['SALES']
import seaborn as sns
sns.regplot(x="FEE",y="GMV",data=tbdata,color='purple')

由图可知:

  • 运费为0时不仅销量最大,销售总额也最高。
  • 运费和销售总额成反比,运费的高低在很大程度上对销售总额有影响。

5.分析不同省份的店铺数量分布

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(8,4))
tbdata.province=tbdata['LOC']
tbdata.province.value_counts().plot(kind='bar',color='purple')
plt.xticks(rotation=90)
plt.xlabel('省份')
plt.ylabel('店铺数量')
plt.title('不同省份的店铺数量分布')
plt.show()

由图可知:

  • 这些店铺绝大部分集中于上海,上海占主导地位,其次是南京、杭州、深圳等沿海地区。
  • 店铺数量分布与城市发达程度有着密切关系。
  • 给商家的建议:综合以上数据来看,毋庸置疑,江浙沪一带的店铺销售总额要远高于其他地区,商家可以此考虑店铺的立足点。

6.直观地表示价格、运费、销量三者之间的关系(这里采用三维绘图表示三者关系)

import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
import numpy as np
x,y=np.mgrid[-2:2:20j, -2:2:20j]
z = x * np.exp(-x**2 - y**2)
ax = plt.subplot(111,projection='3d')
ax.plot_surface(x,y,z, rstride = 2, cstride = 1,cmap = plt.cm.Blues_r)
ax.set_xlabel("PRICE")
ax.set_ylabel("FEE")
ax.set_zlabel("SALES")
plt.show()

  • X轴表示商品价格,Y轴表示商品运费,Z轴表示商品销量。
  • 由图中很明显地表示出,价格和销量成反比,运费也和销量成反比,价格和运费之间无直接成比关系。

7.调用百度地图API绘制热力图,比图表更直观地显示店铺在全国的分布。因为不知道这些店铺所在省份的经纬度,所以只能通过调用百度地图API获得源码,再利用python获得所有地区的经纬度,在HTML中生成热力图。不知道获取百度地图API的伙伴们不用担心,我给出的绘制热力图步骤中会给出调用百度地图API的教程。

  • 首先用谷歌浏览器登录“百度地图开放平台”,申请密钥。

  • 申请成功后查看并复制AK,即密钥:BthoML4kRhxoeYXtZGj2QeMZhnR6FGYC。

  • 访问JavaScript API,点开覆盖物示例,查看源码,复制下来,新建一个HTML文档,将源码粘贴到该文档中。

  • 用python获取CSV中的地区的经纬度。

import json
from urllib.request import urlopen, quote
import requests,csv
import pandas as pd #导入这些库后边都要用到

def getlnglat(address):
    url = 'http://api.map.baidu.com/geocoder/v2/'
    output = 'json'
    ak = 'BthoML4kRhxoeYXtZGj2QeMZhnR6FGYC'
    add = quote(address) #由于本文城市变量为中文,为防止乱码,先用quote进行编码
    uri = url + '?' + 'address=' + add  + '&output=' + output + '&ak=' + ak
    req = urlopen(uri)
    res = req.read().decode() #将其他编码的字符串解码成unicode
    temp = json.loads(res) #对json数据进行解析
    return temp 
file = open(r'c:/python1/location.json','w') #建立json数据文件
with open(r'c:/python1/taobaodata.csv', 'r') as csvfile: #打开csv
    reader = csv.reader(csvfile)
    for line in reader: #读取csv里的数据
        # 忽略第一行
        if reader.line_num == 1: #由于第一行为变量名称,故忽略掉
            continue
            # line是个list,取得所有需要的值
        b = line[0].strip() #将第一列city读取出来并清除不需要字符
        c= line[1].strip()#将第二列price读取出来并清除不需要字符
        lng = getlnglat(b)['result']['location']['lng'] #采用构造的函数来获取经度
        lat = getlnglat(b)['result']['location']['lat'] #获取纬度
        str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'
        #print(str_temp) #也可以通过打印出来,把数据copy到百度热力地图api的相应位置上
        file.write(str_temp) #写入文档
file.close() #保存

  • 将获取的经纬度替换掉原HTML中的经纬度,输入密钥,其他代码不变,得到热力图

  此次分析只是我闲暇时候做的一个小练习啦,不专业,还请大家帮我指正。考虑到可能有新手小伙伴看到这篇文章,所以写得比较细一点,总之要入门python数据分析很简单啦,做一个小例子就大致明白了,可能对爬虫代码不熟悉,但是基本流程知道了,也可以熟练地使用谷歌浏览器开发者工具了。在此我发现一些关于爬虫小问题,或许能解除新手们的疑难:爬取淘宝网页的信息时,如果前几次非常成功,后几次就一直在失败,原因是淘宝的反爬机制生效了,因此要更换网络IP地址。不知道怎样获取User-Agent参数和cookies参数的伙伴们可以细看一下爬取数据部分。

PS:本来打算绘制词云图,但是安装jieba的时候出现一些问题,后续会完善一下啦。

本文地址:https://blog.csdn.net/weixin_41704972/article/details/107499033

《python爬取商品信息并进行数据分析.doc》

下载本文的Word格式文档,以方便收藏与打印。