本文轉(zhuǎn)載至微信公眾號「大數(shù)據(jù)前沿」,已獲取授權
下載W3Cschool手機App,0基礎隨時隨地學編程>>戳此了解
導言
二胖最近在逛京東的時候偶然發(fā)現(xiàn):MM們購買bra的記錄上竟然留下了尺寸和顏色等信息,我當時就想,要不要抓點數(shù)據(jù)下來看看啊
然后就有了這篇文章~~~
Let's go!
科普一下
在抓數(shù)據(jù)前,先給各位男性朋友科普一下,這個size信息到底怎么看(ps:我也是在網(wǎng)上查的(⊙o⊙)…)
70B,80C...到底啥意思?
數(shù)字的意思是下胸圍,是水平圍繞胸部底部一周的長度,即胸部下圍尺寸,單位是厘米。
如果下胸圍在68cm~72cm之間,那么就可以選擇70碼。
然后ABCDEFGH就是size了,請自行體會~~~
所以一個尺碼是由兩個參數(shù)組成~
分類
二胖發(fā)現(xiàn),一款產(chǎn)品并不是所有的尺寸都有,比如下面的兩張圖,第一款產(chǎn)品的尺寸只有ABC,而第二款產(chǎn)品的尺寸是B-F。
很少有一款產(chǎn)品所有尺寸都有。
所以,很難僅從一款產(chǎn)品推測出所有人的購買趨勢。
這里,二胖選擇了把小號(ABC)和大號(B-F)分開討論,并且每種型號各抓取三個不同的品牌來進行統(tǒng)計。
在這種情況下,數(shù)據(jù)不一定準確,但是至少能體現(xiàn)出大家的購買趨勢。
參數(shù)選擇
這里我們就選擇三個參數(shù)來分析,分別是產(chǎn)品的尺寸(你懂的,就是大小),產(chǎn)品的顏色以及用戶購買產(chǎn)品的平臺。
小號(A-C)
小號指的是僅有ABC尺碼的產(chǎn)品,這里統(tǒng)計了3款不同的產(chǎn)品,合計3000條交易記錄。
1.尺碼
從統(tǒng)計結(jié)果來看,小號產(chǎn)品中,75B和80B賣的最好。
2.顏色
在小號產(chǎn)品中,黑色最受用戶青睞,也許是相對比較性感?
3.購物平臺
總的來說,還是從京東App購買的用戶最多,但也可以看到,有8%的用戶是在微信平臺上進行交易,這已經(jīng)是一個不小的數(shù)字了。
大號(B-F)
1.尺碼
大號指的是尺碼在B-F之間的產(chǎn)品,和小號一樣,也是統(tǒng)計了3款不同的產(chǎn)品,合計3000條交易記錄。
大號產(chǎn)品的尺寸稍微多一些,從B-F都有,不過從大家的購買記錄來看,還是B占據(jù)了大頭,B和C加起來已經(jīng)超過了三分之二。
2.顏色
可能是由于具體產(chǎn)品的影響,大號和小號的顏色差別還挺大,大號最受歡迎的顏色是酒紅色,其次是紫色,不明覺厲~~
3.購物平臺
從購買來源上來說,兩種型號的產(chǎn)品差別不大,大多數(shù)用戶都是通過京東App購買的,不過也有細微的差別。
購買小號產(chǎn)品的用戶比購買大號產(chǎn)品的用戶更喜歡用iphone(大約高了4%)。
文件下載
代碼github地址:https://github.com/yangxuanxc/jingdong_crawler
視頻地址:https://v.qq.com/x/page/g0732q8orka.html
如對GitHub不熟悉,可前往下面的百度網(wǎng)盤進行下載
百度網(wǎng)盤下載鏈接: https://pan.baidu.com/s/1KUaYDn4_Vnfl1yaUR-DwrQ
密碼: gez5
技術分解
看完了上面的分析,我們來看看是如何將數(shù)據(jù)抓取下來的。
代碼和視頻講解的鏈接放在了留言區(qū),需要的同學自取~
上次給大家介紹了使用Java抓取微博數(shù)據(jù),而這次爬蟲使用的是Python的爬蟲框架Scrapy。
主要流程代碼如下:
# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
import json
import math
import time
import re
class BraSpider(scrapy.Spider):
name = 'bra'
headers = {
":authority": "sclub.jd.com",
":method": "GET",
":scheme": "https",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"accept-encoding": "gzip, deflate, br",
"accept-language:": "zh-CN,zh;q=0.9,en;q=0.8",
"cache-control": "max-age=0",
"upgrade-insecure-requests": "1",
"cookie":"t=8444fb486c0aa650928d929717a48022; _tb_token_=e66e31035631e; cookie2=104997325c258947c404278febd993f7",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
}
base_url = "https://sclub.jd.com/comment/productPageComments.action?productId=17209509645&score=0&sortType=5&pageSize=10&page=%d"
def start_requests(self):
for page in range(1,100):
url = self.base_url%page
print(url)
self.headers[':path'] = url
yield Request(url, self.parse,headers = self.headers)
#time.sleep(2)
def parse(self, response):
content = json.loads(response.text)
comments = content['comments']
for comment in comments:
item = {}
item['content'] = comment['content']#評論正文
item['guid'] = comment['guid']#用戶id
item['id'] = comment['id']#評論id
item['time'] = comment['referenceTime']#評論時間
item['color'] = self.parse_kuohao(comment['productColor'])#商品顏色
item['size'] = self.parse_kuohao(comment['productSize'])#商品尺碼
item['userClientShow'] = comment['userClientShow']#購物渠道
print(item)
yield item
#干掉括號
def parse_kuohao(self,text):
new_text = text
searchObj1 = re.search( r'(.+)', text, re.M|re.I)
searchObj2 = re.search( r'\(.+\)', text, re.M|re.I)
if searchObj1:
text = searchObj1.group().strip()
new_text = text.replace(text,'').strip()
if searchObj2:
text = searchObj2.group().strip()
new_text = text.replace(text,'').strip()
return new_text
除了代碼,二胖也錄制了一個小視頻教大家如何運行上面那段代碼。
附上視頻: