반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 코딩유치원에 방문하신 손님께서 문의하셨던 '홈쇼핑모아'라는 사이트의 정보를 크롤링하는 프로젝트를 공유드리겠습니다.

 


1. 프로젝트 목표

 

1) 목표 사이트

https://hsmoa.com/

 

홈쇼핑모아 - 모든 홈쇼핑을 한눈에!

| 5시 14분 ~ 5시 19분 사계절 착용 가능, 클래식 스타일, 트윌 솔리드 셔츠 예작 22FW 최신상 컴포트 셔츠 3종 백화점 매장 동일 정상 제품 109,000원

hsmoa.com

 

2) 목표 데이터

오늘 이후 5일간 편성표의 날짜, 상품명, 방송시간, 가격 (사진도 요청하셨지만 난이도가 확 달라지므로 보류) 

 

 

2. 프로젝트 코드

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

# step2.오늘 이후의 5일만 선택하기 위한 오늘 날짜 파악
info_time = time.localtime()
today = str(info_time.tm_year) + '0' +str(info_time.tm_mon) + str(info_time.tm_mday) #중간에 0은 태그의 속성값과 포맷 일치를 위함
print(today)

# step3.크롬 웹드라이버 실행 & 홈쇼핑 사이트 접속
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")
url = "https://hsmoa.com/?date="+today+"&site=&cate=식품·건강" #식품건강 카테고리
driver.get(url)
time.sleep(1)

# step4.오늘 이후 날짜 정보 획득 함수 정의
def get_target_date(driver, today):
    
    list_temp = []

    # 날짜 선택
    btn_date = driver.find_elements_by_class_name("date")

    for i in btn_date:
        if int(i.get_attribute("data-date")) > int(today):
            list_temp.append(i.get_attribute("data-date"))

    return(list_temp)


# step5.총 5일동안의 쇼핑몰 편성표 크롤링

# 날짜, 상품명, 방송시간, 가격을 담을 리스트 선언
list_date = []
list_title = []
list_airtime = []
list_price = []

# 날짜 5일이 입력된 리스트
list_five_days = get_target_date(driver, today)
print(list_five_days)

for day in list_five_days:

    url = "https://hsmoa.com/?date="+day+"&site=&cate=식품·건강"
    driver.get(url)
    time.sleep(2)

    #날짜 & 제목
    title = driver.find_elements_by_class_name("font-15")
    for i in title:
        if i.text != "": #공백 제거
            list_date.append(day)
            list_title.append(i.text)
    
    #방송시간
    airtime = driver.find_elements_by_class_name("font-12.c-midgray")
    for i in airtime:
        if i.text != "": #공백 제거
            list_airtime.append(i.text)
    
    # 가격
    price = driver.find_elements_by_class_name("strong.font-17.c-black")
    for i in price:
        if i.text != "": #공백 제거
            list_price.append(i.text)

# step6.zip 모듈을 이용해서 list를 묶어주기        
list_sum = list(zip(list_date, list_title, list_airtime, list_price))

# step7.데이터프레임의 첫행에 들어갈 컬럼명
col = ['날짜','제품명','방송시간','가격']

# step8.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)

# step9.엑셀에 저장
df.to_excel('쇼핑몰 편성표_5일.xlsx')

driver.quit()

 

<코드 실행 결과>

 

3. 프로젝트 후기

 

1) 아무 생각없이 동적 웹크롤링 방식을 사용해서 코드 실행 시간이 2분 50초나 걸렸음. (어제는 1분 10초 정도)

    --> 다음엔 requests와 bs4 패키지를 쓰는 정적 웹크롤링 방식을 사용해서 시간을 줄여야겠음.

 

2) 사진을 함께 크롤링해서 엑셀에 차례대로 삽입하는 것은 아직 효율적인 방법을 모르겠음.

    --> 추후에 도전해봐야겠음. 


끝.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 코딩유치원 학생분께서 요청하신 프로젝트를 완료해서 공유드리려고 해요.

 

이 프로젝트의 목적은 제목과 같이 특정 스마트스토어의 최신제품을 실시간 크롤링하고 제품명, 가격정보, 제품링크를 텔레그램으로 전송하는 것입니다.

 

아래의 프로젝트와 비슷했지만, 링크와 제품명, 가격을 묶어주고 전송해줘야해서 dictionary 문법을 사용해보았습니다. 

 

2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

 

