扫地机器人选购------京东数据分析篇(Python爬虫)

最近打算入手个扫地机器人,在网上查了各种资料,但是各种刷单、各种水军、各种评测搞得我头昏脑胀,犯起了选择困难症,所以就有了这个针对扫地机器人的爬取京东数据,并进行数据分析,且听我慢慢道来。不想看分析过程的请直接拉到最底下看结果。

这是一个基于Scrapy的爬虫,经过Chrome分析,京东并未做类似淘宝的必须登录才可以搜索商品信息等限制,所以,不需要selenium来进行辅助了,废话不多说,先创建Scrapy项目,命令行定位到目标文件夹:

scrapy startproject AdNet

好的,项目创建成功,使用PyCharm打开项目,目录如下:



在spider包里面创建一个JDSpider的python文件,代码如下

import scrapy

class JDSpider(scrapy.Spider):
    name = "JDSpider"
    start_urls = ["https://search.jd.com/Search?keyword=%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA%20%E8%87%AA%E8%90%A5&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.def.0.V10&wq=%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA%20ZIYI&stock=1&psort=3&click=0"]

    def parse(self, response):
          pass

那么有人要问了,start_urls的链接从哪里获取呢,好,跟我做,打开京东,搜索栏输入扫地机器人 自营,点击搜索,然后点击按照销量排列,地址栏里的链接就是我们需要的链接,如图:


接下来我们对这个网页进行分析,也就是我们def parse(self, response):里面需要做的事情
我们进入这个界面,首先一定是要拿到所有的商品链接,那么怎么获取呢,我们右击第一个商品选择检查,结果如图:

好的,从图中很容易看出商品的链接是//item.jd.com/3304295.html,真实地址其实就是https://item.jd.com/3304295.html,拿到真实地址,怎么获取商品的评价数量等相关信息呢?我们接下来打开这个网址,再次进行分析,进入网址之后再次右键选择检查,如果不向下滚动,你会发现其实评价信息和数量等信息是不加载的,因为采用了懒加载,而且经分析,获取评价信息这些采用的是异步加载,这种情况一般就要使用selenium来辅助了,但是还有一种方法,我们尝试下直接点击商品评价,看下都经过了什么网络请求,如果不是必须,也不用使用selenium,先选中network,并清除之前的网络记录

好的,现在我们来点击商品评价,同时观察network的记录

其中这条记录我们基本上可以确定是请求商品评价的接口,点开进行查看

看来确实是这样的,有些同学可能会问为什么你知道就是这个JS脚本呢?难道我要告诉你我挨个点开看了一遍吗?接着分析

可以看出这是一个GET请求,所以,我们很肯定的可以自己去做这个请求,但是从上面的response分析,这个响应类似JSON但是又不是JSON,因为前面有一部分fetchJSON_com什么的东西,再次查看我们请求的URL,发现里面有个callback=fetchJSON_comment98vv83417的字样,跟响应里面多出来的内容一样,我们尝试删除callback=fetchJSON_comment98vv83417,然后直接在浏览器中访问这个接口https://sclub.jd.com/comment/productPageComments.action?productId=3304295&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

NICE,正常返回JSON,也就是说我们只要有了productId=3304295就可以了,只需要拼接对应的productId即可,好了,网络分析完毕,我们来进行代码编写

from time import sleep

import json
import scrapy
from selenium import webdriver

