文章目录

  • 前言
  • 一、商品数据
  • 1.分析url
  • 2.解析数据
  • 3.实现翻页
  • 二、评论数据



前言

利用Python对苏宁易购商品数据评价数据实现爬取


提示:以下是本篇文章正文内容,下面案例可供参考

一、商品数据

苏宁易购官网商品数据是属于动态加载的,所以我用的方法时selenium模拟,利用selenium向下滑动加载数据,获取数据

1.分析url

我们搜索一件商品观察url,这个url很简单,就是在官网上加上了关键字,没有多余的参数

https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/

我们翻页看一下其他url,我们跳到第二页可以看到在第一页url后加了“#second-filter”第三页跟第二页的url是一样的

第二页:https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/#second-filter
第三页:https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/#second-filter

我原本想通过制造url来实现翻页,但是现在貌似是不能了,但是没关系,因为我们用的是selenium可以通过循环点击下一页的方式来实现翻页

2.解析数据

我们向下滑动可以发现有一部分数据是需要滑动才能加载出来的,所以我们需要通过selenium模拟滑动

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_json


基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_selenium_02


通过访问页面,模拟滑动加载数据

self.bro.get("https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/")
self.bro.execute_script('window.scrollTo(0, document.body.scrollHeight)')  # 向下滑动一屏

我们选中一件商品右键检查元素,可以发现所有数据都在ul中每一个li里

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_json_03


根据这我们可以遍历没有li标签获取每一个商品数据,看一下我要拿到他的标题、价格、评价数等等数据

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_selenium_04


实例代码如下:

html=etree.HTML(self.bro.page_source)
li_list=html.xpath('//ul[@class="general clearfix"]/li')
for li in li_list:
    dic={}
    try:
        dic["title"]="".join(li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]//text()')).replace("\n","")
    except:
        dic["title"]=""
    try:
        dic["price"]="".join(li.xpath('.//div[@class="price-box"]/span[1]//text()')).replace("\n","")
    except:
        dic["price"]=""
    try:
        dic["type"]=li.xpath('.//div[@class="info-config"]/@title')[0]
    except:
        dic["type"]=""
    try:
        dic["comment_num"]=''.join(li.xpath('.//div[@class="info-evaluate"]/a[1]//text()'))
    except:
        dic["comment_num"]=""
    try:
        dic["shop"]=li.xpath('.//div[@class="store-stock"]/a[1]/text()')[0]
    except:
        dic["shop"]=""
    try:
        dic["label"]=','.join(li.xpath('.//div[@class="sales-label"]//text()'))
    except:
        dic["label"]=""
    try:
        dic["img_link"]="http:"+li.xpath('.//div[@class="img-block"]/a[1]/img/@src')[0]
    except:
        dic["img_link"]=""
    try:
        if "http" in li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]/@href')[0]:
            dic["detail_link"]=li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]/@href')[0]
        else:
            dic["detail_link"]="http:"+li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]/@href')[0]
    except:
        dic["detail_link"]=""

保存数据我使用的边爬边存的追加方式

with open(".//taobao.csv", "a+", encoding="utf-8") as f:
    writer = csv.DictWriter(f, dic.keys())
    writer.writerow(dic)

3.实现翻页

通过上面的代码我们可以实现单个页面的获取了,现在我们需要做的是实现翻页,全站数据爬取

我们是要在圈中的位置 输入页数 点击确认实现翻页

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_json_05

我们可以定位总页数,打印出总页数,以此我们来利用input交互式的方式实现翻页

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_python_06


再利用input输入起始页数、结束页数做for循环实现翻页

self.start_page = input("请输入起始页数:")
self.end_page = input("请输入结束页数:")
for i in range(int(self.start_page),int(self.end_page)+1):
	解析数据
   self.bro.find_element_by_xpath('//span[@class="page-more"]/input').send_keys(int(i)) #输入页数
   self.bro.find_element_by_xpath('//a[@class="page-more ensure"]').click() #点击确认

这里需要注意一点,就是当数据只有一页时,便不需要用循环了

到此便可获取苏宁商品数据,看一下效果

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_json_07

二、评论数据

我们利用chrome自带的抓包,筛选出评论数据包,我们可以看到,评论数据都在commodityReviews中

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_selenium_08


现在我们来分析一下评论数据的url,我们可以的看出,变化的地方只有一处就是total-和-default中间的数据,如第一页:total-1-default 第二页:total-2-default 第三页:total-3-default.由此我们就找到了url的变化规律

第一页:https://review.suning.com/ajax/cluster_review_lists/cluster-37644362-000000012234208643-0000000000-total-1-default-10-----reviewList.htm?callback=reviewList
第二页:https://review.suning.com/ajax/cluster_review_lists/cluster-37644362-000000012234208643-0000000000-total-2-default-10-----reviewList.htm?callback=reviewList
第三页:https://review.suning.com/ajax/cluster_review_lists/cluster-37644362-000000012234208643-0000000000-total-3-default-10-----reviewList.htm?callback=reviewList

现在我来解析数据,我将将数据复制到json.cn中

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_json_09


每个用户的数据都在commodityReviews中我们可以通过requests访问得到数据转为json格式。遍历commodityReviews,拿到每个人的数据

实例代码如下:

text=requests.get(url,headers=head).text.replace("reviewList(","").replace(")","")
data=json.loads(text)
for da in data["commodityReviews"]:
    dic={}
    try:
        dic["nickName"]=da["userInfo"]["nickName"]
    except:
        dic["nickName"]=""
    try:
        dic["levelName"]=da["userInfo"]["levelName"]
    except:
        dic["levelName"]=""
    try:
        dic["isVip"]=da["userInfo"]["isVip"]
    except:
        dic["isVip"]=""
    try:
        dic["charaterDesc1"]=da["commodityInfo"]["charaterDesc1"]
    except:
        dic["charaterDesc1"]=""
    try:
        dic["charaterDesc2"]=da["commodityInfo"]["charaterDesc2"]
    except:
        dic["charaterDesc2"]=""
    try:
        dic["content"]=da["content"]
    except:
        dic["content"]=""
    try:
        dic["publishTime"]=da["publishTime"]
    except:
        dic["publishTime"]=""

保存数据我使用的边爬边存的追加方式

with open(".//taobao.csv", "a+", encoding="utf-8") as f:
    writer = csv.DictWriter(f, dic.keys())
    writer.writerow(dic)

最终效果如下

基于Python的超市零售商品销售数据采集与数据可视化分析的国内外研究现状 基于python的购物网站_数据_10