재입고 알림 봇 만들기(python + telegram bot)

Update 2020-02-02

개발환경 만들기 부터 다루는 상세한 포스트를 만들고 있습니다.

개발환경 만들기

발단

일시품절!!

사고 싶은 물건이 있는데 게다가 돈도 있는데! 재고가 없는 경우가 있습니다. 하루에도 몇 번씩 사이트에 들러 확인을 하곤 하죠. 그런 물건이 10개쯤 되면 매번 체크하기 번거롭겠죠. 사이트에서 재입고 알림 서비스를 해주면 좋겠지만 없는 경우가 많습니다.
간단하게 스크래핑을 하고 챗봇을 만들어 구매가 가능해지면 메시지를 주도록 만들어 보았습니다.

스크래핑

스크래핑은 사이트마다 달라질 수 밖에 없습니다. 이번에 노린 물건은 레고 아이디어 프렌즈 입니다. 레고 사이트를 분석해 봅시다.

브라우저에서 개발자 도구를 켜고 “일시품절” 이라고 써진걸 선택합니다. 다음으로 “구매가능”한 아이템을 선택하고 DOM 탐색기에서 선택을 해줍니다.

  • 품절인 경우
  • 구매 가능한 경우

대략 보니 p 태그에 data-test 속성이 product-overview-availability 인 것을 찾으면 될것 같습니다. p 엘리먼트에 “품절” 이라는 단어가 있으면 계속 품절인 것으로, 없으면 구매가능한 것으로 판단할 수 있을 것 같습니다. 다른 사이트에 대해서도 쉽게 추가할 수 있도록 체크하는 로직 부분은 분리해서 클래스에 전달하는 방식으로 만들어 봅시다. 뚜닥뚜닥 이런 코드를 만들어 봤습니다.

  • 1라인 :일단 파이썬 스크래핑의 기본인 requests 를 모듈을 가져옵니다.
  • StockCheck 클래스는 재고 확인의 전반적인 로직을 담당합니다. 체크할 URL과 품절 확인 메서드를 전달받아 실행한 뒤 이전에 확인된 품절 상태와 비교합니다.
  • 43라인 : main 부분은 테스트를 위한 코드 입니다. 파이썬이나 루비에서 많이 사용하는 방식이죠.
  • 44 라인의 legoshopCheck 함수는 레고 사이트의 품절을 체크합니다. BeautifulSoup 라이브러리로 HTML을 파싱하고 p 엘리먼트 중 특정 요소를 가지고 있는 것을 찾아냅니다. 그 안에 ‘품절’ 이라는 단어가 있으면 품절 상태로 판단합니다.

챗봇

메신저는 텔레그램으로 선택했습니다. 무료이고 API 지원이 잘 되는 편이라.. 다른 메신저는 어떤지 모르겠네요.

우선 텔레그램 봇을 만들어줘야 합니다. 검색하면 상당히 많이 나오는데 저는 이분 포스팅을 참조했습니다.

봇이 만들어졌으니 간단히 API 를 만들어 봅니다. python-telegram-bot 이라는 모듈을 사용했습니다.

보시다시피 엄청 간단합니다. 그냥 API 래핑한거죠. 사실 챗봇이 아닙니다. 그냥 메시지를 보내주는 역할만 하니까요.

구동하기

코드를 깔끔하게 만들기 위해 설정 부분(토큰, 스크래핑 주기)을 밖으로 빼줍니다.

마지막으로 메인 코드 부분입니다.

  • 15라인 : legoshopCheck는 위에 나왔던 코드와 동일합니다.
  • 44라인 : check 함수는 여러 개의 아이템을 한 번에 체크할 수 있도록 만들었습니다.
  • 49, 53~56라인 : 각 아이템별로 체크를 하고 입고 상태가 바뀐 것들에 대해 텔레그램으로 메시지를 보내줍니다.

이 프로그램은 계속 돌아가야 의미가 있으므로 집에 있던 시놀로지 Docker에 miniconda 이미지를 받아 프로그램을 설치하고 실행했습니다. (시놀로지 NAS에서 Docker 사용하기 참조)

내가 찾던 물건이 입고가 되면 이런 메시지가 옵니다.

Received message when restocked

발전시킬 부분

일단 기본적인 기능은 작동하지만 발전시킬 부분이 많아 보입니다. 재입고를 체크하는 부분은 크게 손볼게 없어 보입니다. 챗봇과 스케줄링 하는 부분을 발전시켜볼 수 있을 것 같습니다.

  • 서비스 시작과 종료, 상태 질의
  • 등록/삭제/임의 실행/리스팅
  • 스케줄 조정 – 체크 주기 바꾸기 등.
  • 여러 사람에게 메시지를 보낸다. 동일한 아이템을 구독하는 방식으로 바꾸기.
  • 여러 사람이 운영한다(배포)

