cafe24 매출을 한눈에 파악하기 위해 cafe24 매출 데이터를 확인했다. cafe24 매출 데이터를 확인하기 위해서는 주문관리 메뉴에서 간단히 확인 가능하다. 그러나 합산된 내용 말고 일자별 데이터를 원했어로 다음 메뉴로 넘어간다.

자세한 정보를 확인 하기 위해서는 통계관리 메뉴로 이동하여 일별, 주별, 월별 매출내용을 확인할 수 있다. 일별 매출 데이터를 수집하려 한다. 하루에 몇 건의 주문이 있었고 이 주문으로 몇 개의 품목이 판매되었으며 할인, 배송비, 적립금 사용정보도 확인할 수 있다. 지금으로서는 이 데이터면 충분하다.

일별 매출내역 테이블 오른쪽 상단에 자세히보기와 데이터 보기 개수를 설정하여 수집할 내용을 확장할 수 있다.

Python으로 제어 해야하는 요소들을 크게 두 가지로 나뉜다.
1. 데이터 수집기간
제공된 버튼을 사용하지 않고 오른쪽의 날짜 입력란에 원하는 수집기간을 입력이 가능한지 확인한다.


id="pr_start_date"와 id="pr_end_date"의 value에 날짜를 변경하여 매출 데이터를 조회할 수 있다.
2. 자세히보기와 데이터 개수
자세히 보기 체크박스 클릭하는 작업과
데이터 보기 개수를 변경하여 한번에 수집할 데이터양을 조절할 수 있다.


최대 100개라 표시되어 있지만 value="100" 부분을 수정하여 최대 500개의 데이터를 가져올 수 있도록 수정하여 원하는 기간을 한 번에 수집한다. 500개로 value를 수정후 테스트를 해보니 한번에 모든 데이를 수집할 수 있는 것을 확인했다.

일별 매출 데이터 형식 파악
데이터의 형태가 어떠한지 확인해본다. <tr>로 데이터 한 줄이 표시되며 주문수, 품목수, 상품 구매금액은 <td> 태그로 표시됨을 확인할 수 있다. 그러나 class나 id가 포함되어 있지 않으므로 <td>의 순서를 유의하여 데이터를 수집한다.

코드 작성
cafe24 매출 데이터의 형태는 파악했으니 python을 사용하여 수집 자동화를 코드를 작성한다.
로그인 후 일별 매출 페이로 이동하는 코드이다.
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from time import time, sleep
import os
import datetime
import json
import re
# selenium 브라우저를 숨긴채로 작업할것인지 아닌지
# 디버그를 위해 브라우저를 숨기지 않고 작업한다.
options = webdriver.ChromeOptions()
hidden_browser = False
if hidden_browser:
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(executable_path='/Users/dooyeoung/Documents/projects/webdriver/chromedriver',
chrome_options=options,
desired_capabilities=capa)
# 특정 개체를 로딩 될때까지 대기하기 위해 필요하다
wait = WebDriverWait(driver, 20)
# 카페24 로그인
driver.get('https://eclogin.cafe24.com/Shop/')
# id 입력 input이 로딩될대까지 기다린후 id와 password 입력
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mall_id')))
driver.execute_script('''
document.getElementById('mall_id').value = '';
document.getElementById('userpasswd').value = '';
''')
driver.find_element_by_css_selector('#tabAdmin > div > fieldset > p.gButton > a').click()
# cafe24 상위 메뉴가 로딩될때까지 기다린후
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#gnb')))
# 일별 매출 조회 페이지로 이동
driver.get('https://상점명.cafe24.com/disp/admin/shop1/report/DailyList')

일별 매출 페이지에서 자세히 보기, 데이터 개수와 기간 설정 후 데이터를 수집하는 코드
# 자세히보기 체크박스 클릭
driver.find_element_by_id('sReportGabView').click()
sleep(1)
# 기간설정 input이 로드 될때까지 기다린후
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#pr_start_date')))
sleep(1)
# 매출 데이터를 수집할 기간을 지정
start_date = datetime.datetime(2020, 1, 1)
end_edate = datetime.datetime(2020,12, 15)
start_date_str = start_date.strftime('%Y-%m-%d')
end_edate_str = end_edate.strftime('%Y-%m-%d')
# 기간설정과
driver.execute_script('''
document.getElementById('pr_start_date').setAttribute('value', '{}');
document.getElementById('pr_end_date').setAttribute('value', '{}');
document.querySelector('select#rows option[value="100"]').setAttribute('value', 500);
'''.format(start_date_str, end_edate_str))
driver.find_element_by_css_selector('select#rows option[value="500"]').click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.mBoard.gScroll > table')))
sleep(1)
# 데이터 테이블 태그를 빠르게 파싱하기 위해 BeautifulSoup을 사용한다.
table_tag = driver.find_element_by_css_selector('.mBoard.gScroll > table')
soup = BeautifulSoup(table_tag.get_attribute('outerHTML'), 'lxml')
row_li = []
for tr in soup.select('tbody > tr'):
td_li = tr.select('td')
row = {
"date" : td_li[0].text,
"주문수" : td_li[1].text,
"품목수" : td_li[2].text,
"상품구매금액" : td_li[3].text,
"배송비" : td_li[4].text,
"할인" : td_li[5].text,
"쿠폰" : td_li[6].text,
"실제결제금액" : td_li[7].text,
"적립금" : td_li[8].text,
"예치금" : td_li[9].text,
"네이버포인트" : td_li[10].text,
"결제합계" : td_li[11].text,
}
row_li.append(row)
print( len(row_li))
# 수집된 데이터를 확인해본다. 잘 수집되었다.
rdf = pd.DataFrame(row_li)
driver.quit()

수집된 데이터 결과다. 정상적으로 원하는 데이터를 수집할 수 있는 코드가 완성되었다.
이후에는 금액 데이터에 포함된 콤마를 제거와 일자 데이터를 date type으로 변환하는 작업이 남았다.

'Python' 카테고리의 다른 글
Python - Django REST Framework 초기 설정 (0) | 2020.12.29 |
---|---|
Python - 구글애널리틱스 API (0) | 2020.12.24 |
python - 페이스북,인스타그램 광고데이터 수집 자동화 (3) | 2020.12.22 |