記一次用Python統計全國女性Size

前言

  • 最近閒來無事,又正好在學習Python數據分析統計,於是便萌生一種想法:統計京東購買記錄,分析全國女性平均Size

準備工作

  • 首先查詢京東網站,輸入查詢內容xz,查到87萬+商品
  • 購買size可以在評論區找到(就擺在那兒,那也太簡單了,後面才知道我想多了。。。)
    在這裏插入圖片描述
  • 先看域名,發現每一個域名的構成都是https://item.jd.com/然後加一串數字.html,經驗告訴我,這串數字一定是商品id。
  • 找id的話就要到搜索頁面找了,果然,在分析搜索頁面之後,發現id就躺在靜態頁面中。在這裏插入圖片描述
  • 思路有了,準備寫代碼。。。

開始碼代碼

  • 第一步當然是獲取id了,通過分析搜索域名(不得不說jd的反爬機制,唉,這裏不好評價,自行體會,分析過程如下。)在這裏插入圖片描述
  • 需要注意的就是keyword,wq(全拼),還有後面的page和s,這幾個參數是改變的

keyword傳入商品名稱,wq傳入商品全拼,page傳入商品頁(jd是按照奇數排序),s的話,需要計算,見代碼。

#爬取商品id
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'}
def get_id(key_word,wq):
    #jd_url='https://search.jd.com/Search?keyword=%E5%A5%B3%E6%80%A7%E5%86%85%E8%A1%A3&enc=utf-8&wq=%E5%A5%B3%E6%80%A7nei%27yi&pvid=fafd7af082734ae1a4a6cb674f98b2e4'
    jd_url = 'https://search.jd.com/Search'
    product_ids = []
    # 爬前3頁的商品
    j = 51;
    for i in range(17,25,2):
        param = {'keyword': key_word, 'enc': 'utf-8', 'qrst':'1', 'rt':1, 'stop':1, 'vt':2, 'wq':wq, 'page':i, 's':j, 'click':0}
        response = requests.get(jd_url,params = param,headers=headers)
        # 商品id
        ids = re.findall('data-pid="(.*?)"', response.text,re.S)
        product_ids += ids
        if i!= 3:
            j = j+50+i-4;
        else:
            j+=50
    return product_ids
  • 獲取id之後我們進入頁面,準備獲取評價裏的購買尺寸,用靜態網站方法爬一下,正則表達式分析一手,發現根本無法獲得購買尺寸,再一看,獲取的html頁面中根本沒有評價內容,經驗告訴我這是通過json接口傳入的。
  • 於是,就開始了我的找接口。。。。(此處省略兩個小時)
  • 在我的不懈努力下,終於找到了接口。。。圖片.png
  • 下面分析接口url(也不難)。
    圖片.png- 分析並不難,直接上代碼,這次沒有用params的參數,而是用的字符串拼接,因爲params一直報錯,搞了好久。
#爬取Size
def getSizes(ids):
    Sizes = []
    for id in ids:
        for i in range(0,8):
            url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId='+id+'&score=0&sortType=5&page='+str(i)+'&pageSize=10&isShadowSku=0&fold=1'
            response = requests.get(url)
            size = re.findall('"productSize":"(.*?)"',response.text)
            Sizes+=size
    return Sizes
  • 爬取Size後,發現Size並不統一,有的用XXL,有的用ABC,所以需要清洗一下獲取的數據,如下
#數據清洗(統一尺碼)
def unified(str):
    if 'E' in str:
        return 'E'
    if 'D' in str:
        return 'D'
    if 'C' in str:
        return 'C'
    if 'B' in str:
        return 'B'
    if 'A' in str:
        return 'A'
    if 'XXL' in str:
        return 'E'
    if 'XL' in str:
        return 'D'
    if 'L' in str:
        return 'C'
    if 'M' in str:
        return 'B'
    if 'S' in str:
        return 'A'
    if '均碼' in str:
        return 'B'
    if '大' in str:
        return 'C'
    if '小' in str:
        return 'A'
  • 搞定這一切後,想要對Size進行分析,但是我感覺直接在PyCharm裏面分析有點難看,好吧,主要是想用上最近學的juty notebook。於是我便把獲取到的數據先寫入MySQL,再轉到juty notebook進行分析。
#運行並寫入數據庫
conn = pymysql.connect(host='localhost',user='root',password='123',database='size',port=3306) #連接數據庫
cursor = conn.cursor()
ids = get_id("胸罩","xiong'zhao") #獲取id
Sizes = getSizes(ids) #獲取sizes
Sizes_flush = [] 
for size in Sizes:  #清洗Sizes
    if unified(size) is not None:
        Sizes_flush+=unified(size)
        sql = "INSERT INTO jd_size(size) values('" + unified(size) + "');"
        cursor.execute(sql)  #入庫
        conn.commit()

開始分析

  • 首先連接數據庫並讀入數據
    在這裏插入圖片描述
  • 然後對獲取到的數據進行分類彙總
    在這裏插入圖片描述
  • 彙總之後就明顯可以看出來,B佔大多數了,然後開始繪製一下餅圖。在這裏插入圖片描述
  • 果然,B佔一半以上,接下來再繪製一下直方圖。在這裏插入圖片描述

很直觀是不是?最後送大家一套2020最有趣的Pyhon項目實戰視頻教程,點我進來獲取,跟着練習下,希望大家一起進步哦!

至此,我們的分析項目就完成了,經統計,全國女性大多爲B杯。

完整項目代碼見https://github.com/lrffun/My_Python/tree/master/Size

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章