用 Python 爬取网易严选妹子内衣信息,探究妹纸们的偏好

作者:周萝卜

警告:本教程仅用作学习交流,请勿用作商业盈利,违者后果自负!如本文有侵犯任何组织集团公司的隐私或利益,请告知联系萝卜删除!!! 声明:这是一篇超级严肃的技术文,超!级!严!肃!请本着学习交流的态度阅读,谢谢!

网易商品评论爬取

- 分析网页

  • 评论分析

进入到网易精选官网,搜索“文胸”后,先随便点进一个商品。
在这里插入图片描述
在商品页面,打开 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)
            # save to mongoDB
            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更多学习资料可以加群获取
'''
# 链接 mongodb 获取数据
conn = MongoClient("mongodb://%s:%s@ds149974.mlab.com:49974/you163" % ('you163', 'you163'))
db = conn.you163
mongo_collection = db.you163

# 将数据转换成 DataFrame
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="颜色分布"),
    # datazoom_opts=opts.DataZoomOpts(),
)
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="尺寸分布"),
    # datazoom_opts=opts.DataZoomOpts(),
)
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')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值