class JDSpider(scrapy.Spider):
    name = "JDSpider"
    start_urls = ["https://search.jd.com/Search?keyword=%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA%20%E8%87%AA%E8%90%A5&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.def.0.V10&wq=%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA%20ZIYI&stock=1&psort=3&click=0"]
    goodsList = list()


    def parse(self, response):
        items = response.xpath("//div[@class='p-name p-name-type-2']")
        for item in items:
            goods = JDGoods()
            goods["title"] = ''.join(item.xpath("./a/em/text()").extract()).strip()
            goods["url"] = "http:" + item.xpath("./a/@href").extract_first()
            goods["id"] = item.xpath("./a/@href").extract_first().split('/')[-1].replace('.html','')
            goods["evaluate"] = "https://sclub.jd.com/comment/productPageComments.action?&productId="+goods["id"]+"&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"
            yield scrapy.Request(goods["evaluate"],meta={'goods':goods},callback=self.parsePage)

    def parsePage(self,response):
        goods = response.meta["goods"]
        ret = json.loads(response.text)
        commentCount = int(ret["productCommentSummary"]["commentCount"])
        goodCount = int(ret["productCommentSummary"]["goodCount"])
        poorCount = int(ret["productCommentSummary"]["poorCount"])
        generalCount = int(ret["productCommentSummary"]["generalCount"])
        goods["commentCount"] = commentCount
        goods["goodCount"] = commentCount - generalCount - poorCount
        goods["generalCount"] = generalCount
        goods["poorCount"] = poorCount
        goods["goodRate"] = goods["goodCount"]/goods["commentCount"] * 100
        goods["generalRate"] = goods["generalCount"]/goods["commentCount"] * 100
        goods["poorRate"] = goods["poorCount"]/goods["commentCount"] * 100
        self.goodsList.append(goods)

        self.goodsList.sort(key=lambda x:x["goodRate"],reverse=True)
        if (len(self.goodsList) == 30):
            for obj in self.goodsList:
                print(obj)


class JDGoods(dict):
    def __str__(self):
        return "商品名称:%s\n总评价数:%d\n好评率:%s\n========================" % (self["title"],self["commentCount"],self["goodRate"])

大概分析下上面的代码,首先定义了爬虫的名字和起始的链接,在解析里面,我们通过xpath获取每个商品的名称url地址商品id商品的评价地址(需要自己拼接商品id上去),然后,我们发起一个获取商品评价的请求yield scrapy.Request(goods["evaluate"],meta={'goods':goods},callback=self.parsePage),请求完成后进行商品评价的解析,包括总评价数好评数中评数差评数,同时进行我们关心的关键信息好评率的计算,最后,把所有的商品信息添加到一个数据列表中,在第一页加载完毕(30条商品信息,实际上是60条商品信息,但是考虑到实际情况,应该不会考虑购买排名太靠后的商品)后,把所有商品按照好评率进行排序,最后,按好评顺序输出所有的商品信息,从第一条开始逐步筛选自己需要的商品。输出如下:

