# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# -  xvfb : 윈도우 창 없이 가상으로  selemnium을 돌려줌  
# - flask : python 없이도 python을 돌릴 수 있게.  
# - Ngrok : Flask를 통해 만든 서버를 로컬에서 띄울 경우, 다른 사람이 내가 띄워논 서버에 접속 불가(방화벽). 방화벽을 뚫어줌. - 내 노트북을 인터넷에 띄울 수 있음.
# - slack outgoing webhook : slack에 메세지 작성 -> 우리 서버(flask로 만든 서버)로 전송 -> ... -> 채팅 봇!!!!!!  
# - bootstrap : 웹 에서 만들어준 화면의 framework. class 명만 입력해놓으면 디자인된 아이콘, 테마, 레이아웃 등을 자동 적용 가능.
# - Highchairts : javascript를 이용한 그래프 그리기. 데이터 분석 이후 -> flask web server에 탑재, slack으로 모델 동작, 결과반환
#
# 마지막 쯤에 추천알고리즘.
#

# ### Selenium Scraping

# ##### Gmarket 베스트 셀러 데이터 스크래핑 
# - 전체 200개중 상위 10개 출력
# - pandas 데이터를 분석할수 있는 python 라이브러리
#     - pip3 install pandas
#     - 데이터 프레임 생성 : df = pd.DataFrame(columns=["A","B"])
#
# - 데이터 추가 : df.loc[len(df)] = [{"A":1,"B":2}, {"A":3,"B":4}]

from selenium import webdriver
import pandas as pd


def get_gmarket_bestsellers(number=10):
    
    def to_int(price):
        return int(price.replace(",","").replace("원",""))
    
    driver =  webdriver.Chrome()
    driver.get('http://corners.gmarket.co.kr/Bestsellers')

    #gBestWrap > div > div:nth-child(6) > div:nth-child(3) > ul
    bestlist_selector = driver.find_elements_by_css_selector("#gBestWrap .best-list")[1]
    items = bestlist_selector.find_elements_by_css_selector("li")[:number]
    
    df = pd.DataFrame(columns=["상품명","원가","판매가","이미지","상품링크"])

    for item in items:

        idx = item.find_element_by_css_selector("p").text # 순번 /  .text를 알아둘 것. 'p' 태그 사이의 텍스트를 의미.
        img_link = item.find_element_by_css_selector("img").get_attribute("src") # 이미지 URL/ 'src' 값 return 해주는 것.  
        item_link = item.find_element_by_css_selector(".itemname").get_attribute("href") # 아이템 URL
        content = item.find_element_by_css_selector(".itemname").text # 아이템 텍스트
        o_price = item.find_element_by_css_selector(".item_price .o-price").text # 오리지날 가격
        s_price = item.find_element_by_css_selector(".item_price .s-price").text.split(" ")[0] # 판매 가격
        o_price = o_price if o_price else s_price # 원가 데이터가 없는경우 판매가를 대입
        
        data = {"상품명": content,
                "원가": to_int(o_price), 
                "판매가": to_int(s_price),
                "이미지": img_link, 
                "상품링크": item_link, }
        
        # Pandas 데이터 입력
        df.loc[len(df)] = data
        
    driver.close()
    return df


# %%time
result = get_gmarket_bestsellers(200)
result.tail()

# Pandas로 할인율 계산
result["할인율"] = 100 - (result["판매가"] / result["원가"]) * 100
result["할인율"] = result["할인율"].astype(dtype="float64")
result["할인율"] = round(result["할인율"], 2)
result = result.sort_values("할인율", ascending=False).reset_index().rename(columns={"index": "rank"})
result.head()

# utf-8로 인코딩한 csv 파일로 저장
result.to_csv("gmarket.csv", encoding="utf-8")

# ##### Naver 메일 데이터 스크래핑
# - 네이버 메일에 로그인한후 데이터 가져오기

from selenium import webdriver
import pickle
import time

# +
# 패스워드 저장하기
# pw = ""
# file = open("pw.pickle", "wb")
# pickle.dump(pw, file)
# -

main_url = "http://naver.com"
mail_url = "http://mail.naver.com"

# 브라우져 오픈 및 메인 사이트 이동
driver = webdriver.Chrome()
driver.get(main_url)

# 아이디 패스워드 입력
pw = pickle.load(open("pw.pickle", "rb")) # pw 변수에 본인의 패스워드 입력
driver.find_element_by_css_selector( "#id" ).send_keys( "1221pdj" )
driver.find_element_by_css_selector( "#pw" ).send_keys( pw )

# 로그인 버튼 클릭
driver.find_element_by_css_selector("span.btn_login input[type=submit]").click()

# 메일 페이지로 이동
driver.get(mail_url)

# 메일 갯수
total_mail = driver.find_element_by_css_selector("#headTotalNum").text
total_mail = int(total_mail)
total_mail

# 안읽은 메일 갯수
not_read_mail = driver.find_element_by_css_selector("#headUnreadNum").text
not_read_mail = int(not_read_mail)
not_read_mail

# 메일 제목, 보낸사람 이름 가져오기
mails = driver.find_elements_by_css_selector(".mailList.sender_context > li")
print("전체 메일수 : ", len(mails))
df = pd.DataFrame(columns=["제목","보낸사람","메일링크"])
for idx, mail in enumerate(mails):
    title = mail.find_element_by_css_selector(".mail_title").text
    name = mail.find_element_by_css_selector(".name").text
    link = mail.find_element_by_css_selector(".subject > a").get_attribute("href")
    df.loc[len(df)] = { "제목":title, "보낸사람":name, "메일링크":link }    
df.tail()

# marked 메일
mails = driver.find_elements_by_css_selector(".mailList.sender_context > li.mark")
print("전체 메일수 : ", len(mails))
df = pd.DataFrame(columns=["제목","보낸사람","메일링크"])
for idx, mail in enumerate(mails):
    title = mail.find_element_by_css_selector(".mail_title").text
    name = mail.find_element_by_css_selector(".name").text
    link = mail.find_element_by_css_selector(".subject > a").get_attribute("href")
    df.loc[len(df)] = { "제목":title, "보낸사람":name, "메일링크":link }    
df.tail()

# 읽은 메일
mails = driver.find_elements_by_css_selector(".mailList.sender_context > li:not(.notRead)")
print("total mails: ", len(mails))
df = pd.DataFrame(columns=["제목","보낸사람","메일링크"])
for idx, mail in enumerate(mails):
    title = mail.find_element_by_css_selector(".mail_title").text
    name = mail.find_element_by_css_selector(".name").text
    link = mail.find_element_by_css_selector(".subject > a").get_attribute("href")
    df.loc[len(df)] = { "제목":title, "보낸사람":name, "메일링크":link }    
df.tail()

# 로그아웃
logout_url = driver.find_element_by_css_selector(".gnb_btn_login").get_attribute("href")
driver.get(logout_url)

# 브라우져 닫기
driver.close()

StarcoderdataJupyterScriptsDedupFiltered