欢迎大家关注我的微信公众号“IT工匠”获取更多资源(涉及算法、数据结构、java、深度学习、计算机网络、python、Android等互联网技术资料)。
前言
关于老罗做手机这件事大家看法不一,有人说是他入错了行,有人说是他生不逢时,那么抛开个人情感因素,不谈情怀、不谈信仰,锤子手机的质量到底怎么样?我想能回答这个问题的只有锤子手机的用户,为了有一个更加直观的数据支撑,笔者从京东上爬取了坚果3手机的用户评论,我们来通过数据看看用户到底给这个新东方的英语老师做出来的手机打几分,由于文中涉及部分代码,对技术不感兴趣的读者直接跳过即可,直接看结果分析部分,希望看完本文我们都能给锤子一个公平的看法。
从网页爬取数据
思路
首先我们打开京东商城坚果3 的购买页面:
然后按F12进入开发者控制台(审查元素):
发现什么都没有,不要紧,点开评论区,你就会发现控制台出现类似这些信息:
控制台从刚才的没有信息到现在获取到当前信息,唯一的变化就是你打开了评论,所以网页返回的评论区内容一定在当前控制台的某个位置,从Name字段一个一个分析,就可以发现很明显的一行:
很明显这里就是我们需要的评论区数据,然后仔细分析其对应的Headers,就会发现我们获取数据需要的基本信息:
然后点开preview,就会发现返回数据转化为json格式后的内容:
进一步打开Response,看到网页返回的原始数据是用一个fetchJSON_comment98vv1587包裹着的json字符串,到这里,我们的思路就很清晰了:
首先用URL和对应的Query String Parameters模仿网页发送请求,收到的Response将会是一份由fetchJSON_comment98vv1587()包裹着的包含json数据的String,我们用正则表达式将json数据提取出来,然后对json数据进行解析并获取想要字段的数据即可。代码实现
首先根据网页控制台的信息定义相关必要的变量:
url='https://club.jd.com/comment/productPageComments.action'
QueryStringParameters={ 'callback':'fetchJSON_comment98vv1587',
'productId':'7029545',
'score':0,
'sortType':5,
'page':0,
'pageSize':10,
'isShadowSku':0,
'fold':1 }
需要注意的是这里的url并不是直接将控制台显示的url全部拿过来,而是只要其前一部分,因为如果用控制台上的url,则只能获取到当前页面的评论,我们想要获取全部的评论,所以必须动态变化url,这里我们将url分为两部分写,这样方便后面调整page以获取不同页面的评论。
然后实现爬取数据的逻辑代码:
hotcomments = []
while(True):
t=s.get(url,params=data).text #模拟网页发送请求并接收返回数据
try:
t=re.search(r'(?<=fetchJSON_comment98vv1587\().*(?=\);)',t).group(0)#使用正则表达式匹配‘fetchJSON_comment98vv1587’
except Exception as e:
break
j=json.loads(t) #解析json
commentSummary=j['comments']
flag=0
for comment in commentSummary:
flag=1
num=num+1
item = {
'content': comment['content'] ,
'nickname': comment['nickname'],
'score': comment['score'],
'creationTime':comment['creationTime'],
'productColor':comment['productColor']
}
hotcomments.append(item)
if flag==0:
break
data['page']+=1 #改变page字段,下一次循环爬取下一页评论
当以上当以上代码执行完成之后就可以将所有评论信息放在 hotcomments中,然后就可以从中拿取数据进行分析了。
使用Bar进行各项指标柱状图可视化
三种不同颜色评论数量所占百分比
a= productColor.count(u'碳黑色')
b=productColor.count(u'酒红色')
c=productColor.count(u'浅金色')
d=float(a+b+c)
a=float(a/d)
b=float(b/d)
c=float(c/d)
ds = tablib.Dataset()
ds.headers = ['颜色', '评论数']
ds.append(['碳黑色',a])
ds.append(['酒红色', b])
ds.append(['浅金色', c])
bar = Bar('颜色')
bar.add('评论数量(%)', ds.get_col(0), ds.get_col(1))
bar.render('color_bar.html')
从9号到26号单天评价数量所占百分比
ds2 = tablib.Dataset()
ds2.headers = ['评价时间', '评论数']
f=0.0
for i in range(9,27):
f=f+creationTime.count(i)
for i in range(9,27):
ds2.append([str(i), creationTime.count(i)/f])
bar2 = Bar('评价时间(购买时间)')
bar2.add('评论数量(%)', ds2.get_col(0), ds2.get_col(1))
bar2.render('time_bar.html')
不同评分所占百分比
ds3 = tablib.Dataset()
ds3.headers = ['评分', '评论数']
e=0.0
for i in range(0,6):
j=5-i
e+=score.count(j)
for i in range(0,6):
j=5-i
ds3.append([str(j), score.count(j)/e])
bar3 = Bar('评分')
bar3.add('评论数量(%)', ds3.get_col(0), ds3.get_col(1))
bar3.render('score_bar.html')
使用WordCloud进行评论词云可视化
content_text = " ".join(content_list)
bg_pic = imread('../WoMen_EasonChen/eason2.png')
wordcloud = WordCloud(mask=bg_pic,font_path='../Font/SourceHanSansSC-Heavy.otf',background_color='white',max_words=200).generate(content_text)
plt.figure()
plt.imshow(wordcloud,interpolation='bilinear')
plt.axis('off')
plt.show()
可视化结果
从图中可以看出,大部分用户比较喜欢碳黑色(74.38%),购买浅金色的用户最少,约占5%
可以看到95%的用户都给出了5分好评
6
最后看一下词云显示的内容
再给一张:
后记
我们在网上可以看到很多对锤子手机褒贬不一的网友,本文对锤子手机不做任何评价,相信用户的评论是最真实的,另外本人个人对罗永浩没有任何感情,不是罗粉也不是锤粉,只是觉得中国像罗永浩这样天生骄傲的企业家不多了,就像罗振宇老师说的希望罗永浩成功那样,我也希望罗老师成功,因为中国需要这么一个天生骄傲的企业家,希望罗老师会是下一个乔布斯甚至超越乔布斯,虽然结局可能是被现实残忍地打脸,但是男人么,哪有一帆风顺,做过才不留遗憾。
推荐阅读:lcd屏