pDesitny
167
2020-03-11 01:51:29 작성 2020-03-11 01:55:07 수정됨
3
1122

무신사 파싱 (python, R)


무신사 돌면서 필요하다고 생각한게 내 몸무게와 키에 맞춰 어떤 사이즈를 골라야 할지 아는 거에요.

그래서 무신사 상품 페이지 보면 구입한 사람 100명을 뽑아 키, 몸무게, 성별, 만족도, 구매 사이즈 데이터를 뽑아 리스팅을 해주는데 대체 내 몸무게와 키와 성별을 가진 사람이 보통 어떤 사이즈에서 만족을 느끼는지 궁금하더라구요.  그걸 알면 굳이 고민하지 않고 데이터를 기준으로 선택하면 되니까요.

그래서 크롤러라긴 뭐하지만 파이선으로 페이지 파싱해서 R로 그래프를 그렸습니다.

먼저 python code 입니다.



## 무신사 사용자 사이즈별 만족도 리스트 만들기.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import csv

# url html 데이터 불러오기
html = urlopen("https://store.musinsa.com/app/product/detail/1177518/0")
bsObject = BeautifulSoup(html, "html.parser")

musinsa_recmmnd_list = bsObject.body.find("div", {"id":"product_size_recommend"})
lis = musinsa_recmmnd_list.find_all("li")

if musinsa_recmmnd_list.find_all("li") is not None:
        musinsa_dataframe = [["id", "sex", "height", "weight", "size", "satisfaction"]] # 먼저 헤더 작성.
        num = 1
        for li in lis:
            # 개별 리스트 아이템 내부 데이터 문자열
            size_content = li.find("p", {"class": "size_content"}).text
            
            #data 정규식으로 파싱.
            sex = re.findall("(남자|여자)", size_content)
            height = re.findall("1[0-9]{2}cm", size_content)
            weight = re.findall("[1-9][0-9]{1,2}kg", size_content)
            size = re.findall("(S|M|L|XL|XXL) Size", size_content)
            satisfaction = re.findall("(큼|적당함|작음)", size_content)

          

            if sex is not None and type(sex) == list and len(sex) != 0:
                sex = sex.pop()
            else:
                sex = None

            if height is not None and type(height) == list and len(height) != 0:
                height = height.pop()[0:3]
            else:
                height = None

            if weight is not None and type(weight) == list and len(weight) != 0:
                weight = weight.pop()[0:2]
            else:
                weight = None

            if size is not None and type(size) == list and len(size) != 0:
                size = size.pop()
            else:
                size = None

            if satisfaction is not None and type(satisfaction) == list and len(satisfaction) != 0:
                satisfaction = satisfaction.pop()
            else:
                satisfaction = None
            #test printing
            # print({
            #     "origin_txt": size_content,
            #     "id" : num, 
            #     "sex" : sex,
            #     "height" : height,
            #     "weight" : weight,
            #     "size" : size,
            #     "satisfaction" : satisfaction
            # })

            musinsa_dataframe.append([
                num,
                sex,
                height,
                weight,
                size,
                satisfaction
            ])

            num += 1

            #csv 파일을 만듭니다.

            with open("musinsa_size_satisfaction.csv", "w", encoding="utf-8") as musinsa_csv:
                wr = csv.writer(musinsa_csv, quoting=csv.QUOTE_NONE)
                wr.writerows(musinsa_dataframe)
else:
    print("No data found")


이때 csv 파일을 다시 ansi 인코딩으로 바꾸어서 저장해야만 R에서 돌아갑니다.ㅠㅠ

이점 참고해 주세용


그렇게 파싱을 끝내고 귀중한 csv 파일을 얻어 낼 수 있었다면 아래의 R 코드를 이용해 그래프를 그리거나 그룹화해 데이터를 확인 해 볼 수 있습니다.


# 무신사 만족도 그래프로 그리기

# 필요 페키지 다운로드

install.packages("ggplot2")
install.packages("dplyr")

# 필요 패키지 부착

library(ggplot2)
library(dplyr)

# csv 파일 로드

csv_file_loc <- "csv file path with file delimiter / not \" in window"

musinsa_satisfaction_d <- read.csv(csv_file_loc, header=T)

# 내 키와 몸무게 성별 조건으로 필터링
musinsa_filtr <- musinsa_satisfaction_d %>% filter(
  height >= 165 & height <= 175 & weight <= 75 & weight >= 65 & sex == "남자"
)

# 만족도와 사이즈별로 그룹핑 하여 테이블로 분석

musinsa_filtr_1 <- musinsa_filtr %>% group_by(satisfaction, size) %>% summarise(count = n())

# 사이즈별 만족 횟수 바그래프 사용하여 출력

musinsa_filtr_2 <- musinsa_filtr %>% filter(satisfaction == "적당함") %>%  group_by(size) %>% summarise(count = n())

ggplot(musinsa_filtr_2, aes(x = size, y = count)) + geom_col()

(okky는 왜인지 R 코드 블럭은 지원을 안하네요)


이 코드를 이용해 아래와 같은 데이터를 뽑아 낼 수 있습니다. (조건은 키 165~175, 몸무게 65 ~ 75, 성별 남성 이 기준입니다.)




첫번째로 만족도와 size를 그룹핑 했을 때 적당함이 가장 높은건 L과 M 순이네요. 요즘 오버핏이 유행인게 대이터로 보이는군요 ㅎㅎ.


이 데이터만으로도 L 를 고를경우 대세를 따르고, 만족할 확률이 높다는걸 알 수 있죠.


테이블은 보기 어려우니 그래프로 사이즈별로 만족한 사람의 도수를 구하는 바 그래프를 그려보았습니다.



이렇게 보아도 단연코 L를 고르는 것이 이상적이라고 생각됩니다. 


이상 R과 Python을 이용한 간단한 분석이었습니다. ㅎㅎ 


나중에 시간이 남으면 웹으로 만들어서 배포도 해보는 기회가 있으면 좋겠네요. ㅋ

2
0
  • 댓글 3

  • pDesitny
    167
    2020-03-13 03:30:23

    구매한 옷의 사이즈는 만족스럽습니다 ㅎㅎ

    0
  • 쿠둥탁
    45
    2020-03-14 00:12:32

    이거 재밌네요 웹 크롤링 공부할 때 저도 한번 시도해봐야겠습니다 ㅋㅋㅋㅋ

    1
  • pDesitny
    167
    2020-03-14 08:22:10

    @쿠둥탁 저도 소련여자 좋아합니다 ㅋㅋㅋ

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.