為妹子打抱不平,我深夜爬取了嚴(yán)選的男性?xún)?nèi)褲數(shù)據(jù),結(jié)果……

文 |?閑歡
來(lái)源:Python 技術(shù)「ID: pythonall」

上一篇文章通過(guò)爬取網(wǎng)易嚴(yán)選的評(píng)論數(shù)據(jù)來(lái)探究妹子們的內(nèi)衣尺碼、顏色偏好以及對(duì)內(nèi)衣的評(píng)價(jià),通過(guò)大家的反響發(fā)現(xiàn)好像無(wú)意中得罪了某類(lèi)群體,又滿(mǎn)足了某類(lèi)群體的某種特殊癖好。作為無(wú)意的舉動(dòng),作者深感愧疚。為了為妹子打抱不平,工作加班到深夜之后,我毅然犧牲睡覺(jué)時(shí)間,來(lái)爬取網(wǎng)易的男性?xún)?nèi)褲數(shù)據(jù),看看有什么發(fā)現(xiàn)。
爬取數(shù)據(jù)
首先,我們?cè)诰W(wǎng)易嚴(yán)選的搜索框輸入關(guān)鍵詞“男士?jī)?nèi)褲”,頁(yè)面搜索出來(lái)男士?jī)?nèi)褲的產(chǎn)品列表界面:

我們點(diǎn)開(kāi)第一個(gè)商品,點(diǎn)擊“評(píng)論”,就可以看到如下信息:

我們分析請(qǐng)求列表,就可以很容易地發(fā)現(xiàn)評(píng)論數(shù)據(jù)是通過(guò) https://you.163.com/xhr/comment/listByItemByTag.json 這個(gè)請(qǐng)求來(lái)獲取的。然后我們過(guò)濾請(qǐng)求參數(shù),去掉不是必傳的參數(shù),最終發(fā)現(xiàn) itemId 和 page 兩個(gè)參數(shù)是必須的。
itemId 是指商品的ID,page 就是指的請(qǐng)求的頁(yè)碼,默認(rèn)每頁(yè)記錄數(shù)是40。所以我們要獲取評(píng)論數(shù)據(jù)的前提是獲取到對(duì)應(yīng)的商品ID。
我們是從搜索頁(yè)面點(diǎn)擊產(chǎn)品進(jìn)入商品詳情頁(yè)的,所以搜索頁(yè)面的商品列表里面肯定存在每一個(gè)商品的商品ID,我們回到搜索產(chǎn)品列表頁(yè),尋找搜索商品的請(qǐng)求:

同樣的,我們?cè)谒阉鹘缑娴恼?qǐng)求分析中,找到了 http://you.163.com/xhr/search/search.json 這個(gè)請(qǐng)求,逐個(gè)分析請(qǐng)求參數(shù)后發(fā)現(xiàn),我們只需要 keyword 和 page 兩個(gè)參數(shù)即可。
請(qǐng)求分析完成后,我們就可以來(lái)碼代碼了。代碼如下:
# 獲取商品列表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_idexcept:raise# 獲取評(píng)論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']:breakprint("爬取第 %s 頁(yè)評(píng)論" % i)commentList = res['data']['commentList']C_list.extend(commentList)time.sleep(1)return C_listexcept:raiseproduct_id = search_keyword('男士?jī)?nèi)褲')r_list = []for p in product_id:r_list.extend(details(p))with open('./briefs.txt', 'w') as f:for r in r_list:try:f.write(json.dumps(r, ensure_ascii=False) + '\n')except:print('出錯(cuò)啦')
為了簡(jiǎn)單起見(jiàn),我抓取了首頁(yè)的40件商品的評(píng)論數(shù),將結(jié)果保存在 briefs.txt 文件中。文件數(shù)據(jù)的預(yù)覽如下:

分析數(shù)據(jù)
抓取完數(shù)據(jù)后,我們就可以進(jìn)入探索環(huán)節(jié)了,我想從顏色、尺碼、評(píng)論三個(gè)角度分析數(shù)據(jù),看看男士們內(nèi)褲的一些“特點(diǎn)”。
我們來(lái)看看數(shù)據(jù)結(jié)構(gòu)的特點(diǎn):
{"skuInfo": ["顏色:黑色","尺碼:M"],"frontUserName": "S****、","frontUserAvatar": "https://yanxuan.nosdn.127.net/0da37937c896cac1955bda8522d5754f.jpg","content": "非常好","createTime": 1592965119969,"picList": [],"commentReplyVO": null,"memberLevel": 5,"appendCommentVO": null,"star": 5,"itemId": 3544005}
仔細(xì)觀(guān)察這條評(píng)論數(shù)據(jù),我們可以看到顏色和尺碼都放在 skuInfo 這個(gè)數(shù)組里面,評(píng)論是放在 content 字段里面。同時(shí),我們多翻一些數(shù)據(jù)就可以發(fā)現(xiàn),顏色有好幾種格式:
單條裝的顏色,例如:顏色:淺麻灰 多條裝的顏色,例如:顏色:(黑色+麻灰+淺麻灰)3條 自選多條的顏色,例如:顏色:黑色+藏青色 其他,例如:規(guī)格:5條裝
這里,最后一種無(wú)法分辨出顏色,我準(zhǔn)備過(guò)濾掉。其他幾種,去除掉干擾,通過(guò)“+”就可以拆分出顏色來(lái)。
而尺碼數(shù)據(jù)格式是統(tǒng)一的,可以直接獲取。
我將顏色和尺碼都做成柱狀圖來(lái)展示,而評(píng)論就用詞云來(lái)展示。最終的效果圖如下:

顏色并沒(méi)有出乎我的意料,黑色遙遙領(lǐng)先,不過(guò),如果把幾種灰色加起來(lái)的話(huà),可能超過(guò)了黑色??傊?,黑色和灰色是大眾的選擇。

尺寸嘛,前三名是XL、L和XXL,不過(guò)XL和L相差不大。

從評(píng)論可以看出,不論是男性還是女性,對(duì)于內(nèi)衣的選擇,舒適度永遠(yuǎn)是第一的,質(zhì)量其次。想想也是的,質(zhì)量再好,穿著不舒服,是有點(diǎn)淡淡的憂(yōu)傷~
總結(jié)
網(wǎng)易嚴(yán)選的受眾群體是35歲以下的青年人,這個(gè)數(shù)據(jù)分析的結(jié)果也可以反應(yīng)這個(gè)年齡群體的普遍選擇。所以,廣大男青年們,在你們嘲笑女性尺碼多數(shù)是13的同時(shí),不要忘了人還沒(méi)到中年,腰包沒(méi)鼓起來(lái),腰帶已經(jīng)鼓起來(lái)了。多運(yùn)動(dòng)多注重身體管理吧!

