{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 실제 사이트 크롤링 - 신세계 인터넷 쇼핑몰"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: selenium in c:\\anaconda3\\lib\\site-packages (3.141.0)\n",
      "Requirement already satisfied: urllib3 in c:\\anaconda3\\lib\\site-packages (from selenium) (1.24.2)\n"
     ]
    }
   ],
   "source": [
    "# Selenium 설치.\n",
    "!pip install selenium"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import bs4\n",
    "import requests as rq\n",
    "import pandas as pd\n",
    "from selenium import webdriver\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir(r\"C:\\Users\\Gram\\Desktop\\myPyCode\\02  데이터 수집과 처리 - 실습\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 사이트에 접속하고 탐색해 본다:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 먼저 다음 사이트에 들어가서 살펴본다:  [신세계 건강식품](http://department.ssg.com/disp/category.ssg?dispCtgId=3500003739&page=1)\n",
    "2. 크롬에서 3점 메뉴 버튼을 누르고 **도구 더보기** ==> **개발자 도구**를 선택해서 개발자 도구를 연다.\n",
    "3. 개발자 도구 왼쪽 상단의 화살표 버튼을 눌러서 사이트 일부를 서택하고 해당 HTML코드를 볼 수 있다. \"[CTRL] + [SHIFT] + C\" 조합으로 대체할 수 있다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 웹드라이버로 크롬열기\n",
    "my_driver = webdriver.Chrome('chromedriver.exe') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 사이트에 접속.\n",
    "my_url = \"http://department.ssg.com/disp/category.ssg?dispCtgId=3500003739&page=\"\n",
    "my_driver.get(my_url + str(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "my_html = my_driver.page_source    #텍스트가 아니라 사이트 내용가져오는 페이지소스임(이부분이 전에꺼랑 다름)       \n",
    "my_soup = bs4.BeautifulSoup(my_html, 'html.parser')     # BeautifulSoup 객체 반환. 'html.parser' 사용."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "bs4.element.Tag"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_ul = my_soup.find('ul', class_='cunit_thmb_lst') # 단 하나의 ul 태그.\n",
    "type(my_ul)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['(특별적립,공지확인필)화애락진 70ml*30포 (30일분)', '(특별적립,공지확인필)황진단 4g*12환 (12일분)', '(특별적립,공지확인필)화애락후 70ml*30포 (30일분)', '(특별적립,공지확인필)굿베이스 홍삼담은 석류 (50ml*30포)', '(특별적립,공지확인필)천녹정 180g*2병 (보자기포장)', '(1월 20일 오후 3시 주문 건까지 설전배송)타히티골드 노니주스 원액 946ml x 2병 SET', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 실버 포맨 + 실버 포우먼 세트', '이너플로라 30캡슐*2EA 배송_유통기한 2020.09.11_[유한건강생활 뉴오리진] 이너플로라 60캡슐_2개월분_여성질유산균 프로바이오틱스_1월 22일 수요일 16시이전 주문건에 한해 명절전 배송', '[1/22일 16시 명절배송마감]트리플러스맨+우먼커플세트', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 포맨 + 포우먼 세트', '[1/22일 16시 명절배송마감]대상웰라이프 뉴케어 당플랜 아셉틱 (200ml x 60팩)', '(특별적립,공지확인필)굿베이스 홍삼담은 블루베리 (50ml*30포)', '(특별적립,공지확인필)아이패스 제이(J) 40ml*30포 (30일분)', '[1/22일 16시 명절배송마감][설선물세트]여성용 멀티비타민 미네랄 (60정) x 2병', '(특별적립,공지확인필)정관장 천녹정편(便) 10g*60포', '(특별적립,공지확인필)천녹톤 (70ml*30포)', '(특별적립,공지확인필)굿베이스 홍삼담은 흑마늘 (50ml*30포)', '[1/22일 16시 명절배송마감][비타민뱅크] 남극 크릴 오일 500 30캡슐 x5개', '(특별적립,공지확인필)천녹정 180g', '[1/22일 16시 명절배송마감]비타민D 1000IU (90정/3개월)', '[1/22일 16시 명절배송마감]달맞이꽃종자유Upgrade/90캡슐x2팩', '[1/22일 16시 명절배송마감][설선물세트]남성용 멀티비타민 미네랄 (60정) x 2병', '(특별적립,공지확인필)홍천웅칸 (30일분)', '(특별적립,공지확인필)천녹톤 (70ml*60포)', '[1/22일 16시 명절배송마감]프로폴리스 스프레이 20ml*3개 세트', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 여성 멀티비타민 실버 포우먼 (50정) x 2통', '[1/22일 16시 명절배송마감]프로폴리스 마누카허니 로젠지(캔디) - 레몬 500g', '(특별적립,공지확인필)알파프로젝트 혈행건강 500mg*60캡슐 (30일분)', '(특별적립,공지확인필)황진단 4g*3환 (3일분)', '[1/22일 16시 명절배송마감][둘코화이버] 구미 사과맛 (4개입 15포)x2팩', '[1/22일 16시 명절배송마감]UMF5+ 마누카꿀 250g+클로버꿀 250g 세트', '[1/22일 16시 명절배송마감]밀크씨슬+/60캡슐', '[1/22일 16시 명절배송마감]수퍼바이오틱스+철분/30캡슐x2팩', '[1/22일 16시 명절배송마감][비타민뱅크] 에버콜라겐코큐 CoQ 84정 x3개', '[1/22일 16시 명절배송마감]오메가3 700 DHA/EPA (60캡슐/2개월)', '[1/22일 16시 명절배송마감][2020 설 선물] 레이델 폴리코사놀5 (30정) X 4개 세트', '[1/22일 16시 명절배송마감][2020 설 선물] 레이델 폴리코사놀10 (30정) X 3개 세트 + 식물성오메가900 (6캡슐) 증정!', '셀큐브바이오 K크다 6개월 (18BOX)/ ★[기간한정] 가격인하+사은품 / 1/22배송마감-1/28순차출고', '[1/22일 16시 명절배송마감]참홍삼도라지 꿀세트', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 남성 멀티비타민 실버 포맨 (50정) x 2통', '(유통기한 2020.09.11)_[유한건강생활 뉴오리진] 이너플로라 30캡슐_1개월분 여성질유산균 프로바이오틱스_1월 22일 수요일 16시이전 주문건에 한해 명절전 배송', '[1월21일 11시까지 주문 시 명절 전 출고]듀오락 마이크로바이옴7 키즈 유산균 2통 (60일분)+추가 4일분', '[1/22일 16시 명절배송마감]키즈멀티비타민미네랄+키즈츄어블오메가3세트', '셀큐브바이오 K크다 3개월 (9BOX) / ★[기간한정] 가격인하+사은품 / 1/22배송마감-1/28순차출고', '[1/22일 16시 명절배송마감]트리플러스우먼/90캡슐', '(특별적립,공지확인필)알파프로젝트 간건강 600mg*180정 (30일분)', '[1/22일 16시 명절배송마감]루테인+오메가3/60캡슐', '[1/22일 16시 명절배송마감]UMF5+ 마누카꿀 500g+야생화꿀 500g 세트', '(특별적립,공지확인필)알파프로젝트 장건강 500mg*60캡슐 (30일분)', '[1/22일 16시 명절배송마감]트리플러스맨/90캡슐', '[1/22일 16시 명절배송마감]차가버섯진액(80mlX30포)[차가버섯진액100%,쇼핑백동봉]', '[1/22일 16시 명절배송마감]루테인 20 (60캡슐/2개월)', '[1/22일 16시 명절배송마감]비오틴 5000 (100캡슐/100일분)', '[1/22일 16시 명절배송마감]UMF18+ 마누카꿀 250g 세트(250g*2ea)', '[1/22일 16시 명절배송마감][비타민뱅크] 남극 크릴 오일 500 30캡슐 x3개', '[1/22일 16시 명절배송마감][비타민뱅크] 에버콜라겐코큐 CoQ 84정 x6개', '[1/22일 16시 명절배송마감]키즈멀티비타민미네랄구미젤리/60구미', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 남성 멀티비타민 포맨 (50정) x 2통', '(특별적립,공지확인필)굿베이스 홍삼담은 오미자 (50ml*30포)', '[1/22일 16시 명절배송마감]키즈멀티비타민미네랄/90정+키즈수퍼바이오틱스/30포세트', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 여성 멀티비타민 포우먼 (50정) x 4통', '[1/22일 16시 명절배송마감][비타민뱅크] 에버콜라겐코큐 CoQ 84정 x2개', '(특별적립,공지확인필)알파프로젝트 눈건강 500mg*90캡슐 (30일분)', '[1/22일 16시 명절배송마감][동국제약] 크릴오일 세트(벨기에산 크릴오일X2세트)', '[1/22일 16시 명절배송마감][설선물세트]비타민B 콤플렉스 100 (50캡슐) x 2병', '[1/22일 16시 명절배송마감][설선물세트]엽산 400 (100정) x 2병', '[1/22일 16시 명절배송마감]남성+여성멀티비타민미네랄커플세트', '[1/22일 16시 명절배송마감]GNC 비타민D3 2000(500mg90정)', '[1/22일 16시 명절배송마감]대상웰라이프 stay strong 뉴케어 액티브 200ml x 24팩', '[1/22일 16시 명절배송마감][허니코] 100%PureNZ UMF5+ 마누카 허니세트 (250g x 2개)', '[1/22일 16시 명절배송마감]마누카꿀 UMF10+ 2종기획(500g x 2)', '[1/22일 16시 명절배송마감][설선물세트]남성용 멀티비타민 (60정) + 여성용 멀티비타민 (60정)', '[1/22일 16시 명절배송마감]UMF5+ 마누카꿀 500g 2종 세트(500g x 2)', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 여성 멀티비타민 포우먼 (50정) x 2통', '[1월22일 오후4시 주문건까지 명절전배송][센트룸] 여성 멀티비타민 포우먼 (50정)', '[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 포맨 + 포우먼 세트 x 2통', '[1/22일 16시 명절배송마감]콤비타 UMF5+ 마누카꿀 500g', '[1/22일 16시 명절배송마감]여성을위한멀티비타민미네랄x2팩', '[1/22일 16시 명절배송마감]수퍼바이오틱스/60캡슐x2팩', '[1/22일 16시 명절배송마감]수퍼바이오틱스/60캡슐']\n"
     ]
    }
   ],
   "source": [
    "# 이름만 가져와 본다.\n",
    "my_names = my_ul.select('a em.tx_ko')\n",
    "my_names_list =[x.text.strip() for x in my_names]\n",
    "print(my_names_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['144,000', '216,000', '180,000', '42,400', '405,000', '98,000', '48,000', '76,500', '61,740', '48,000', '97,800', '47,200', '130,000', '59,760', '405,000', '234,000', '45,600', '99,000', '216,000', '24,480', '52,920', '59,760', '180,000', '432,000', '40,095', '48,000', '33,048', '22,500', '60,000', '25,200', '49,896', '34,200', '61,740', '124,200', '28,800', '106,920', '172,125', '395,000', '70,000', '48,000', '45,000', '96,000', '62,640', '215,000', '35,280', '35,100', '37,800', '88,776', '35,100', '35,280', '31,825', '49,320', '26,100', '226,800', '62,100', '232,200', '26,100', '48,000', '43,200', '54,720', '96,000', '82,800', '34,200', '69,000', '59,760', '27,900', '56,700', '30,960', '58,000', '54,000', '191,808', '65,880', '115,344', '48,000', '24,000', '96,000', '61,277', '56,700', '102,060', '58,320']\n"
     ]
    }
   ],
   "source": [
    "# 가격만 가져와 본다.\n",
    "my_prices = my_ul.select('div.opt_price em.ssg_price')\n",
    "my_prices_list =[x.text.strip() for x in my_prices]\n",
    "print(my_prices_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 가격 가져오기:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 반복적인 부분은 함수로 처리한다.\n",
    "# select 메서드 사용.\n",
    "def get_prices(my_soup):  #함수로 정의함 페이지가 1~20\n",
    "    my_names = my_ul.select('a em.tx_ko')\n",
    "    my_names_list =[x.text.strip() for x in my_names]\n",
    "    my_prices = my_ul.select('div.opt_price em.ssg_price')\n",
    "    my_prices_list =[x.text.strip() for x in my_prices]\n",
    "    my_prices_list_final= [float(''.join(a_price.split(','))) for a_price in my_prices_list]\n",
    "    return pd.DataFrame({'Product':my_names_list, 'Price':my_prices_list_final})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(1,20): #페이지가 1~20페이지\n",
    "    my_driver.get(my_url + str(i))\n",
    "    my_html = my_driver.page_source\n",
    "    soup = bs4.BeautifulSoup(my_html, 'html.parser')     # BeautifulSoup 객체 반환. 'html.parser' 사용.\n",
    "    if i == 1:\n",
    "        df = get_prices(soup)          \n",
    "    else:\n",
    "        df = pd.concat([df, get_prices(soup)],axis=0,ignore_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1520, 2)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Product</th>\n",
       "      <th>Price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>(특별적립,공지확인필)화애락진 70ml*30포 (30일분)</td>\n",
       "      <td>144000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>(특별적립,공지확인필)황진단 4g*12환 (12일분)</td>\n",
       "      <td>216000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>(특별적립,공지확인필)화애락후 70ml*30포 (30일분)</td>\n",
       "      <td>180000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>(특별적립,공지확인필)굿베이스 홍삼담은 석류 (50ml*30포)</td>\n",
       "      <td>42400.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>(특별적립,공지확인필)천녹정 180g*2병 (보자기포장)</td>\n",
       "      <td>405000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1515</td>\n",
       "      <td>[1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 포맨 + 포우...</td>\n",
       "      <td>96000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1516</td>\n",
       "      <td>[1/22일 16시 명절배송마감]콤비타 UMF5+ 마누카꿀 500g</td>\n",
       "      <td>61277.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1517</td>\n",
       "      <td>[1/22일 16시 명절배송마감]여성을위한멀티비타민미네랄x2팩</td>\n",
       "      <td>56700.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1518</td>\n",
       "      <td>[1/22일 16시 명절배송마감]수퍼바이오틱스/60캡슐x2팩</td>\n",
       "      <td>102060.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1519</td>\n",
       "      <td>[1/22일 16시 명절배송마감]수퍼바이오틱스/60캡슐</td>\n",
       "      <td>58320.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1520 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                Product     Price\n",
       "0                      (특별적립,공지확인필)화애락진 70ml*30포 (30일분)  144000.0\n",
       "1                         (특별적립,공지확인필)황진단 4g*12환 (12일분)  216000.0\n",
       "2                      (특별적립,공지확인필)화애락후 70ml*30포 (30일분)  180000.0\n",
       "3                   (특별적립,공지확인필)굿베이스 홍삼담은 석류 (50ml*30포)   42400.0\n",
       "4                       (특별적립,공지확인필)천녹정 180g*2병 (보자기포장)  405000.0\n",
       "...                                                 ...       ...\n",
       "1515  [1월22일 오후4시 주문건까지 명절전배송][백화점선물포장][센트룸] 포맨 + 포우...   96000.0\n",
       "1516              [1/22일 16시 명절배송마감]콤비타 UMF5+ 마누카꿀 500g   61277.0\n",
       "1517                 [1/22일 16시 명절배송마감]여성을위한멀티비타민미네랄x2팩   56700.0\n",
       "1518                  [1/22일 16시 명절배송마감]수퍼바이오틱스/60캡슐x2팩  102060.0\n",
       "1519                     [1/22일 16시 명절배송마감]수퍼바이오틱스/60캡슐   58320.0\n",
       "\n",
       "[1520 rows x 2 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df   #제품과 가격정보를 데이터프레임으로 가져옴(이걸 저장해 활용)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}