코드는 마음 껏 사용하셔도 되며, 잘 이해가 가지 않으시면 댓글 달아주세요~!


 

<전체 코드>

#step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import schedule
import time

#step2.새로운 네이버 뉴스 기사 링크를 받아오는 함수
def get_new_products(old_products={}):
    
    product_links = []
    product_prices = []
    product_names = []
    
    # step3.for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
    for page_num in range(3): #여기서는 3번째 페이지까지만 크롤링 하도록 설정
        # range를 이용하면 0부터 인덱스가 시작되므로 page_num에 1을 더해준 url을 이용
        url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
        
        # html 정보 받아와서 파싱
        response = requests.get(url)
        soup = bs(response.text , 'html.parser')

        # css selector로 페이지 내의 원하는 정보 가져오기
        # html_product_links = soup.select('a._3BkKgDHq3l.N=a:lst.product.linkAnchor') --> 잘 작동하지 않음
        html_name = soup.select('strong.QNNliuiAk3')
        html_price = soup.select('span.nIAdxeTzhx')
        html_product_links = soup.select('li.-qHwcFXhj0 > a')
        

        # 제품 이름 추출해서 리스트에 저장
        for i in html_name:
            product_names.append(i.get_text())

        # 제품 가격 추출해서 리스트에 저장
        for i in html_price:
            product_prices.append(i.get_text())

        # 제품 링크 추출해서 리스트에 저장
        for i in html_product_links:
            product_links.append('https://smartstore.naver.com' + i.attrs['href'])

    # 제품 링크를 key, 제품이름과 가격을 value로 dictonary 만듦
    dict_product = dict(zip(product_links, zip(product_names, product_prices)))

    # 기존의 링크와 신규 링크를 비교해서 새로운 링크만 저장
    new_products = {key:info  for key, info in dict_product.items() if key not in old_products}

    return new_products


#step3.새로운 네이버 뉴스 기사가 있을 때 텔레그램으로 전송하는 함수
def send_products():
    
    # 함수 내에서 처리된 리스트를 함수 외부에서 참조하기 위함
    global old_products
    
    # 위에서 정의했던 함수 실행
    new_products = get_new_products(old_products)
    
    # 새로운 메시지가 있으면 링크 전송
    if new_products:
        for key in new_products:
            bot.sendMessage(chat_id=chat_id,
                            text= new_products[key][0] + 
                            '\n\n' + '가격:' + new_products[key][1] + '원' + 
                            '\n\n' + key)
            
    else:
        # bot.sendMessage(chat_id=chat_id, text="새로운 제품이 없습니다.")  --> 잘 실행되는지 확인하고 싶으면 pass 대신 활성화
        pass
    
    # 기존 제품 정보를 계속 축적하기 위함
    old_products.update(new_products)


# 실제 프로그램 구동
if __name__ == '__main__':

    #토큰을 변수에 저장
    bot_token ='자신의 텔레그램 봇 토큰 번호'

    bot = telegram.Bot(token = bot_token)

    # 자신의 봇의 chat_id
    chat_id = '1516137537'
    
    #위에서 얻은 chat id로 bot이 메세지를 보냄.
    bot.sendMessage(chat_id = chat_id, text="컴퓨존의 새제품 실시간 크롤링이 시작 되었습니다") 
    
    # #step5.기존에 보냈던 링크를 담아둘 리스트 만들기
    old_products = {}
    
    # 가장 처음 실행 시, 한 번만 old_products에 제품 링크들 저장
    old_products = get_new_products(old_products)

    # 주기적 실행과 관련된 코드 (hours는 시, minutes는 분, seconds는 초)
    job = schedule.every(10).seconds.do(send_products)
    
    while True:
        
        schedule.run_pending()
        time.sleep(1)

 

<실행 결과>

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

[웹 크롤링 기초]

2021.03.22 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

 

[정적 웹크롤링]

2021.03.30 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹 크롤링] - [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 - [파이썬 패키지/웹 크롤링] - [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

 

[동적 웹크롤링]

2021.04.03 - [분류 전체보기] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 


오늘은 Selenium으로 원하는 네이버 뉴스 기사의 댓글 정보(아이디, 작성시간, 댓글 내용)를 크롤링하고 엑셀로 저장하는 것을 해보겠습니다.

 

참고로 이번 포스팅은 '반원의 코딩 랜드'라는 유튜브 채널의 웹크롤링 강의를 참고하였습니다.

 

친절하게 잘 설명해주셔서 많은 공부가 되었습니다. 총 4편까지 있고 그리 길지 않으니 관심있으신 분들은 보시는 것을 추천드립니다.

 

<강의 링크>

https://www.youtube.com/watch?v=lK__oNsOGOY&list=PL5L3Lhdx2zrNu2PuVUyb-4UdheDcUN3K7&index=5 

 

 

1. 전체 코드

 

이해하기 쉽도록 자세하게 주석을 달아두었으니 어렵지 않을거예요.

 

# step1. 관련 패키지 및 모듈 불러오기
from selenium import webdriver
import time
import pandas as pd


# step2. 네이버 뉴스 댓글정보 수집 함수
def get_naver_news_comments(url, wait_time=5, delay_time=0.1):
    
    # 크롬 드라이버로 해당 url에 접속
    driver = webdriver.Chrome('./chromedriver')
    
    # (크롬)드라이버가 요소를 찾는데에 최대 wait_time 초까지 기다림 (함수 사용 시 설정 가능하며 기본값은 5초)
    driver.implicitly_wait(wait_time)
    
    # 인자로 입력받은 url 주소를 가져와서 접속
    driver.get(url)

    # 더보기가 안뜰 때 까지 계속 클릭 (모든 댓글의 html을 얻기 위함)
    while True:
        
        # 예외처리 구문 - 더보기 광클하다가 없어서 에러 뜨면 while문을 나감(break)
        try:
            more = driver.find_element_by_css_selector('a.u_cbox_btn_more')
            more.click()
            time.sleep(delay_time)
            
        except:
            break

    # 본격적인 크롤링 타임
    
    # 1)작성자
    # selenium으로 작성자 포함된 태그 모두 수집
    nicknames = driver.find_elements_by_css_selector('span.u_cbox_nick')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_nicknames = [nick.text for nick in nicknames]

    # 2)댓글 시간
    # selenium으로 댓글 시간 포함된 태그 모두 수집
    datetimes = driver.find_elements_by_css_selector('span.u_cbox_date')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_datetimes = [datetime.text for datetime in datetimes]

    # 3)댓글 내용
    # selenium으로 댓글내용 포함된 태그 모두 수집
    contents = driver.find_elements_by_css_selector('span.u_cbox_contents')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_contents = [content.text for content in contents]


    # 4)작성자, 댓글 시간, 내용을 셋트로 취합
    list_sum = list(zip(list_nicknames,list_datetimes,list_contents))

    # 드라이버 종료
    driver.quit()
    
    # 함수를 종료하며 list_sum을 결과물로 제출
    return list_sum

# step3. 실제 함수 실행 및 엑셀로 저장
if __name__ == '__main__': # 설명하자면 매우 길어져서 그냥 이렇게 사용하는 것을 권장
    
    # 원하는 기사 url 입력
    url = '댓글 크롤링 원하는 기사의 url (주의! 댓글보기를 클릭한 상태의 url이어야 함'
    
    # 함수 실행
    comments = get_naver_news_comments(url)
    
    # 엑셀의 첫줄에 들어갈 컬럼명
    col = ['작성자','시간','내용']
    
    # pandas 데이터 프레임 형태로 가공
    df = pd.DataFrame(comments, columns=col)
    
    # 데이터 프레임을 엑셀로 저장 (파일명은 'news.xlsx', 시트명은 '뉴스 기사 제목')
    df.to_excel('news.xlsx', sheet_name='뉴스 기사 제목')

 

 

2. 주의할 점

 

1) 그냥 기사의 url이 아니라 아래의 빨간 사각형으로 표시한 '댓글보기 버튼'을 클릭한 후의 url이어야 합니다.

 

2) 너무 댓글이 많은 경우엔 시간이 엄청 많이 걸릴 수 있음에 주의

 

참고한 강의에서는 8000개의 댓글을 40분동안 크롤링 했으며, 이 경우에는 beautifulsoup 패키지를 활용해야 합니다.

제가 예전에 작성했던 글에 selenium만으로도 충분하다고 했었는데 그렇지 않다라는 것을 알았습니다.

(제가 작은 양의 크롤링만 해왔던 것 같아요ㅎㅎ..)

 

결론적으로 최종코드에서 '# 본격적인 크롤링 타임' 아래 부분을 아래의 코드로 바꾸어주는 것이 더욱 효율적인 코드라고 할 수 있겠습니다.

