기타 개발

(웹 스크래핑) 봇 운영하기

Drider 2025. 2. 26. 02:22
반응형

ㅡ구조

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 확인

pip 설치중 항목들 데몬(백그라운드 서비스)재시작 묻는 화면, OK

  • 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

화살표 조작 스페이스 바 체크 OK

 

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

 

 

-끝-