扫地机器人选购------京东数据分析篇(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
呢,因为它们基本上都一样,所以我肯定愿意少掏钱,嘿嘿。郑重声明,只做参考,不做推荐使用,还是要根据自己的需求来选择的
也许有人会问,你为何不直接在网页上查看然后自己计算好评率什么的,岂不是不用写代码了吗?我回你两点:
- 第一:自己浏览然后计算,工作量不小。
- 第二:你说的有道理,但是能不能早点问,害白费我这么大工夫写代码。