欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-27 16:50:12
众所周知,随着人们生活水平的提高,零食在人们生活中扮演的角色越来越重要。一些像“良平铺子”“三只松鼠”“百草味”这样的零食网店迅速进入人们的视野,并在零食市场中占了比重非常大的份额。  我个人也是一位零食爱好者,因此萌生出某些疑问,是否能寻得一个平衡,既让商家谋取最高利润,也能使顾客最划算,互惠互利。本文将通过对不同的零食店铺和商品的价格、销量等方面进行分析,引导商家合理地制定商品价格和运费,引导人们正确而合理地购买零食。分析思路利用python爬虫爬取淘宝商品信息,本文的爬取对象为“零食”分....

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

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

分析思路

  • 利用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。
python爬取商品信息并进行数据分析python爬取商品信息并进行数据分析
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.爬取成功显示:
python爬取商品信息并进行数据分析
爬取的数据以CSV格式保存:
python爬取商品信息并进行数据分析

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

  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')

python爬取商品信息并进行数据分析
由该散点图可知:

  • 总体趋势:价格在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')

python爬取商品信息并进行数据分析
由图可知:

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

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

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

python爬取商品信息并进行数据分析
由该散点图可知:

  • 很明显可以看出来,运费为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')

python爬取商品信息并进行数据分析
由图可知:

  • 运费为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()

python爬取商品信息并进行数据分析
由图可知:

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

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()

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

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

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

  • 首先用谷歌浏览器登录“百度地图开放平台”,申请密钥。
    python爬取商品信息并进行数据分析
    python爬取商品信息并进行数据分析

  • 申请成功后查看并复制AK,即密钥:BthoML4kRhxoeYXtZGj2QeMZhnR6FGYC。
    python爬取商品信息并进行数据分析

  • 访问JavaScript API,点开覆盖物示例,查看源码,复制下来,新建一个HTML文档,将源码粘贴到该文档中。
    python爬取商品信息并进行数据分析
    python爬取商品信息并进行数据分析

  • 用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() #保存

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

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

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

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

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