# 본격적인 크롤링 타임

html = driver.page_source
# print(html)

# 모듈 참조
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml') #html.parser

# 1)작성자
nicknames = soup.select('span.u_cbox_nick')
list_nicknames = [nickname.text for nickname in nicknames]

# 2)댓글 시간
datetimes = soup.select('span.u_cbox_date')
list_datetimes = [datetime.text for datetime in datetimes]

# 3)댓글 내용
contents = soup.select('span.u_cbox_contents')
list_contents = [content.text for content in contents]

 

 

3.  새롭게 공부한  점

 

driver.implicitly_wait( )와 time.sleep( )의 차이점

 

예를 들어 implicitly_wait(5)은 크롬드라이버가 driver의 요소를 찾는데에 최대한 기다려줄 수 있는 시간을 의미합니다.

여기서 중요한 점은 기다리다가 실행이 되면 지체없이 다음 단계로 넘어가는 것과, 딱 한 번만 선언해주면 된다는 것입니다.

 

만약 5초가 지났는데도 창이 뜨지 않으면 에러를 출력합니다.

 

그리고 time.sleep( )은 아마 많이보셨을텐데 말그대로 sleep(0.1)은 0.1초동안 프로그램이 잠을 잔다는 의미입니다.

 

위의 코드에서 more.click( ) 명령 후에 time.sleep( )을 적당히 주지 않으면 드라이버가 '더보기'가 없다고 판단하고 while문을 예상보다 일찍 빠져나가버리기도 한답니다.

 

<참고 자료>

 

https://stackoverflow.com/questions/53588966/python-selenium-difference-between-driver-implicitly-wait-and-time-sleep

 

Python & Selenium: Difference between driver.implicitly_wait() and time.sleep()

Yes, I know both are used to wait for some specified time. Selenium: driver.implicitly_wait(10) Python: import time time.sleep(10) Is there any difference between these two?

stackoverflow.com

 


 

 

반응형
반응형

안녕하세요, 이제 코딩유치원인지 코인유치원인지 헷갈리는 블로그를 운영하고 있는 손생입니다.

 

최근 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황을 이용해서 코인 투자를 해보면 어떨까라는 생각을 가지고, 일론 머스크 트위터를 실시간 크롤링 하여 텔래그램 서비스를 활용하고 있습니다.

 

<관련 글>

