호쌤
호쌤 Just For Fun

[Python 데이터 수집] Selienium을 활용한 쇼핑몰 장바구니 데이터 수집

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] Selienium을 활용한 쇼핑몰 장바구니 데이터 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 수집] Selienium을 활용한 쇼핑몰 장바구니 데이터 수집

Selienium을 활용하면 로그인을 해야만 접근 가능한 웹 페이지도 손쉽게 데이터를 수집할 수 있습니다. 이 포스팅에서는 샘플 쇼핑몰 웹 사이트에 저장되어 있는 장바구니에 담긴 상품의 총 합계 금액을 구하는 예제를 소개합니다.

쇼핑몰 회원가입, 로그인 및 장바구니에 상품 담기

먼저 예제를 위해 준비한 쇼핑몰에 회원가입후 로그인을 하고 장바구니에 상품을 무작위로 담습니다.

http://itproject.ezenac.co.kr/springmyshop

page

01. 필요한 모듈 참조

1
2
3
4
5
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from pandas import DataFrame
import time

#02. 크롬브라우저 객체 생성

1
2
3
4
# 맥이나 리눅스의 경우 파일 확장자가 없다. 윈도우의 경우 exe 확장자까지 명시해야 한다.
driver = webdriver.Chrome('./chromedriver.exe')
# 모든 동작마다 크롬브라우저가 준비될 때 까지 최대 5초씩 대기
driver.implicitly_wait(5)

#03. 샘플 쇼핑몰 로그인

1) 로그인 페이지로 이동하기

1
2
3
driver.get("http://itproject.ezenac.co.kr/springmyshop/account/login")
# 페이지를 이동하는 동안 최대 3초간 대기
time.sleep(3)

2) 로그인하기

아이디 입력 요소에 키 입력 보내기

1
2
id_input = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("#user_id"))
id_input.send_keys("자신의 아이디")

비밀번호 입력 요소를 찾아서 입력하기

1
2
pw_input = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("#user_pw"))
pw_input.send_keys("자신의 비밀번호")

로그인 버튼을 찾아서 클릭하기

1
2
login_button = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("button[type='submit']"))
login_button.click()

로그인 후 페이지가 이동하는 동안 최대 3초간 대기

1
time.sleep(3)

#03. 장바구니 데이터 수집

1) 장바구니 페이지로 이동

1
2
3
driver.get("http://itproject.ezenac.co.kr/springmyshop/shopping/cart")
# 페이지를 이동하는 동안 최대 3초간 대기
time.sleep(3)

2) 장바구니 페이지의 HTML 코드를 BeautifulShop 객체로 생성

HTML 코드 추출

1
html = driver.page_source

추출한 코드를 BeautifulSoup 객체로 변환

1
soup = BeautifulSoup(html, 'html.parser')

크롬브라우저 닫기

1
driver.quit()

3) BeautifulShop을 활용하여 장바구니 데이터 가져오기

장바구니 내역 가져오기

한 줄을 의미하는 셀렉터는 .cart-item 임을 알 수 있다.

img

