일단 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
반응형