클라우드 엔지니어/Docker

Docker 가지고 놀기 1탄 - 웹 크롤링(docker,python,selenium 등등)

해아's 2023. 1. 20. 13:20

일단 1탄이다. 시작은 반이니까..

흐름은 이렇다. 도커로 만든 크롤러가 특정사이트에서 특정 상품이 있는지 체크하고 있으면 텔레그램으로 알려주는 기능이다.

일단 도커파일 만들기

FROM python:3.9
WORKDIR /usr/src
RUN apt-get -y update
RUN apt install -y wget unzip
RUN wget <https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb>
RUN apt -y install ./google-chrome-stable_current_amd64.deb
RUN wget -O /tmp/chromedriver.zip <http://chromedriver.storage.googleapis.com/`> curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN mkdir chrome
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/src/chrome
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY app ./app
CMD [ "/bin/bash", "app/loop.sh" ]

loop.sh를 3600초마다 실행하게 하였다. 크롬탭으로 1분마다 도커실행해도되는데 그냥 도커 올려놓고 계속 반복돌려놨다.

loop.sh

#!/bin/bash
while :
do
  python ./app/main.py
  sleep 3600
done

requirements.txt

anyio==3.6.2
async-generator==1.10
attrs==22.2.0
certifi==2022.12.7
chromedriver-autoinstaller==0.4.0
exceptiongroup==1.1.0
h11==0.14.0
httpcore==0.16.3
httpx==0.23.3
idna==3.4
outcome==1.2.0
pyperclip==1.8.2
PySocks==1.7.1
python-telegram-bot==20.0
rfc3986==1.5.0
selenium==4.7.2
sniffio==1.3.0
sortedcontainers==2.4.0
telegram==0.0.1
trio==0.22.0
trio-websocket==0.9.2
urllib3==1.26.14
wsproto==1.2.0

이것저것 연동하다보니 필요없는것도 있을것이다. 본인이 직접설치후 다시 만드는걸 추천

docker build --tag yoskr/chrome:0.2 ./
docker run -d --name hyundy --volume /volume1/SSD_DATA/chrome/app/:/usr/src/app/ yoskr/chrome:0.2

도커 이미지 빌드후 나는 소스폴더를 마운트하여 수정할수있게 작업햇다.

main.py

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
import subprocess, pyperclip, time, datetime, os, logging, telegram, asyncio
#################################함수들 선언시작

#telegram 사용처리
def tele_sand_msg(msg): 
    telegram_option = 1
    if os.path.isfile('/usr/src/app/telegram.txt') == True: telegram_option = 1
    if telegram_option == 1:
        import telegram
        with open('/usr/src/app/telegram.txt', mode='r', encoding='UTF8') as file: t = file.read()
        token, chat_id = t.split(',')
        bot = telegram.Bot(token=token)
    #msg = "[현대카드]:"+msg
    if telegram_option == 1: asyncio.run(bot.send_message(chat_id=chat_id, text=msg))

def Hy_mall():
    count = 0
    nowtime = datetime.datetime.now()
    option = Options()
    option.add_argument('--headless')
    option.add_argument('--no-sandbox')
    option.add_argument('--disable-dev-shm-usage')
    driver = webdriver.Chrome(f"/usr/src/chrome/chromedriver", options=option)
    url = "https://mpointmall.hyundaicard.com/goods/goodsList.do?bizGbn=3&mpmlBrndId=B07000000&leadIn=nav"
    driver.get(url)
    time.sleep(5)
    goodsListArea = driver.find_elements("xpath", '//*[@id="goodsListArea"]/li/div/p')
    time.sleep(5)
    for item_s in goodsListArea:
        if "m2" in item_s.text.lower():
            count = count + 1
            tele_sand_msg(item_s.text+"상품이 존재합니다.")
        else:
            print(item_s.text.lower())
    if count == 0:
    	tele_sand_msg("상품이 없습니다")
    time.sleep(2)
    driver.quit()

Hy_mall()

현대카드포인트몰에 애플샵 들어가서 펜슬이 있는지 체크하는 소스이다.

 

ps. 텔레그램봇이 작동안하길래 asyncio 이녀석으로 처리하였습니다.

 

참고자료

 

728x90
반응형