商品名称:Bobot 8800 家用可更换电池电动拖地机拖把 无线手持自动旋转扫地机拖地机
总评价数:1400
好评率:100.0
========================
商品名称:小狗(puppy)扫拖一体智能家用吸尘器R55 Cyclone
总评价数:1300
好评率:99.84615384615385
========================
商品名称:石头(roborock)扫拖一体机激光导航规划 智能家用吸尘器 S55(礼盒版)
总评价数:9600
好评率:99.79166666666667
========================
商品名称:石头(roborock) 智能家用全自动拖地吸尘器 扫拖吸一体机 S50
总评价数:70000
好评率:99.71428571428571
========================
商品名称:科沃斯(Ecovacs)扫拖一体机智能家用吸尘器激光导航规划 全自动洗擦拖地机地宝DN36
总评价数:6800
好评率:99.70588235294117
========================
商品名称:米家(MIJIA) 小米 智能规划路线吸尘器 智能自动 米家
总评价数:230000
好评率:99.69565217391305
========================
商品名称:石头(roborock)拖地 扫拖一体机激光导航规划 全自动智能家用吸尘器 S55
总评价数:9300
好评率:99.67741935483872
========================
商品名称:石头(roborock) 扫拖一体真规划 智能规划路线 家用吸尘器 S51
总评价数:43000
好评率:99.67441860465117
========================
商品名称:科沃斯 Ecovacs 智能扫拖一体全自动家用吸尘器拖地机地宝DG36
总评价数:2500
好评率:99.64
========================
商品名称:科沃斯(Ecovacs)智能家用吸尘器全自动洗擦拖地机地宝DS43
总评价数:1100
好评率:99.63636363636364
========================
商品名称:【京东JOY联名款】科沃斯 Ecovacs 地宝DG710 倾城扫拖吸一体真智能规划 家用全自动吸尘器拖地机
总评价数:53000
好评率:99.62264150943396
========================
商品名称:科沃斯(Ecovacs) 扫拖一体智能纤薄规划家用智能吸尘器拖地机地宝DK33
总评价数:6100
好评率:99.50819672131146
========================
商品名称:科沃斯 Ecovacs 地宝DE53 扫拖一体全自动智能规划路线家用吸尘器拖地机
总评价数:24000
好评率:99.5
========================
商品名称:科沃斯(Ecovacs)扫拖一体机智能家用吸尘器激光导航规划 全自动洗擦拖地机地宝DN39
总评价数:600
好评率:99.5
========================
商品名称:科沃斯(Ecovacs)扫拖一体机智能家用吸尘器激光导航规划 全自动洗擦拖地机地宝DN33
总评价数:37000
好评率:99.4864864864865
========================
商品名称:科沃斯(Ecovacs) 智能规划自动吸尘器家用拖地地宝DL33
总评价数:25000
好评率:99.44
========================
商品名称:科沃斯 Ecovacs  擦窗全自动智能家用擦玻璃清洁窗宝W83S
总评价数:3000
好评率:99.43333333333332
========================
商品名称:iRobot 智能可视化全景规划导航家用全自动吸尘器 Roomba961
总评价数:4400
好评率:99.31818181818181
========================
商品名称:海尔(Haier) 伯爵 手持版 自动APP智能规划式 拖地擦地一体机宠物家用吸尘器 TAB-JD5F0LSC
总评价数:10000
好评率:99.3
========================
商品名称:iRobot 扫擦组合 擦地智能可视化全景规划导航家用全自动洗地拖地吸尘器 961+381套装
总评价数:5700
好评率:99.29824561403508
========================
商品名称:海尔(Haier) 极光 镭射激光导航 智能扫地机APP智控 拖地擦地一体机 宠物吸尘器家用 TAB-JLH5W
总评价数:1700
好评率:99.29411764705883
========================
商品名称:科沃斯 Ecovacs  智能扫拖一体擦窗擦玻璃家用吸尘器拖地机组合套装DN33+W83S
总评价数:700
好评率:99.14285714285714
========================
商品名称:科沃斯(Ecovacs)地宝魔钻(BFD-wwt) 家用吸尘器全自动智能拖地机
总评价数:49000
好评率:98.9795918367347
========================
商品名称:飞利浦(PHILIPS)扫地机拖地机一体机智能家用纤薄吸尘器FC8796/82
总评价数:17000
好评率:98.94117647058823
========================
商品名称:戴森(Dyson)Dyson 360 Eye智能家用吸尘器全自动RB01蓝色
总评价数:3700
好评率:98.91891891891892
========================
商品名称:科沃斯(Ecovacs)地宝倾城规划扫拖一体机 一台顶两台家用智能吸尘器拖地机
总评价数:88000
好评率:98.86363636363636
========================
商品名称:iRobot 扫擦组合 擦地 智能家用全自动洗地拖地吸尘器 651+381套装
总评价数:9800
好评率:98.77551020408163
========================
商品名称:美的(Midea)R1-L083B全自动带拖布智能充电家用节能清扫吸尘器
总评价数:49000
好评率:98.57142857142858
========================
商品名称:科沃斯(Ecovacs)地宝魔镜S(CEN540-LG)家用吸尘器全自动智能拖地机
总评价数:210000
好评率:98.23809523809524
========================
商品名称:飞利浦(PHILIPS)长续航智能家用纤薄吸尘器FC8710/82
总评价数:19000
好评率:97.89473684210527
========================

从上到下,根据自己的需求进行了如下分析,Bobot小狗虽然好评率高,但是销量太低,忽略,然后是石头S55礼盒版石头S50科沃斯DN36米家扫地机器人石头S55等等,我显然没有闲钱去买礼盒版的S55,那么接下来可以考虑石头S50科沃斯DN36等,科沃斯DN36为镍氢电池,时间长了电池寿命缩减的厉害,所以从这个不成熟的结果来看,我打算入手石头S50,为什么不是石头S55或者石头S51呢,因为它们基本上都一样,所以我肯定愿意少掏钱,嘿嘿。

郑重声明,只做参考,不做推荐使用,还是要根据自己的需求来选择的

也许有人会问,你为何不直接在网页上查看然后自己计算好评率什么的,岂不是不用写代码了吗?我回你两点:
  • 第一:自己浏览然后计算,工作量不小。
  • 第二:你说的有道理,但是能不能早点问,害白费我这么大工夫写代码。

以上内容转载请注明出处,同时也请大家不吝你的关注和下面的赞赏

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

你可能感兴趣的:(扫地机器人选购------京东数据分析篇(Python爬虫))