재입고 알림 봇 만들기(python + telegram bot)”의 86개의 생각

  1. 서도진 답글

    우선 저는 개발에 개 자도 모르는 그냥 민간인 입니다.

    ebay에 제가 구입하고 싶은 물건이 있는데 재고 입고가 불규칙합니다.

    그러나 보니 자꾸 놓치게 되는데

    마침 위 블로그 내용을 보게 되었습니다.

    위 글을 보고 따라서 만들어 보려 했지만… 그냥 민간인이다 보니 어렵네요

    혹시 개발에 개 자도 모르는 일반인이 따라하기 쉽게 가이드를 만들어 주실 의향이 있으실까요?

    부탁드립니다.

  2. 답글

    안녕하세요ㅎㅎ
    다름이 아니라 프로그램에 ㅍ 도 모르는 사람이
    따라서 만들수 있을까요ㅠㅠ?
    가지고 싶은 물건이 있는데 맨날 품절이네요ㅠㅠ
    도와주시면 ㅠㅠ 깊폰 사례 드리겠습니다ㅠㅠ

    • samsee 글쓴이답글

      웹 사이트마다 조금씩 다른 부분이 있어서 품절을 체크하는 방법이 달라집니다. 어느 사이트인지 알려주시면 방법을 찾아볼 수 있을 것 같네요. 링크나 사이트 주소 알려주세요!

    • samsee 글쓴이답글

      물온 가능합니다! 오픈마켓으로 예제 하나 만들어 올려야겠네요.

  3. SS 답글

    혹시 “이 프로그램은 계속 돌아가야 의미가 있으므로 집에 있던 시놀로지 Docker에 miniconda 이미지를 받아 프로그램을 설치하고 실행했습니다.” 이 부분 포스팅 할 계획이 없으신가요?

    찾아서 miniconda3 설치는 했는데 그 뒤에 어떻게 해야 되는지를 모르겠네요.

    • samsee 글쓴이답글

      알림은 쉬운데 자동구매는 넘어야할 산이 많을 것 같네요.

      • SOMEONE 답글

        알림 및 자동 페이지 열람은 가능할까요?

        • samsee 글쓴이답글

          페이지 자동 열람은 어떤 걸까요? 폰에서 자동으로 구매 페이지가 열리는 그런 걸까요?

  4. ez 답글

    아 어렵다 어려워 마스크때문에 이런것도 해야하네 ㅠㅠ 하다 모른면 여쭤봐도 되나요

  5. ez 답글

    텔레그램 봇까지는 만들었는데 그 뒤로는 모르겠네요 OTL

  6. JungHun 답글

    안녕하세요.
    http://www.welkeepsmall.com/shop/shopdetail.html?branduid=1007206&xcode=023&mcode=001&scode=&type=X&sort=manual&cur_code=023&GfDT=bmp8W1w%3D
    이 사이트 기준으로 만들어 보기위해 시도 했어요.
    일단 기반 프로그램 설치하구 쥬피터에서 복사 붙여넣기 했는데..
    조금 막막해서 뎃글 남겨요.

    ValueError Traceback (most recent call last)
    in
    66 stock = lego_friends_perk.check()
    67 print(lego_friends_perk.name, “Available? “, stock)
    —> 68 (status_changed, last_status, current_status) = lego_friends_perk.statusChanged()
    69 print(lego_friends_perk.name, “Status Changed? “, status_changed, “, Last Status? “, last_status, “, Current Status? “, current_status)
    70

    ValueError: too many values to unpack (expected 3)

    일단 이렇게 떠서 막혔는데.. 조금 염치없지만 카카오톡 오픈톡으로 모르는것들을 도움 받을 수 있을까요?
    기초가 없어서 막히는게 .. 조금 많네용 ㅜㅜ
    https://open.kakao.com/o/sO2oSjYb

    • JungHun 답글

      AttributeError Traceback (most recent call last)
      in
      32 # main script
      33 if __name__ == “__main__”:
      —> 34 bot = TelegramBot(config[‘TELEGRAM’][‘TOKEN’])
      35 bot.sendMessage(config[‘TELEGRAM’][‘RECEIVER_ID’], “Monitoring started.”)
      36

      5 def __init__(self, token):
      6 self.token = token
      —-> 7 self.bot = telegram.Bot(token = self.token)
      8
      9 def sendMessage(self, chat_id, message):

      AttributeError: module ‘telegram’ has no attribute ‘Bot’

      메인 스크립트 구동중 요렇게 오류가 뜨네용 ㅠㅠ

  7. samsee 글쓴이답글

    telegram 모듈을 정상적으로 불러오지 못한 것 같습니다.
    우선 python-telegram-bot 설치가 되었고 import 가 되었는지 확인해보세요.
    python 실행하고
    import telegram
    했을 때 에러가 나면 안됩니다. 에러가 나면 파이썬에서 나가셔서( exit() )
    pip install python-telegram-bot –upgrade
    해보시기 바랍니다.
    안되면 알려주세요~

      • samsee 글쓴이답글

        일단 해당 몰에 맞도록 legoshopCheck 함수를 조금 수정해주셔야 합니다. 레고샵에서만 통하는 방식이라서요. 사이트 확인해봤는데 soup.find_all(“a”, class_=”soldout”) 로 바꿔주시면 될것 같습니다.

        telegram_bot.py 는 16라인에 jh_zz -> ‘jh_zz’로 바꿔서 python telegram_bot.py 를 실행해 보세요. 정상적인 토큰이면 텔레그램 앱으로 메시지가 들어와야 합니다.
        코로나 조심하세요 ㅠ

        • JungHun 답글

          필자님두 코로나 바이러스 조심하세요.
          Find_all 함수 사용시 아래와 같은 에러가 발생하네요 ㅜㅜ
          >>> ResultSet object has no attribute ‘text’. You’re probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

          그래서 Find로 바꾼다음 (stock 파일과 main파일 두개를 수정)
          실행을 돌리니 챗봇에 ture 값으로 변경되었다는 메세지가 한번 뜬 이후
          조용하네요.
          아래는 실행내역입니다.
          2020-02-22 17:37:22 [(True, False, True, )]
          2020-02-22 17:38:22 [(False, True, True, )]
          2020-02-22 17:39:22 [(False, True, True, )]

          이게 작동이 되고있는건지 잘 구분이 안되어서 질문을 남깁니다ㅜ ㅜ

          • samsee 글쓴이

            저도 해봤는데 계속 품절상태라 그런 것 같습니다.. 상품 입고되면 나올거예요 ㅠ 설명 부족했는데 잘 하셨네요.

          • JungHun

            감사합니다. 정상 작동 하는것 같아요,
            혹시 한가지 문제가 있는데 해결 가능할까요?
            (‘Connection aborted.’, TimeoutError(10060, ‘연결된 구성원으로부터 응답이 없어 연결하지 못했거나, 호스트로부터 응답이 없어 연결이 끊어졌습니다’, None, 10060, None))

            During handling of the above exception, another exception occurred:

            이런식으로 간혈적으로 TimeoutError가 발생합니다. 해결 가능할까요?

          • samsee 글쓴이

            어느 파일의 몇 라인에서 나오는 에러인가요?

  8. 질문 답글

    여러개 아이템을 동시에 재고파악 하는 방법이 있나요?
    있다면 어떤 부분을 수정하면 되나요?

    • samsee 글쓴이답글

      1. 사이트에 맞도록 legoshopCheck 함수를 만들고
      2. 37~39 라인처럼 체크하는 객체를 만든 뒤
      3. 49라인의 [lego_friends_perk] 배열에 넣어주시면 됩니다. 예를 들어 2가지 종류의 사이트에 있는 상품을 체크하는 경우

      def nnmarketCheck(res):
      soup = BeautifulSoup(res.text, 'html.parser')
      stock_div = soup.find("div", {"class": "prd-btns"}).find('div')

      // 생략
      def legoshopCheck(res):
      // 생략

      처럼 해당 사이트에 맞는 함수를 만들어 줍니다.
      그리고 2. 체크 객체를 만들어 줍니다.

      zelda_amiibo = StockCheck("Zelda Amiibo from nnmarket"
      , "http://www.nnmarket.co.kr/shop/shopdetail.html?branduid=232728&xcode=024&mcode=001&scode=&special=3&GfDT=bmp7W10%3D"
      , nnmarketCheck, "euc-kr")

      3. 마지막으로 체크 객체를 체크 대상 배열에 넣어줍니다.

      returns = check([zelda_amiibo, lego_friends_perk])

      기존 코드도 2가지 아이템을 체크하기 위해 만든거라 1번 부분의 체크하는 함수만 만들면 쉽게 추가할 수 있을 것입니다.

      • 질문 답글

        감사합니다.
        재 검색 시간 간격을 조절하기 위해서는
        58 라인의 * 60을 수정하면 되는가요? ( min -> sec 로 검색하기 위함 )

        • samsee 글쓴이답글

          넵 그 라인 수정하시면 됩니다. 다만 스크래핑하는 사이트에서 너무 많은 접근이 들어오면 공격으로 보고 IP를 차단할 수 있습니다. 주의하세요.

      • samsee 글쓴이답글

        span 요소가 중첩되어 들어가 있네요. 대략 이렇게 하면 될 것 같습니다.
        naver_store_suop.find(“span”, class_=”buy”).findAll(‘span’)[1][‘class’][0] == ‘blind’ # 품절
        구매하기 텍스트가 들어 있는 span 태그의 클래스가 blind 이면 품절인 것으로 판단하면 될 것 같습니다.
        옵션 별로 구매가 가능하고/불가능한 경우에는 좀 더 복잡해지겠죠..

  9. 이지훈 답글

    안녕하세요. 정말 감사하게도 이런 글을 올려주셨더라고요. 감사합니다.
    근데 실례지만 질문좀 해도 될까요??
    정말 아무것도 모르고 입문했다가 그래도 당일치기로 어느정도는 숙지하며 거진 완성? 했습니다.
    하지만 궁굼증과 문제가 생겼어요. 궁굼한것은 저 3가지의 목록을 다 실행시켜놔야 하는건가요?
    아니면 메인만 켜도 나머지 것들이 다 적용이 되는건가요?
    ‘구동하기’ 까지 합치면 4개더라고요. 근데 이건 미관상 빼셨다는게 무슨말인지 이해를 못하겠더라고요… 필요없어서 뺀건가요??
    그리고 문제로는 에러가 뜹니다… 다른건 다 수정해서 고쳤는데
    ‘메인 코드’에서 1. Unable to import ‘restock’ [3,1] 옆에 희미한 글자로 pylint(import-error) 라고 적혀있네요
    2. Unable to import ‘telegram_bot’ [4,1] 여기에도 희미한 글자로 pylint(import-error) 적혀있구요.
    도움받고 염치없지만 이렇게 질문 남깁니다… 답변해주시면 정말 감사하겠습니다ㅜㅜ

  10. 질문드립니다 답글

    안녕하세요. 정말 감사하게도 이런 글을 올려주셨더라고요. 감사합니다.
    근데 실례지만 질문좀 해도 될까요??
    정말 아무것도 모르고 입문했다가 그래도 당일치기로 어느정도는 숙지하며 거진 완성? 했습니다.
    하지만 궁굼증과 문제가 생겼어요. 궁굼한것은 저 3가지의 목록을 다 실행시켜놔야 하는건가요?
    아니면 메인만 켜도 나머지 것들이 다 적용이 되는건가요?
    ‘구동하기’ 까지 합치면 4개더라고요. 근데 이건 미관상 빼셨다는게 무슨말인지 이해를 못하겠더라고요… 필요없어서 뺀건가요??
    그리고 문제로는 에러가 뜹니다… 다른건 다 수정해서 고쳤는데
    ‘메인 코드’에서 1. Unable to import ‘restock’ [3,1] 옆에 희미한 글자로 pylint(import-error) 라고 적혀있네요
    2. Unable to import ‘telegram_bot’ [4,1] 여기에도 희미한 글자로 pylint(import-error) 적혀있구요.
    도움받고 염치없지만 이렇게 질문 남깁니다… 답변해주시면 정말 감사하겠습니다ㅜㅜ

    • samsee 글쓴이답글

      Unable to import .. 이런 에러는 파일이 없으루때 발생합니다. restock.py 라는 파일이 메인 프로그램 파일과 같은 디렉토리에 있어야 합니다.
      미관상 뺐다는 것은 텔레그램 키 부분이나 스크래핑 주기 등 프로그램 코드가 아닌 설정에 해당되는 것들을 프로그램에서 빼내고 다른 파일로 관리한다는 의미였습니다. 프로그램 코드를 바꾸지 않아도 실행주기 같은걸 바꿀 수 있도록요.

  11. 질문드립니다 답글

    와… 하루 시간동안 벼락치기로 공부해가면서 도전 해봤지만
    정말 어렵네요… 아무것도 모르는 민간인은 다가가기 힘든 프로그램이었네요.
    에러가 뜨면 정보 찾기도 힘들고 얼마 없는데 심지어 이해까지 안되네요 ㅠㅠ 속상합니다
    JUNGHUN 님처럼 같은 사이트에서 구매하려고 세팅을 엄청 해봤는데 안되네요.
    저분이 질문했던 내용들이 저한테도 다 해당이 되더라고요.
    그리고 늦은감이 있는 질문이지만, 결국 메인코드 하나만 구동하면 되는건가요??
    아니면 4개의 페이지인 코드들을 다 구동해야 하는건가요??

    • samsee 글쓴이답글

      메인 코드만 실행하시면 됩니다. 나머지들은 부품이예요.

  12. 질문드립니다. 답글

    설명 정말 정말 정~말 감사합니다 ㅠㅠㅠ 복받으실거예요.
    코로나 바이스러스 때문에 힘든 시기이지만 예방 잘하셔서 무탈하시길 바랍니다.

    • samsee 글쓴이답글

      잘 봐주셔서 감사합니다. 코로나 조심하세요!

  13. 질문이요 답글

    해보고 싶은데 아직 초짜민간인 수준이라 할 수가 없네요 ㅠㅠ 이 시국에 물건 구하기가 너무 힘들어서 ..ㅠㅠ 도와 주시면,,헤

    • samsee 글쓴이답글

      어느 부분에서 막히셨나요? 스크래핑 하려는 사이트 주소 알려주시면 봐드리겠습니다.

  14. vitamin 답글

    안녕하세요!
    마스크 구하기가 너무 어려워서
    알아보다가 결국 여기까지 오게됐습니다

    아직 파이썬이라는 프로그램으로 뭔가 해볼 수 있다
    라는것 까지만 알고 사실 나머지는
    무슨 말인지 잘 모르겠습니다 ^^;;

    혹시 상품정보가 아예 없다가
    입고되면 상품정보가 뜨는 경우에도
    공부하면 만들어볼 수 있을까요?

    아래 사이트에서 “KF”를 검색했을때 페이지인데
    물건이 나왔을때 페이지에 변화가 일어난걸
    감지한다던지 하는식으로
    https://www.costco.co.kr/search/?text=kf

    너무 기본지식이 없어 질문도 맞게 한건지 모르겠지만;;
    만약 가능하다면
    어떻게든 공부해서 도전해보겠습니다 ^^;

    • samsee 글쓴이답글

      가능합니다! 결과건수 같은걸 저장해두고 그게 바뀌었을 때 알려주는 방법이 있을 것 같네요.

      • vitamin 답글

        감사합니다!
        열심히 알아보고 공부해봐야겠네요
        건강 조심하시고
        행복한 하루 되세요!

  15. ganadaramabasa 답글

    입고 메세지를 보낼 때 입고된 제품의 url을 추가하려면 어디를 수정해야할까요…?

    • samsee 글쓴이답글

      main.py 프로그램 56라인에 sendMessage 부분을 “{} status has changed to {} : {}”.format(item[3].name, item[0], url) 로 하시면 될 것 같습니다.
      url 에 링크를 넣어주시면 되구요~

  16. 지나가던 문과생 답글

    대박… 지나가던 문과생입니다. 재입고 봇 원리가 궁금해져 검색하다 우연히 들어왔는데, 그 내용은 당연히 이해하지 못했지만 주인장님 친절함에 반하고 가요. 어떤 질문에도 세심히 알려 주시는 모습 너무 멋지십니다.??

    • samsee 글쓴이답글

      좋게 봐 주신 점 감사드립니다. 사실 별거 없습니다. 코드도 초보적인 수준이구요 🙂 인터넷이 어떻게 돌아가는지만 조금 이해하면 누구나 할 수 있는 거라고 생각해요.

  17. 원종범 답글

    안녕하세요. 네이버 마이쇼핑에서 리스트 들이 재고 보유 시 알림뜨게 코드 작성 중인데 잘 안되네요.ㅠㅠ
    DIV 클래스가 _21ANqK1Xo- 안의 자식 태그 중 span 텍스트에 품절 또는 구매불가가 없는 태그(혹은span class 가 _21-OP-fDyx 인 태그가 없을 시) 있을 시 알람을 뜨게 하고 싶거든요

  18. 원종범 답글

    n_shop = “https://shopping.naver.com/my/keep-products”
    driver.get(n_shop)
    req = urllib.request.Request(n_shop)
    res = urllib.request.urlopen(req)
    data = res.read();
    buynow = False

    soup = BeautifulSoup(data.decode(“utf-8”), ‘html.parser’)

    product_yes = soup.find_all(“div”, {“class”:”_21ANqK1Xo-“})

    for span in product_yes :
    if span.find_all(‘span’).text != ‘품절’ or ‘구매불가’ :
    buynow = True;
    break
    else :
    continue

    if buynow :
    print(str(loopIdx) + ” : Buy now”)
    break

    else:
    print(“Not yet !!!!!!”)

    • samsee 글쓴이답글

      우선 마이쇼핑 같은 경우에는 로그인이 되어 있어야 나올 것 같아요. 다른 브라우저에서 로그인을 해서 쿠키 값을 가져와 header에 넣어주거나 로그인 처리를 해야할 것 같습니다. 이런건 requests 라이브러리로는 좀 번잡해질 것 같습니다. scrapy나 selenium 같은 라이브러리를 쓰는게 나을 것 같습니다.

      • 원종범 답글

        답글 감사합니다. 로그인 함수는 생략하고 그 후에 값만 위에 표기했어요. for 와 if 조건식에서 잘 잡아내지를 못하는 것 같습니다 .

        2020.02.25.


        품절상품 텍스트

        품절이 없을 시 10개의 _21ANqK1Xo- 클래스 태그 안에 _21-OP-fDyx 스판태그가 사라지는데 조건문을 어떻게 만들지 모르겠네요 ㅠㅠ

        • samsee 글쓴이답글

          이렇게 해보세요. zzim_list ul 안의 item 목록을 돌면서 비활성화(disabled) 클래스 가진 경우 아이템 이름을 출력하는 코드입니다.

          item_list = soup.find(“ul”, class_=”zzim_list”)

          for item in item_list.findAll(“li”):
          if (‘disabled’ in item.get(“class”)):
          item_name = item.find(“div”, class_=”_21ANqK1Xo-“).find(“a”).find(“span”).nextSibling
          print(item_name)

  19. 김선생 답글

    비슷한 프로그램이 필요해서 검색하다가 들어오게 되었습니다.. 저같은 경우는 수업예약을 해야하는데 항상 놓치는데 예약 가능이 뜨면 알려주는 프로그램을 짜보고자 합니다.

    https://engoo.co.kr/tutors/35915

    이싸이트구요. 알려주신대로 DOM 탐색기에서 예약관련 코드는 찾은거같은데
    그뒤부터는 전공이 아니다보니 막막하네요. 도움 좀 요청해도 될까요?
    감사합니다.

  20. 김선생 답글

    댓글을 남겼는데 삭제된건지 안뜨네요.. ㅠ
    혹시 무슨 문제가 있던건가요??

    • samsee 글쓴이답글

      스팸 방지 기능 때문에 그렇습니다 ^^; 올려주신 사이트 확인해봤는데 가입 안하면 예약 버튼이 아예 안 보이는 것 같아서 도와드리기 어렵네요 ㅠ

      • 김선생 답글

        답변 감사합니다. 혹시 제가 아이디와비밀번호를 하나 드린다면 봐주실 수 있을까요? 저한테는 좀 중요한 문제다보니 이렇게 해결법을 찾고 있는중이라서요.. ㅠ 부담되신다면 어쩔 수 없고요 . ㅎㅎ

        • samsee 글쓴이답글

          아이디 비번 알려주시는 것 보다는 html을 저장해서 보내주시는게 좋을 것 같아요. Ctrl + S 로 저장하실 수 있습니다. sxxxxx@gmail.com으로 메일 보내주세요.

          • 김선생

            메일 보내드렸습니다 . 감사합니다 ^^

          • 김선생

            혹시 제 메일 받으셨나요? 아직 피드백이 없으시길래요 ^^

          • samsee 글쓴이

            어제 메일로 회신 드렸어요. 도움 되시길 바래요. 더 궁금하신 점 있으시면 메일 주세요.

  21. 조준갑 답글

    안녕하세요 개발자님

    저는 컴퓨터에 컴자도 모르는 일반인 입니다

    우연하게 찾아보다 실례를 무릎쓰고 댓글 남깁니다

    갖고싶은 레고가 있는데 잠깐 들어왔다 계속 품절이 나서 구매 하는데 어려웁을 겪고있습니다

    혹시 저도 위에 댓글 남기신 분 처럼 쉽게 따라할수 있는 가이드를 만들어 주실수 있을까요?

    염치 불구하고 댓글 남깁니다

    감사합니다

  22. Joel 답글

    이 프로그램은 계속 돌아가야 의미가 있으므로 집에 있던 시놀로지 Docker에 miniconda 이미지를 받아 프로그램을 설치하고 실행했습니다.
    라고 하셨는데,,
    일반 PC(노트북)에서 한 번 프로그램 실행해 놓으면 PC 가 off 되기 전 까지는 구동이 되는것이고, off 되면 종료된다라는 의미에서 말씀하신거죠..?
    시놀로지 NAS 가 없다면, 새로 업뎃하신 글의 댓글에 라즈베리파이에 해봐야겠다고 하신 분이 계시던데 이걸로도 가능한건가요?

    • samsee 글쓴이답글

      네 맞습니다. 보통 PC나 노트북은 사용할 때만 켜놓으니까요. 일반 PC에서도 프로그램 계속 돌려놓으면 정상적으로 사용할 수 있습니다. 다만 전력이나 안정성이 떨어지죠.. 라즈베리파이로도 충분히 가능합니다.

  23. Joel 답글

    댓글 감사합니다.
    오늘 하루 종일 매달린 끝에 일단 봇에서 Monitoring started. 메시지를 받는데 까지 성공했습니다.
    제가 잘 작성 했는지 검토 받고 싶은데 가능할까요? 이메일 주소를 어디서 확인할 수 있을까요..?

    아 그리고! 프로그램을 실행시키고 PC를 부팅하면 다시 프로그램을 실행시켜야할까요??

    • samsee 글쓴이답글

      프로그램이 자동으로 실행되도록 등록해 놓으신게 아니면 물론 PC를 켤 때 마다 실행하셔야 되겠습니다. 정상적으로 돌아가는지 확인하는 방법은 스크래핑 하려는 사이트에서 구매 가능한 상품의 URL로 스크래핑 해보고 품절인 URL로 스크래핑 해보시면 될 것 같습니다.

  24. 겟페 답글

    안녕하세요. 좋은 정보 정말로 감사합니다.

    테스트를 해 보았으나, 스크랩핑 방지 기술이 적용 된것으로 의심되는 사이트가 있습니다.
    다음 소스로 테스트 해 보았으나 브라우저에서 보는 것 과는 다른 결과가 돌아 오고 있습니다.

    이러한사이트들의 경우 어떠한 방법으로 브라우저와 같은 결과를 출력 시킬 수 있을지 알고 싶습니다.

    Code :
    “`
    import requests

    req = requests.Request(‘POST’,’https://books.rakuten.co.jp/rb/16462859′,headers={‘X-Custom’:’Test’},data=’a=1&b=2′)
    prepared = req.prepare()

    def pretty_print_POST(req):
    “””
    At this point it is completely built and ready
    to be fired; it is “prepared”.

    However pay attention at the formatting used in
    this function because it is programmed to be pretty
    printed and may differ from the actual request.
    “””
    print(‘{}\n{}\r\n{}\r\n\r\n{}’.format(
    ‘———–START———–‘,
    req.method + ‘ ‘ + req.url,
    ‘\r\n’.join(‘{}: {}’.format(k, v) for k, v in req.headers.items()),
    req.body,
    ))

    pretty_print_POST(prepared)
    “`

    결과 :
    “`
    ———–START———–
    POST https://books.rakuten.co.jp/rb/16462859
    X-Custom: Test
    Content-Length: 7

    a=1&b=2

    “`

    • samsee 글쓴이답글

      안녕하세요. 라쿠텐 이군요. 잠깐 살펴봤는데 꽤 복잡합니다. 요청이 이래저래 많이 발생하네요. 브라우저 개발자 모드로 보시면 css, js 등 요청 많이 발생하는걸 볼 수 있습니다. 일단 해당 주소는 302로 리다이렉트 되는걸로 보입니다. 쿠키를 설정하는 걸로 봐서는 python request로는 처리하기 어려워 보입니다. headless browser로 하는게 속편할 것 같습니다..

  25. FIVETAKU 답글

    좋은 정보 감사합니다.
    파이썬 독학해서 올려주신 내용 참고해서 입고 알리미를 만들어 보려합니다.
    https://www.freitag.ch/en/f305
    해당 사이트 제품의 모델 갯수와 색상을 좀 받아오려 하는데 좋은 방법 조언 해주실 수 있을 까요?
    목표는 블랙색상으로 많이 구성된 제품이 입고되었을 때 구매하려는 목적입니다.

    • samsee 글쓴이답글

      안녕하세요. 사이트 살펴봤는데 일단 이미지 부분이 스크립트에 숨어 있어서 requests/beautifulsoup 을 사용한 방법으로는 어려울 수 있을 것 같네요. script 부분도 beautifulsoup에서 읽어올 수 있는지 해본적이 없네요. 만약 된다면 갯수 가져오는 부분은 해결이 될 것 같습니다.
      특정 색상을 판단하는 부분은 image processing이 필요할 것 같은데..안 해본 부분이라 잠깐 검색만 해본 결과를 붙여놓습니다. https://stackoverflow.com/questions/27868250/python-find-out-how-much-of-an-image-is-black 이 글 참고해 보세요 🙂

  26. 반데라 답글

    안녕하세요~ 좋은 내용으로 올려주신 좋은 강의보면서
    요즘 파이썬에 관심을 가지고 공부를 하고 있습니다.
    올려주신 부분을 동일하게 해봤는데 아래와 같이 에러가 발생하네요.

    from restock import stockcheck
    moduleNotFoundError : No module named ‘restock’
    라고 error code가 나옵니다. 혹시 어떤 이유때문이지 여쭤봐도 될까요?

    • samsee 글쓴이답글

      안녕하세요. restock.py 파일을 못 찾아와서 발생하는 에러입니다. restock.py 라는 파일이 main.py 파일과 같은 디렉토리에 있어야 합니다. 혹시 잘 안되시면 restock.py 파일의 StockCheck 클래스 부분의 내용을 복사해 main.py에 넣고 from restock.. 이 부분을 삭제해도 됩니다.

    • samsee 글쓴이답글

      이제야 댓글 남겨주신거 읽었네요. 도움이 되셨다니 기쁩니다.

  27. an 답글

    안녕하세요 개발자님. 혹시 메일 확인 부탁드려도 될까요? 정말 감사합니다ㅜㅜ

  28. 곰곰 답글

    안녕하세요 akg , 하만카돈 사이트의 재고 유무 알람을 저도 만들어보고 싶어서 유심히들여다봤습니다(일반인인 저에게 정말 어려운.. 컴퓨터 언어네요 . .

    조금 도와주실수있을까요 ?

    • samsee 글쓴이답글

      답이 많이 늦었네요. 어떤 부분 도움 필요하실까요??

  29. yun 답글

    개발자님 안녕하세요.
    쇼핑몰의 상품이 입고되면 텔레그램 또는 카카오톡으로 알림이 오도록 하는게 필요한데요
    혹시 도움을 주실 수 있을까 해서요.
    메일 주소 또는 연락처 남겨주시면 자세한 내용을 전달드리겠습니다.
    제 이메일은 sub2346@naver.cm입니다.

  30. 가능하길 답글

    개발자님 안녕하세요.
    드라이브/웹하드에 파일 업데이트 시 알림이 올 수 있는 매크로를 찾다가 우연히 발견하게 되었습니다.

    혹시 드라이브/웹하드에 업데이트 되면 슬랙 또는 이메일 등으로 알림이 올 수 있는 매크로를 개발할 수 도 있을까요?

    – 문제점: A담당자가 파일을 드라이브에 올리면 B담당자가 확인해야 함. 파일 업로드 시, 웹하드/드라이브에서 알림이 가지 않아 수동으로 수시로 드라이브를 확인해야 함. A담당자 입장에서는 커뮤니케이션 코스트가 너무 많이 들어감.
    – 솔루션: 드라이브/웹하드에 파일이 업데이트 될 시, 특정 담당자들에게 메일/메신저(슬랙 등)으로 알림이 가게 할 수 있는지?

    갑자기 지나가다가 질문을 하게 되었네요.

    블로그 글과 댓글 보고 많이 배웠습니다.

    감사합니다.

    • samsee 글쓴이답글

      안녕하세요. 웹하드는 조금 어려울수도 있을 것 같네요. 웹하드 제공 업체에 따라서도 달라질 수 있을 것 같아서요. 일반적인 드라이브라면 가능할 것 같아요. 이런걸 보통 hook을 건다고 얘기하는데(뭐뭐 했을 때 ~ 한다) hook directory 이런걸로 검색해 보시면 참고할만한게 있을꺼예요. 원드라이브에 파일을 공유한다고 치면 onedrive directory hook bot 이런 식으로 찾아보세요. 상황을 좀 더 설명해 주시면 좀더 도와드릴 수 있을 것 같네요.

  31. 김은진 답글

    안녕하세요. 개발자님.. 저는 그냥 소소하게 아기옷이나 제옷을 쇼핑하고 싶은 아기엄마인데
    집에서 노트북으로도 이 프로그램을 설치(?)하는 게 가능할까요?
    개발자님께서 올려주신 내용보고 처음부터 차근차근 해보려고 하는데,
    처음 읽어보니 개인pc로는 조금 한계가 있어보여서요..
    개인 노트북으로도 가능하다고 하면, 올려주신 내용 진짜 열심히 공부해서 한 번 적용해보려고 합니다!

    • samsee 글쓴이답글

      답이 많이 늦었네요 ^^
      네 노트북에도 잘 됩니다!! 차근차근 해보고 검색만 잘 하신다면 누구나 할 수 있는 일이예요!
      화이팅 하세요~~

samsee에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다