1
2
tr = soup.select(".cart-item")
tr
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
[<tr class="cart-item cart-item-159">
 <td class="text-center" rowspan="1">
 <input checked="" class="cart_id" name="cart_id[]" type="checkbox" value="159"/>
 </td>
 <td class="text-center" rowspan="1">
 <a href="/springmyshop/product/detail/2151">
 <img src="/springmyshop/upload/products/2151_title_resize_150x150.jpg" width="50"/>
 </a>
 </td>
 <td class="text-center" rowspan="1">
 <a href="/springmyshop/product/detail/2151">뷰이텐 호피롱스커트</a>
 </td>
 <td class="text-center">브라운(brown)</td>
 <td class="text-center">
 <span class="price" data-value="29800">
                                                 29,800</span>
 <span>원</span>
 </td>
 <td class="text-center">1</td>
 <td class="text-center text-primary">
 <span class="total" data-value="29800">
                                                 29,800</span>
 <span>원</span>
 </td>
 <td class="text-center">
 <strong class="text-warning"><span class="order-price" data-value="29800">
                                                         29,800</span>원</strong>
 </td>
 <td class="text-center">
 <button class="btn-cart-remove btn btn-danger btn-xs" data-cart-id="159" data-product-name="뷰이텐 호피롱스커트">
 <i aria-hidden="true" class="fa fa-trash"></i>
 </button>
 </td>
 </tr>, <tr class="cart-item cart-item-537">
 <td class="text-center" rowspan="1">
 <input checked="" class="cart_id" name="cart_id[]" type="checkbox" value="537"/>
 </td>
 <td class="text-center" rowspan="1">
 <a href="/springmyshop/product/detail/2173">
 <img src="/springmyshop/upload/products/2173_title_resize_150x150.jpg" width="50"/>
 </a>
 </td>
 <td class="text-center" rowspan="1">
 <a href="/springmyshop/product/detail/2173">홀렌디 롱스커트</a>
 </td>
 <td class="text-center">레드(red)</td>
 <td class="text-center">
 <span class="price" data-value="29900">
                                                 29,900</span>
 <span>원</span>
 </td>
 <td class="text-center">1</td>
 <td class="text-center text-primary">
 <span class="total" data-value="29900">
                                                 29,900</span>
 <span>원</span>
 </td>
 <td class="text-center">
 <strong class="text-warning"><span class="order-price" data-value="29900">
                                                         29,900</span>원</strong>
 </td>
 <td class="text-center">
 <button class="btn-cart-remove btn btn-danger btn-xs" data-cart-id="537" data-product-name="홀렌디 롱스커트">
 <i aria-hidden="true" class="fa fa-trash"></i>
 </button>
 </td>
 </tr>, <tr class="cart-item cart-item-538">
 <td class="text-center" rowspan="1">
 <input checked="" class="cart_id" name="cart_id[]" type="checkbox" value="538"/>
 </td>
 <td class="text-center" rowspan="1">
 <a href="/springmyshop/product/detail/2155">
 <img src="/springmyshop/upload/products/2155_title_resize_150x150.jpg" width="50"/>
 </a>
 </td>
 <td class="text-center" rowspan="1">
 <a href="/springmyshop/product/detail/2155">러브리 카라원피스</a>
 </td>
 <td class="text-center">머스타드(mustard)</td>
 <td class="text-center">
 <span class="price" data-value="26800">
                                                 26,800</span>
 <span>원</span>
 </td>
 <td class="text-center">1</td>
 <td class="text-center text-primary">
 <span class="total" data-value="26800">
                                                 26,800</span>
 <span>원</span>
 </td>
 <td class="text-center">
 <strong class="text-warning"><span class="order-price" data-value="26800">
                                                         26,800</span>원</strong>
 </td>
 <td class="text-center">
 <button class="btn-cart-remove btn btn-danger btn-xs" data-cart-id="538" data-product-name="러브리 카라원피스">
 <i aria-hidden="true" class="fa fa-trash"></i>
 </button>
 </td>
 </tr>]

장바구니의 상품 수 만큼 반복하면서 개별 항목 가져오기

하나의 .cart-item 안에 공통적으로 .text-center라는 클래스가 적용된 <td>태그에 정보가 표시되고 있다.

이 항목들 중 체크박스, 상품이미지, 삭제 버튼은 필요 없으므로 0, 1, 8 번째 항목은 처리할 필요가 없다.

또한 상품가격, 수량, 합계금액 등 숫자 형식의 데이터는 콤마(,)나 글자를 제거하고 숫자로 변환해야 한다.

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 수집 결과를 모아 놓기 위한 빈 리스트
cart = []

for tr_item in tr:
    td = tr_item.select(".text-center")
    
    item_dict = {
        "상품명": td[2].text.strip(),
        "옵션": td[3].text.strip(),
        "상품가격": int(td[4].text.strip().replace("원", "").replace(",", "")),
        "수량": int(td[5].text.strip()),
        "합계": int(td[6].text.strip().replace("원", "").replace(",", "")),
        "판매금액": int(td[7].text.strip().replace("원", "").replace(",", "")),
    }
    
    cart.append(item_dict)
    
cart
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[{'상품명': '뷰이텐 호피롱스커트',
  '옵션': '브라운(brown)',
  '상품가격': 29800,
  '수량': 1,
  '합계': 29800,
  '판매금액': 29800},
 {'상품명': '홀렌디 롱스커트',
  '옵션': '레드(red)',
  '상품가격': 29900,
  '수량': 1,
  '합계': 29900,
  '판매금액': 29900},
 {'상품명': '러브리 카라원피스',
  '옵션': '머스타드(mustard)',
  '상품가격': 26800,
  '수량': 1,
  '합계': 26800,
  '판매금액': 26800}]

장바구니 내역을 데이터프레임으로 변환

1
2
cart_df = DataFrame(cart)
cart_df
▶ 출력결과
상품명 옵션 상품가격 수량 합계 판매금액
0 뷰이텐 호피롱스커트 브라운(brown) 29800 1 29800 29800
1 홀렌디 롱스커트 레드(red) 29900 1 29900 29900
2 러브리 카라원피스 머스타드(mustard) 26800 1 26800 26800

판매금액의 총 합 구하기

1
cart_df['판매금액'].sum()
▶ 출력결과
1
86500
Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] Selienium을 활용한 쇼핑몰 장바구니 데이터 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus