App下載

用Python抓取某東購(gòu)買記錄并統(tǒng)計(jì)MM的bra大小(附代碼)

猿友 2018-08-08 19:02:46 瀏覽數(shù) (10659)
反饋

本文轉(zhuǎn)載至微信公眾號(hào)「大數(shù)據(jù)前沿」,已獲取授權(quán)

下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解

導(dǎo)言

二胖最近在逛京東的時(shí)候偶然發(fā)現(xiàn):MM們購(gòu)買bra的記錄上竟然留下了尺寸和顏色等信息,我當(dāng)時(shí)就想,要不要抓點(diǎn)數(shù)據(jù)下來看看啊

然后就有了這篇文章~~~

Let's go!


科普一下

在抓數(shù)據(jù)前,先給各位男性朋友科普一下,這個(gè)size信息到底怎么看(ps:我也是在網(wǎng)上查的(⊙o⊙)…)

70B,80C...到底啥意思?

數(shù)字的意思是下胸圍,是水平圍繞胸部底部一周的長(zhǎng)度,即胸部下圍尺寸,單位是厘米。

如果下胸圍在68cm~72cm之間,那么就可以選擇70碼。

然后ABCDEFGH就是size了,請(qǐng)自行體會(huì)~~~

所以一個(gè)尺碼是由兩個(gè)參數(shù)組成~


分類

二胖發(fā)現(xiàn),一款產(chǎn)品并不是所有的尺寸都有,比如下面的兩張圖,第一款產(chǎn)品的尺寸只有ABC,而第二款產(chǎn)品的尺寸是B-F。

很少有一款產(chǎn)品所有尺寸都有。

所以,很難僅從一款產(chǎn)品推測(cè)出所有人的購(gòu)買趨勢(shì)。

這里,二胖選擇了把小號(hào)(ABC)和大號(hào)(B-F)分開討論,并且每種型號(hào)各抓取三個(gè)不同的品牌來進(jìn)行統(tǒng)計(jì)。

在這種情況下,數(shù)據(jù)不一定準(zhǔn)確,但是至少能體現(xiàn)出大家的購(gòu)買趨勢(shì)。


參數(shù)選擇

這里我們就選擇三個(gè)參數(shù)來分析,分別是產(chǎn)品的尺寸(你懂的,就是大小),產(chǎn)品的顏色以及用戶購(gòu)買產(chǎn)品的平臺(tái)。

小號(hào)(A-C)

小號(hào)指的是僅有ABC尺碼的產(chǎn)品,這里統(tǒng)計(jì)了3款不同的產(chǎn)品,合計(jì)3000條交易記錄。

1.尺碼

從統(tǒng)計(jì)結(jié)果來看,小號(hào)產(chǎn)品中,75B80B賣的最好。


2.顏色

在小號(hào)產(chǎn)品中,黑色最受用戶青睞,也許是相對(duì)比較性感?


3.購(gòu)物平臺(tái)

總的來說,還是從京東App購(gòu)買的用戶最多,但也可以看到,有8%的用戶是在微信平臺(tái)上進(jìn)行交易,這已經(jīng)是一個(gè)不小的數(shù)字了。


大號(hào)(B-F)

1.尺碼

大號(hào)指的是尺碼在B-F之間的產(chǎn)品,和小號(hào)一樣,也是統(tǒng)計(jì)了3款不同的產(chǎn)品,合計(jì)3000條交易記錄。

大號(hào)產(chǎn)品的尺寸稍微多一些,從B-F都有,不過從大家的購(gòu)買記錄來看,還是B占據(jù)了大頭,B和C加起來已經(jīng)超過了三分之二。


2.顏色

可能是由于具體產(chǎn)品的影響,大號(hào)和小號(hào)的顏色差別還挺大,大號(hào)最受歡迎的顏色是酒紅色,其次是紫色,不明覺厲~~


3.購(gòu)物平臺(tái)

從購(gòu)買來源上來說,兩種型號(hào)的產(chǎn)品差別不大,大多數(shù)用戶都是通過京東App購(gòu)買的,不過也有細(xì)微的差別。

購(gòu)買小號(hào)產(chǎn)品的用戶比購(gòu)買大號(hào)產(chǎn)品的用戶更喜歡用iphone(大約高了4%)。


文件下載

代碼github地址:https://github.com/yangxuanxc/jingdong_crawler
視頻地址:https://v.qq.com/x/page/g0732q8orka.html

如對(duì)GitHub不熟悉,可前往下面的百度網(wǎng)盤進(jìn)行下載

百度網(wǎng)盤下載鏈接: https://pan.baidu.com/s/1KUaYDn4_Vnfl1yaUR-DwrQ

密碼: gez5


技術(shù)分解

看完了上面的分析,我們來看看是如何將數(shù)據(jù)抓取下來的。

代碼和視頻講解的鏈接放在了留言區(qū),需要的同學(xué)自取~

上次給大家介紹了使用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']#評(píng)論正文
            item['guid'] = comment['guid']#用戶id
            item['id'] = comment['id']#評(píng)論id
            item['time'] = comment['referenceTime']#評(píng)論時(shí)間
            item['color'] = self.parse_kuohao(comment['productColor'])#商品顏色
            item['size'] = self.parse_kuohao(comment['productSize'])#商品尺碼
            item['userClientShow'] = comment['userClientShow']#購(gòu)物渠道
            print(item)
            yield item

    #干掉括號(hào)
    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

除了代碼,二胖也錄制了一個(gè)小視頻教大家如何運(yùn)行上面那段代碼。

附上視頻:

1 人點(diǎn)贊