ㅡ구조
A라는 데이터베이스에, 네이버 클라우드 MICRO SERVER에서 돌아가는 봇 프로그램으로 B라는 사이트의 데이터들을 주기적으로 스크랩 하여 인서트 하는 구조.
ㅡ봇 서버 구축
네이버 클라우드의 작은 서버인 MICRO SERVER를 생성하여,
1. 파이썬과 pip 설치(우분투에 기본 설치 돼 있는 3.10.xx로 그냥 썼다.)
python3 --version #설치된 파이썬 버전 확인
sudo apt update
sudo apt install python3-pip -y #pip 설치
pip3 --version #pip 확인
- dbus.service – D-Bus 메시지 버스 시스템으로, 애플리케이션 간 통신을 처리. 라이브러리 업데이트 후 재시작이 필요한 경우가 많다.
- networkd-dispatcher.service – 네트워크 상태 변화를 처리하는 네트워크 관리와 관련된 서비스. 네트워크 관련 라이브러리가 업데이트되었다면 재시작이 필요할 수 있다.
- polkit.service – 정책킷(PolicyKit) 서비스로, 시스템 권한 관리를 담당. 이 역시 라이브러리 업데이트 후 재시작이 필요할 수 있다.
- unattended-upgrades.service – 자동 업데이트를 처리하는 서비스로, 업데이트된 라이브러리를 사용하려면 재시작이 필요할 수 있다.
2. 가상환경 구축(디렉토리 형태): 가상환경 구축 안하면 시스템이 훼손 및 지저분해 질 수 있다.
3. 필요한 라이브러리들 설치 (selenium, pymysql, 크롬-헤드리스- 등...)
#가상 환경 생성
python3 -m venv myenv
#가상환경 디렉토리 확인
ls -l
#해당 가상 환경 활성화
source myenv/bin/activate
#활성화되면 명령줄 앞에 (myenv)라는 표시가 나타납니다.
#작업이 끝난 후에는 deactivate 명령으로 가상 환경을 비활성화.
#필요한 패키지들 설치(예시는 Dbot용)
#가상 환경 내에서만 이 패키지들이 사용됨.
pip install selenium==4.16.0 webdriver-manager==3.8.6 pymysql==1.1.0 requests==2.31.0
#가상 환경 비활성화
deactivate
# 날 수 있는 에러
-----------------------------------------------------------------------------------------------
root@-2:~# python3 -m venv myenv
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
apt install python3.10-venv
You may need to use sudo with that command. After installing the python3-venv
package, recreate your virtual environment.
Failing command: /root/myenv/bin/python3
root@-2:~# python3 --version
Python 3.10.12
-----------------------------------------------------------------------------------------------
#python3-venv 패키지가 설치되어 있지 않아 ensurepip이 없기 때문
#python3-venv 가상 환경 패키지 설치
sudo apt update
sudo apt install python3.10-venv
(크롬 설치: 헤드리스 모드용)
# 크롬 저장소 추가
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
# 업데이트 및 크롬 설치
sudo apt-get update
sudo apt-get install -y google-chrome-stable
google-chrome --version
4. A 데이터베이스에서 봇 서버(아이피) 접근 권한 부여
5. 프로젝트 봇 서버에 삽입
FileZilla, WinSCP, PSCP, SCP
#깃허브에 있으면 Git사용도
git clone https://your-repository-url.git
등으로 프로젝트 소스들을 root 디렉토리 아래에 적당한 디렉토리를 만들어서 삽입
6. 프론트 내지는 백그라운드에서 구동
- 백그라운드에서 구동하기
1) selenium 스크립트를 원격서버에서 백그라운드로 실행할때-전제로 원격세션을 종료를 해도 당연히 프로세스가 계속 되도록 해야 한다. (가령, selenium이 제어하던 Chrome 브라우저 인스턴스가 연결을 잃어 스크립트가 실패하지 않도록, 브라우저 세션이 터미널 세션과 독립적으로 실행되도록 구성해야 한다.)
- 세션 관리 개선: 세션이 끊어졌을 때 자동으로 복구하는 기능 추가
- 향상된 Chrome 옵션: 원격 서버 환경에서 더 안정적으로 동작하도록 추가 옵션 설정
- atexit 모듈 사용: 프로그램 종료 시 리소스를 안전하게 정리하도록 함
- get_url_with_retry 함수: 세션이 끊어졌을 때 자동으로 재시도하는 기능 구현
- 예외 처리 강화: 문제 발생 시 더 안정적으로 다음 작업으로 넘어감
- Xvfb 가상 디스플레이 사용: 실제 디스플레이 없이도 브라우저 실행 가능
- Xvfb 등 출돌 회피: 기존에 실행 중인 모든 Xvfb 프로세스를 종료, 모든 디스플레이 락 파일(/tmp/.X99-lock 등)을 제거, 새로운 Xvfb 프로세스를 시작
- ChromeDriver 경로 문제 해결 : 지정된 ChromeDriver 경로 확인, 경로가 유효하지 않으면 시스템에서 ChromeDriver 검색, ChromeDriver 경로를 PATH에 추가, 실행 권한 부여
- 환경 확인: 실행 환경을 자동으로 확인하여 문제 예방
- 프로세스 관리: PID 파일 추적 저장 및 로그 파일 관리
#봇 프로세스 시작 스크립트
#!/bin/bash
# 프로젝트 디렉토리
PROJECT_DIR="/root/dbot"
cd $PROJECT_DIR
# 가상 환경 경로
VENV_PATH="/root/myenv"
# 로그 디렉토리 생성
mkdir -p logs
# 현재 날짜와 시간으로 로그 파일명 생성
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="logs/dbot_${TIMESTAMP}.log"
# 기존 프로세스 정리
echo "기존 Chrome 및 ChromeDriver 프로세스 정리 중..."
pkill -f chrome
pkill -f chromedriver
sleep 2
# 기존 Xvfb 프로세스 및 락 파일 정리
echo "기존 Xvfb 프로세스 정리 중..."
pkill -f Xvfb
for i in {0..99}; do
if [ -f "/tmp/.X${i}-lock" ]; then
rm -f "/tmp/.X${i}-lock"
echo "락 파일 제거: /tmp/.X${i}-lock"
fi
done
# 가상 디스플레이 설정 (Xvfb 사용)
echo "가상 디스플레이 설정 중..."
if ! command -v Xvfb &> /dev/null
then
echo "Xvfb가 설치되어 있지 않습니다. 설치 중..."
apt-get update
apt-get install -y xvfb
fi
DISPLAY_NUM=99
Xvfb :${DISPLAY_NUM} -screen 0 1920x1080x24 &
XVFB_PID=$!
echo "Xvfb 시작됨 (PID: $XVFB_PID)"
export DISPLAY=:${DISPLAY_NUM}
# 실행 환경 확인 및 설정
echo "실행 환경 확인 중..."
source $VENV_PATH/bin/activate
which python3
python3 --version
# Chrome 확인
which google-chrome
google-chrome --version
# ChromeDriver 경로 확인 및 추가
CHROMEDRIVER_PATH="/root/.wdm/drivers/chromedriver/linux64/133.0.6943.141/chromedriver-linux64/chromedriver"
if [ ! -f "$CHROMEDRIVER_PATH" ]; then
echo "지정된 경로에 ChromeDriver가 없습니다. 시스템에서 찾는 중..."
CHROMEDRIVER_PATH=$(find /root -name chromedriver -type f | head -n 1)
fi
if [ -f "$CHROMEDRIVER_PATH" ]; then
echo "ChromeDriver 경로: $CHROMEDRIVER_PATH"
chmod +x "$CHROMEDRIVER_PATH"
export PATH="$PATH:$(dirname $CHROMEDRIVER_PATH)"
else
echo "ChromeDriver를 찾을 수 없습니다."
exit 1
fi
# 다시 ChromeDriver 확인
which chromedriver
chromedriver --version || echo "ChromeDriver 버전 확인 실패"
# downloaded_media 디렉토리 생성 (이미지 저장 위치)
mkdir -p downloaded_media
# nohup.out 파일 초기화
> nohup.out
# 스크립트 실행
echo "디봇 시작 중... 로그는 ${LOG_FILE}에 저장됩니다."
nohup python3 runner.py > "${LOG_FILE}" 2>&1 &
# PID 저장
PID=$!
echo $PID > dbot.pid
echo "디봇이 PID ${PID}로 시작되었습니다."
echo "로그를 확인하려면: tail -f ${LOG_FILE}"
echo "프로세스를 종료하려면: kill -9 $PID"
# 스크립트가 종료되어도 백그라운드 프로세스가 계속 실행되도록 가상 환경 비활성화
deactivate
#윈도우에서 작성한 쉘 스크립트 파일을 리눅스에 맞게끔 변경(줄바꿈 문자 문제)
방법1- dos2unix 유틸리티 사용
# dos2unix 설치 (없는 경우)
apt-get update
apt-get install dos2unix
# 파일 변환
dos2unix start_dbot.sh
방법2- sed 명령어 사용
sed -i 's/\r$//' start_dbot.sh
방법3- nano로 새 파일 생성
# 기존 파일 백업
mv start_dbot.sh start_dbot.sh.bak
# 새 파일 생성
nano start_dbot.sh
##작성
#권한부여
chmod +x start_dbot.sh
2) 스크립트 실행
./start_dbot.sh
-끝-
'기타 개발' 카테고리의 다른 글
(휴이온 타블렛) KAMVAS 22 plus 커서 이상 현상 (0) | 2025.03.05 |
---|---|
(네트워크) DNS_PROBE_FINISHED_NXDOMAIN 해결 방법 (0) | 2025.03.03 |
깃허브 에러 remote: Repository not found. (0) | 2025.01.22 |