作者:周萝卜
警告:本教程仅用作学习交流,请勿用作商业盈利,违者后果自负!如本文有侵犯任何组织集团公司的隐私或利益,请告知联系萝卜删除!!! 声明:这是一篇超级严肃的技术文,超!级!严!肃!请本着学习交流的态度阅读,谢谢!
网易商品评论爬取
- 分析网页
评论分析
进入到网易精选官网,搜索“文胸”后,先随便点进一个商品。 在商品页面,打开 Chrome 的控制台,切换至 Network 页,再把商品页面切换到评价标签下,选择一个评论文字,如“薄款、穿着舒适、满意”,在 Network 中搜索。 可以发现,评论文字是通过 listByItemByTag.json 传递过来的,点击进入该请求,并拷贝出该请求的 URL:
https
://you
.163.com
/xhr
/comment
/listByItemByTag
.json?csrf_token
=060f4782bf9fda38128cfaeafb661f8c&__timestamp
=1571106038283&itemId
=1616018&tag
=%E5
%85%A8
%E9
%83%A8
&size
=20&page
=1&orderBy
=0&oldItemTag
=%E5
%85%A8
%E9
%83%A8
&oldItemOrderBy
=0&tagChanged
=0
将该 URL 放入 Postman 中,逐个尝试 url query params,最后能够发现,只需保留 itemId 和 page 两个请求参数即可。 请求返回的是一个 JSON 格式的数据,下面就是分析该 JSON 数据了。
不难发现,所有的评论数据都存储在 commentList 中,我们只需保存该数据即可。
下面就是如何获取 itemId 的信息了,这个是产品的 ID,我们回到网易精选首页,继续分析。
产品 ID 获取
当我们在搜索框中输入关键字进行搜索的时候,同样能够发现在 Network 中有很多请求,此时可以观察各个请求,通过请求文件的名称(此处需要一些经验,守规矩的程序员都不会乱起名字),我们可以定位到搜索时展示搜索结果的请求。 搜索一般都是 search,所以我们就锁定了这个 search.json 的请求。同样把请求 URL 拷贝到 Postman 中,逐个验证传参,最后保留 page 和 keyword 两个参数即可。 该请求返回的数据较多,还是需要耐心的分析数据,也能够发现,在 result->data->directly->searcherResult->result 下面的 id 值,即为我们要获取的产品 ID。
以上,我们基本完成了前期的分析工作,下面开始代码的编写。
编写代码
获取产品 ID
def search_keyword(keyword
):
uri
= 'https://you.163.com/xhr/search/search.json'
query
= {
"keyword": keyword
,
"page": 1
}
try:
res
= requests
.get
(uri
, params
=query
).json
()
result
= res
['data']['directly']['searcherResult']['result']
product_id
= []
for r
in result
:
product_id
.append
(r
['id'])
return product_id
except:
raise
我这里是获取了 page 为 1 的产品 ID,下面就是通过产品 ID 来获取不同产品下的评论信息。
通过前面的分析,我们可以知道,评论信息都是如下形式的,对这种形式的信息,我们可以很方便地存储进入 MongoDB,然后再慢慢分析数据里的内容。
{
"skuInfo": [
"颜色:肤色",
"杯码:75B"
],
"frontUserName": "1****8",
"frontUserAvatar": "https://yanxuan.nosdn.127.net/f8f20a77db47b8c66c531c14c8b38ee7.jpg",
"content": "质量好,穿着舒服",
"createTime": 1555546727635,
"picList": [
"https://yanxuan.nosdn.127.net/742f28186d805571e4b3f28faa412941.jpg"
],
"commentReplyVO": null
,
"memberLevel": 4,
"appendCommentVO": null
,
"star": 5,
"itemId": 1680205
}
对于 MongoDB,我们既可以自己搭建,也可以使用网上免费的服务。
数据库有了,下面就是把数据保存进去了。
def details(product_id
):
url
= 'https://you.163.com/xhr/comment/listByItemByTag.json'
try:
C_list
= []
for i
in range(1, 100):
query
= {
"itemId": product_id
,
"page": i
,
}
res
= requests
.get
(url
, params
=query
).json
()
if not res
['data']['commentList']:
break
print("爬取第 %s 页评论" % i
)
commentList
= res
['data']['commentList']
C_list
.append
(commentList
)
time
.sleep
(1)
try:
mongo_collection
.insert_many
(commentList
)
except:
continue
return C_list
except:
raise
最后爬取完成之后,总共是七千多条数据,下面就可以根据个人需要做一些分析了。 爬取的数据 MongoDB 链接
conn = MongoClient(“mongodb://%s:%s@ds149974.mlab.com:49974/you163” % (‘you163’, ‘you163’)) db = conn.you163 mongo_collection = db.you163
商品评论数据分析
偏好颜色
先来看看妹子们偏好的颜色 可以看出,黑色是遥遥领先的哦,这里你要做到心中有数!
再通过饼状图来观察下不同颜色的占比情况 那么这些颜色中,有你的她喜欢的吗?
尺寸分布 没有问题,75B 就是大多数妹子的尺寸了
如果你对这种罩杯尺寸没有研究的话,不要紧,贴心的我给你准备了对照表,拿走不谢
商品评论
最后我们再来看看妹子们对于商品的评价情况 就星级评价上来看,大多数都是五星好评,毕竟打着“严选”的名号,质量是必须有保证的。
再来看看在评论区,妹子最喜欢用什么词语来描述呢 舒服、很舒服,非常舒服;满意、很满意,非常满意。 仿佛进入了“夸夸群”,看来妹子们首要看重的就是舒服与否,毕竟是贴身的,质量最重要!
好了,看了上面的分析,单身的你是不是更加有了脱单的冲动?如果是已经有软妹傍身的你,是不是该下手讨好下身边的她了呢?
完整代码
analyse.py
from pymongo
import MongoClient
import pandas
as pd
from pyecharts
.charts
import Bar
, Pie
from pyecharts
import options
as opts
import re
from wordcloud
import WordCloud
import jieba
from PIL
import Image
import numpy
as np
'''
python学习交流群:1136201545更多学习资料可以加群获取
'''
conn
= MongoClient
("mongodb://%s:%s@ds149974.mlab.com:49974/you163" % ('you163', 'you163'))
db
= conn
.you163
mongo_collection
= db
.you163
data
= pd
.DataFrame
(list(mongo_collection
.find
()))
skuinfo
= data
['skuInfo']
color
= []
cup_size
= []
for i
in skuinfo
.values
.tolist
():
temp_cup
= i
[1].split
(':')
if temp_cup
[0] == '杯码':
temp_size
= temp_cup
[1]
if '(' in temp_size
:
size
= temp_size
.split
('(')[0]
cup_size
.append
(size
)
else:
cup_size
.append
(temp_size
)
temp_color
= i
[0].split
(':')[1]
color
.append
(temp_color
)
df
= pd
.DataFrame
(color
, columns
=['color'])
analyse_color
= df
['color'].value_counts
()
bar
= Bar
()
bar
.add_xaxis
(analyse_color
.index
.values
.tolist
())
bar
.add_yaxis
("", analyse_color
.values
.tolist
())
bar
.set_global_opts
(
xaxis_opts
=opts
.AxisOpts
(axislabel_opts
=opts
.LabelOpts
(rotate
=-30)),
title_opts
=opts
.TitleOpts
(title
="颜色分布"),
)
bar
.render_notebook
()
pie
= Pie
()
pie
.add
("", [list(z
) for z
in zip(analyse_color
.index
.values
.tolist
(), analyse_color
.values
.tolist
())],
radius
=["30%", "75%"],
center
=["50%", "50%"],
rosetype
="area")
pie
.set_series_opts
(label_opts
=opts
.LabelOpts
(formatter
="{b}: {d}%"))
pie
.set_global_opts
(
title_opts
=opts
.TitleOpts
(title
="各颜色占比"),
legend_opts
=opts
.LegendOpts
(
type_
="scroll", pos_left
="80%", orient
="vertical"
)
)
pie
.render_notebook
()
rege
= r
'\d'
cup_size_new
= []
for i
in cup_size
:
check
= re
.match
(rege
, i
)
if check
:
cup_size_new
.append
(i
)
else:
tmp1
= i
[0]
tmp2
= i
[1:]
i
= tmp2
+ tmp1
cup_size_new
.append
(i
)
df2
= pd
.DataFrame
(cup_size_new
, columns
=['size'])
analyse_size
= df2
['size'].value_counts
()
bar
= Bar
()
bar
.add_xaxis
(analyse_size
.index
.values
.tolist
())
bar
.add_yaxis
("", analyse_size
.values
.tolist
())
bar
.set_global_opts
(
xaxis_opts
=opts
.AxisOpts
(axislabel_opts
=opts
.LabelOpts
(rotate
=-30)),
title_opts
=opts
.TitleOpts
(title
="尺寸分布"),
)
bar
.render_notebook
()
star
= data
['star'].value_counts
()
print(star
)
low_star_content
= data
[data
['star'] == 5]['content']
stopworld
= ('这', '那', '你', '我', '他', '她', '它')
font
= r
'C:\Windows\Fonts\FZSTK.TTF'
def gen_wordcloud(data
, pic
, world_pic
):
tmpstr
= ''
for i
in range(len(data
) - 1):
tmpstr
+= data
[i
]
pseg
= jieba
.lcut
(tmpstr
)
cut_word
= ''
for i
in pseg
:
if i
not in stopworld
:
cut_word
+= i
img
= Image
.open(pic
)
img_array
= np
.array
(img
)
wc
= WordCloud
(width
=1800, height
=1500, background_color
='white', font_path
=font
, mask
=img_array
)
wc
.generate
(cut_word
)
wc
.to_file
(world_pic
)
gen_wordcloud
(low_star_content
.values
.tolist
(), 'money.jpg', 'data_wc.png')