Crontab, 쉘 스크립트를 이용하여 크롤링 자동화 & 주기적 Slack 메시지 전송

Zoonmy·2024년 7월 10일

앞에서 구현한 crawler.jar 파일을 쉘 스크립트로 만들고, crontab을 이용해 자동화를 해보려고 한다.

구현 사항

1) run_crawler.sh가 java -jar crawler.jar 명령을 실행하고, 실행한 시각을 crawling_log 파일에 기록
2) crontab을 통해 run_crawler.sh 가 15분마다 실행되도록 구현
3) crontab을 통해 매 정각마다 send_news.sh가 실행되도록 구현

1) run_crawler.sh

1) 쉘 스크립트 코드 작성

#!/bin/bash

# direcotry 이동
cd /home/zoonmy

# Java 실행
java -jar ./crawler.jar 2>> /home/zoonmy/error_log

# 실행한 시각을 crawling_log 파일에 추가
if [ $? -eq 0 ]; then
    echo "Crawler executed at: $(date)" >> /home/zoonmy/crawling_log
else
    echo "Crawler failed at: $(date)" >> /home/zoonmy/crawling_log
fi

2) 권한 설정

chmod +x run_crawler.sh

2) run_crawler crontab 테스트

1) crontab 설정 열기

crontab -e

2) 테스트를 위해 1분마다 크롤링 하도록 설정

*/1 * * * * /home/zoonmy/run_crawler.sh

3) 결과 확인

  • 정상적으로 1분 마다 수행되는 것을 볼 수 있다.

3) send_news.sh

1) 쉘 스크립트 코드 작성

  • URL 부분에 웹훅 url을 넣어주면 된다
  • .[-8:] 을 통해 가장 최신 8개만 보여주도록 구현
    • 인자 변경을 통해 개수 조절 가능
#!/bin/bash

# directory 이동
cd /home/zoonmy

# 파일 경로 설정
FILE="news.json"
LOG_FILE="send_log"
ERROR_LOG_FILE="error_log"

# JSON 파일이 존재하는지 확인
if [ ! -f "$FILE" ]; then
    echo "Error: $FILE does not exist." | tee -a $ERROR_LOG_FILE
    exit 1
fi

# 현재 시간을 변수에 저장
date=$(date +"%H")

# 뉴스 데이터를 JSON 문자열로 조합
news_text="현재 ${date}시 뉴스입니다.\n\n"
news_entries=$(jq -r 'to_entries | map("\(.key)\n\(.value)\n") | .[-8:] | .[]' $FILE)
formatted_text=$(echo -e "$news_text$news_entries")

# Slack 웹훅 URL 
WEBHOOK_URL="{url}"

# curl로 Slack 웹훅에 데이터 전송
json_payload=$(jq -cn --arg text "$formatted_text" '{"text": $text}')
curl -X POST -H 'Content-type: application/json' --data "$json_payload" $WEBHOOK_URL 2>> $ERROR_LOG_FILE

# 전송 결과 확인
if [ $? -eq 0 ]; then
    echo "News sent at: $(date)" >> $LOG_FILE
else
    echo "Error sending news at: $(date)" >> $ERROR_LOG_FILE
fi

2) 권한 설정

chmod +x send_news.sh

4) crontab 최종 설정

tip) crontab online simulator 사이트

1) crontab 설정 열기

crontab -e

2) run_crawler.sh 설정

  • 매 시각 15분마다 수행되도록 설정
# 매 15분 마다 네이버 뉴스 크롤링 수행
*/15 * * * * /home/zoonmy/cs10/cs01/mission2_crawling/run_crawler.sh

3) send_news.sh 설정

  • 매 시각 정각마다 수행되도록 설정
# 매 시각 정각마다 news 정보 슬랙으로 전송
0 * * * * /home/zoonmy/cs10/cs01/mission2_crawling/send_news.sh

결과 화면

slack webhook을 쉘스크립트 curl 명령어로 보내는 것 말고, api를 사용할 수도 있다!
https://api.slack.com/messaging/webhooks

profile
열시미 해야쥐

0개의 댓글