2021.05.15 - [파이썬 프로젝트] - [파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 비트코인 매매 수익률 검증 (feat. Tesla has Diamond Hands)

 

오늘도 역시 이 시대의 핫가이 일론 머스크가 오후 7시 41분에 트위터를 올렸습니다.

 

미국 시간으로는 새벽 6시 41분이니 참 부지런히도 전세계에 요상한 영향력을 끼치고 있군요.

 

트윗의 내용은  "사진에 보이는 도지코인이 얼마일 것 같냐?" 라는 단순한 언급이었습니다.

사진을 보면 1달러 지폐에 도지를 합성해놓은 것을 보니, 1달러 수준의 가격을 암시하는 듯 합니다.

 

과연 이 트윗 메시지 하나에 어떤 일이 벌어졌을까요?

 

 

놀랍게도 도지코인 가격은 단 3분만에 14% 상승을 보여주었습니다. 별다른 내용업는 Doge가 들어간 메시지 하나에 말이죠.

 

트윗이 올라온 한국시간 기준 오후 7시 41분의 460원에서 불과 3분만에 525원을 찍었습니다.

어제 밤에 있었던 비트코인 상승보다 짧은 시간 안에 엄청난 상승을 보여줬네요.

 

 

이쯤 되면 일론 머스크가 이 상황을 즐기고 있는 것이 아닌가 싶습니다.

 

과연 도지코인의 끝은 무엇일지 궁금하지 않으신가요?

 

이 글을 보시는 여러분들께서는 부디 소중한 돈 잃지 마시기 바랍니다.

반응형
반응형

안녕하세요, 코딩유치원을 운영하고 있는 손생입니다.

 

 오늘은 지난 시간 소개드렸던 일론 머스크 트위터를 실시간 크롤링 하여 텔래그램으로 전송해주는 서비스를 통해서 코인 투자를 했다면, 어떤 수익률을 얻을 수 있었을지 데이터를 가지고 검증해보려 합니다.

 

 참고로 해당 아이디어는 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황을 이용해서 코인 투자를 해보면 어떨까라는 생각에서 시작하였습니다.

 

2021.05.15 - [파이썬 프로젝트] - [파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

 

[파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 오늘은 최근 코인 열풍의 가장 중심에 있는 테슬라의 CEO인 일론 머스크의 트위터를 실시간 크롤링해보았습니다. 이 프

coding-kindergarten.tistory.com

 

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 도지코인 매매 수익률 검증 (feat. How much is that Doge in the window?)

 

일론 머스크 트위터 실시간 크롤링을 통한 도지코인 매매 수익률 검증 (feat. How much is that Doge in th

안녕하세요, 이제 코딩유치원인지 코인유치원인지 헷갈리는 블로그를 운영하고 있는 손생입니다. 최근 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황

coding-kindergarten.tistory.com

 

 

<결론>

 

결론부터 말씀드리면, 텔레그램을 보시고 즉시 매수하고 다음날 아침에 매도 하셨다면 약 10%의 수익률을 볼 수 있었습니다.

 

<근거>

 

우리나라 시간으로 2020년 5월 19일 약 11시 42분경, Elon Musk 트위터에 아래의 글이 올라왔었습니다.

 

 

 저는 텔래그램 알림을 받고 알았는데 "Tesla has" 라고 왔길래 아마도 텍스트만 크롤링 하기에 뒤에 이모티콘이 잘렸나보다 라고 생각하고 컴퓨터로 확인하느라 조금 늦었습니다.

 

 저 그림이 뜻하는 것을 잘 몰라서 구글에 검색해 보았더니 'diamond hands 뜻'이라고 검색해보았더니 아래와 같이 검색되었습니다.

 

 미국 개미들의 아지트는 '월스트리트베츠(Wall street bets·WSB)'라고 불리는 온라인 주식 토론방이다. 특정 종목에 ‘좌표’를 찍고 집중 매수를 권유하는 글, 주식이 떨어질 때 팔지 말라고 당부하는 글이 모두 여기에 올라온다. 주식을 팔지 않고 버틴다는 의미의 ‘다이아몬드핸즈(diamond hands)’나 주가를 달까지 끌어올린다는 의미의 ‘투더문(to the moon)’ 등 수많은 유행어가 이곳에서 나왔다. 
[출처: 중앙일보] 헤지펀드 박살낸 美 '불개미'…그들 읽는 키워드 ‘SURF’의 뜻

 

해당 트윗의 뜻을 테슬라가 비트코인을 팔지 않고 '존버'하고 있다라고 해석했고 업비트를 켜서 시세 차트를 확인해보았습니다.

 

 이미 제가 확인 했을 때는 1BTC에 4800만원을 왔다갔다 하고있었지만 해당 트윗이 올라왔을 때는 4600만원이 었던 걸 확인할 수 있습니다. 그리고 다음날 5시 40분 기준 5160만원인 것을 확인했습니다.

 

즉, 트위터를 보고 즉시 매수를 했다면 하락장에서도 10%정도의 수익을 올릴 수 있었다는 결론을 내릴 수 있습니다.

 

 

 솔직히 유명인의 말 한 마디 한 마디에 출렁이는 자산과 그걸 유발하는 대중들의 무분별한 투자에 대해서 회의감이 들기도 합니다만, 역으로 이 상항을 잘 이용한다면 수익을 올릴 수 있지 않나 싶습니다. 단, 장기적으로 보았을 때는 유효하지 않을 수 있기에 투자에 유의 바랍니다.

 

모두들 성투하세요!

 

 

반응형
반응형

 

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

지난 프로젝트를 통해서 아래와 같은 프로그램들을 만들어보았습니다.

 

2021.04.05 - [파이썬 프로젝트] - [파이썬 프로젝트] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

2021.05.15 - [파이썬 프로젝트] - [파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

 

하지만 해당 프로그램들은 컴퓨터가 계속 켜져 있어서 파이썬 코드가 계속 실행되어야 하는 문제가 존재합니다.

이런 문제를 해결하기 위해서 나만의 '서버'가 필요합니다. 여기서 서버란 '24시간 돌아가는 컴퓨터'라고 이해하시면 됩니다.

 

나만의 서버를 만드는 방법은 여러가지가 있겠지만, 제가 아는 방법은 아래의 2가지입니다.

 

1) 라즈베리 파이와 같은 미니 pc를 와이파이에 연결시켜, 코드를 실행

2) 아마존 AWS, 네이버 클라우드 플랫폼, 구글 클라우드 플랫폼 같은 서비스를 이용해, 코드를 실행

 

1번 방법은 추후에 공부해 볼 계획이며, 이번 시간에는 네이버 클라우드 플랫폼을 이용해 나만의 서버를 만들어보겠습니다.

 

 

네이버 클라우드 플랫폼

 

네이버 클라우드 플랫폼을 선택한 특별한 이유 없습니다. 그냥 네이버가 친근하고 한국어가 많을 것 같은 느낌?

차근차근 따라하시면서 함께 나만의 서버를 만들어 봅시다!

 

1. 네이버 클라우드 접속

 

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

2. 회원 가입  및  결제수단 입력

 

네이버 아이디로 하는게 아니라서 웬만하면 가입 하셔야 합니다. 쉬우니깐 추가적인 설명은 생략하겠습니다.

 

서비스를 이용하려면 결제를 하지 않으시더라도 결제 수단을 등록하셔야합니다.

마이페이지 - 결제수단 관리로 들어가셔서 결제에 사용할 카드 정보 입력 해주세요.

 

3. 서버 이용 신청하기

 

서비스 - Server로 들어가셔서  이용 신청하기 버튼(하늘색 버튼)을 클릭해줍니다.

 

 

참고로 저희가 사용할 Micro Server는 1년간 무료로 사용하실 수 있습니다.

단, 1년 뒤에는 자동결제 된다고 하니 주의해주세요. (월 13,000원 정도)

 

새로운 창이 생성되면 '서버 생성' 버튼 클릭을 클릭해줍니다.

 

아래와 같이 설정해주시면 됩니다. 본인이 사용하고 계신 OS에 상관 없이 Ubuntu를 선택해주셔야 Micro Server를 만드실 수 있어요.

 

위에서 다음 버튼을 누르면 아래와 같이 이용 요금 안내창이 뜨는데 읽어보시고 확인 눌러주세요.

 

다음으로는 서버를 설정해줄 차례입니다. 옵션들은 거의 다 원래 설정되어 있는대로 두시고, 서버 이름만 마음대로 지어줍니다.

 

다음 버튼 누르시면 인증키 설정 단계로 넘어갑니다. 새로운 인증키 생성에서 인증키 이름을 마음대로 설정해주세요. 

 

이름 정하셨으면 , 인증키 생성 및 저장 버튼을 누르시면 아래와 같이 pem 파일이 다운로드 됩니다.

이 안에는 인증키의 암호 정보가 들어있는데, 나중에 사용되니깐 잘 찾을 수 있는 곳에 보관해주세요.

 

다음을 누르시면 네트워크 접근 설정 단계로 넘어가는데 그냥 바로 다음 누르시고 넘어가시면 됩니다.

 

마지막에 최종 확인 단계에서 아래에 위치한 서버 생성 버튼을 눌러주시면 서버가 만들어집니다.

 

아래 창이 뜨는데 그냥 확인 눌러주시면 되겠습니다.

 


 

다음 시간에는 오늘 만든 서버에 파이썬 코드를 올리는 것을 공부해 보겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 


오늘은 제가 개인적으로 쓸 일이 있어서 진행한 웹크롤링 프로젝트를 공유하겠습니다.

 

참고로 이 코드를 이용하려면 잡플래닛 계정이 있고, 회사 리뷰를 최소 1개 작성해야 합니다. 리뷰를 작성해야지, 모든 리뷰가 조회 가능하거든요.

 

필요하신 분들은 마음껏 사용하세요.

 

[2022.09.26 수정]  저장되는 엑셀 파일명에 회사명 추가 / 크롤링 되는 정보에 회사명 컬럼 추가

 

# step1.프로젝트에 필요한 패키지 불러오기
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

# step2.로그인 정보 및 검색할 회사 미리 정의, 해당 회사의 리뷰 끝 페이지도 정의
usr = "잡플래닛 아이디(메일주소)"
pwd = "잡플래닛 비밀번호"
query = "검색할 회사"
page = 검색할 회사의 마지막 페이지   #정수


# step3.크롬드라이버 실행 및 잡플래닛 로그인

driver = webdriver.Chrome("C:/Users/username/Desktop/chromedriver.exe")

driver.get("https://www.jobplanet.co.kr/users/sign_in?_nav=gb")
time.sleep(5)

login_id = driver.find_element_by_css_selector("input#user_email")
login_id.send_keys(usr)

login_pwd = driver.find_element_by_css_selector("input#user_password")
login_pwd.send_keys(pwd)

login_id.send_keys(Keys.RETURN)
time.sleep(5)


# step4.원하는 회사의 리뷰 페이지까지 이동
search_query = driver.find_element_by_css_selector("input#search_bar_search_query")
search_query.send_keys(query)
search_query.send_keys(Keys.RETURN)
time.sleep(3)

driver.find_element_by_css_selector("a.tit").click()
time.sleep(15)

driver.find_element_by_css_selector("button.btn_close_x_ty1 ").click()
time.sleep(3)



# step6.크롤링한 정보를 담을 리스트명 정의
list_company = []
list_div = []
list_cur = []
list_date =[]
list_stars = []
list_summery = []
list_merit = []
list_disadvantages = []
list_managers =[]


# step7.원하는 회사의 직무/근속여부/일시/요약/평점/장점/단점/경영진에게 바라는 점 크롤링 (for문으로 반복)
for i in range(page): 

    #직무, 근속여부, 일시
    user_info = driver.find_elements_by_css_selector("span.txt1")

    count = int(len(user_info)/4)
    print(count)
    
    for j in range(count):
    list_company.append(query)

    list_user_info = []

    for j in user_info:
        list_user_info.append(j.text)

    for j in range(count):            #한 페이지에 정보 5set씩 나옴. 마지막 페이지는 5개 미만일 수 있으므로 count 변수를 반복횟수로 넣어줌.
        a = list_user_info[4*j]
        list_div.append(a)
        
        b = list_user_info[4*j+1]
        list_cur.append(b)

        c = list_user_info[4*j+3]
        list_date.append(c)

    #별점
    stars = driver.find_elements_by_css_selector("div.star_score")
    for j in stars:
        a = j.get_attribute('style')
        if a[7:9] == '20':
            list_stars.append("1점")
        elif a[7:9] == '40':
            list_stars.append("2점")
        elif a[7:9] == '60':
            list_stars.append("3점")
        elif a[7:9] == '80':
            list_stars.append("4점")
        else:
            list_stars.append("5점")
        
    #요약 정보
    summery = driver.find_elements_by_css_selector("h2.us_label")

    for j in summery:
        list_summery.append(j.text)
    
    #장점, 단점, 경영진에게 바라는 점
    list_review = []

    review = driver.find_elements_by_css_selector("dd.df1")

    for j in review:
        list_review.append(j.text)

    for j in range(count):            #한 페이지에 정보 5set씩 나옴. 마지막 페이지는 5개 미만일 수 있으므로 count 변수를 반복횟수로 넣어줌.
        a = list_review[3*j]
        list_merit.append(a)
        
        b = list_review[3*j+1]
        list_disadvantages.append(b)

        c = list_review[3*j+2]
        list_managers.append(c)

    # 다음 페이지 클릭 후 for문 진행, 끝 페이지에서 다음 페이지 클릭 안되는 것 대비해서 예외처리 구문 추가
    try:
        driver.find_element_by_css_selector("a.btn_pgnext").click()
        time.sleep(15)
    except:
        pass


# step8.pandas 라이브러리로 표 만들기
total_data = pd.DataFrame()
total_data['회사'] = pd.Series(list_company)
total_data['날짜'] = pd.Series(list_date)
total_data['직무'] = pd.Series(list_div)
total_data['재직여부'] = pd.Series(list_cur)
total_data['별점'] = pd.Series(list_stars)
total_data['요약'] = pd.Series(list_summery)
total_data['장점'] = pd.Series(list_merit)
total_data['단점'] = pd.Series(list_disadvantages)
total_data['경영진에게 바라는 점'] = pd.Series(list_managers)

# step9.엑셀 형태로 저장하기
total_data.to_excel("잡플래닛 리뷰_" + query + ".xlsx" ,index=True)

# step10.크롬 드라이버 종료
driver.close()

 


<관련 추가 글>

 

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 

[파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 오늘은 지난번 공유드렸던 아래의 프로젝트를 Pyqt5 패키지를 이용해 GUI로 사용할 수 있도록 만들어보았습니다. 개인적

coding-kindergarten.tistory.com

 

반응형

+ Recent posts