주기적으로 크롤러를 자동 실행하여 최신 데이터를 수집해야 하는 경우 다양한 옵션을 생각해볼 수 있다.
클라이언트에서 크롤러를 스케줄러에 등록해서 운용할 수도 있지만, 굳이 서버라고 명시한 것은 여러 가지 이유가 있다.
크롤러가 스케줄에 따라 동작하려면, 스케줄된 시간에 머신이 동작하고 있어야 하며 크롤러가 동작하는 도중에 머신이 종료되면 안 된다.기본적으로 서버는 24시간 돌아간다. 따라서 스케줄 된 시간의 머신 동작 여부나 동작 종료 여부를 걱정하지 않아도 된다.
예전에 회사에서 크롤러를 관리할 때, 서버용으로 사용하는 컴퓨터가 있었는데 회사 전기가 나가서 크롤러가 동작하지 않은 적이 있다. 이런 경우를 생각하면 클라우드 서비스도 좋은 선택지인 것 같다.
1. 윈도우즈 서버에서 크롤러 운용하기
작업 스케줄러에 크롤러를 등록하면 된다.
(1) 작업 스케줄러 들어가기
(2) 작업 스케줄러 라이브러리 클릭
구글 크롬이나 웨일은 새 버전이 나오면 자동으로 업데이트 되는데, 어떻게 업데이트하나 싶었더니 작업 스케줄러에 등록되어있었다. 웨일의 사용자가 로그온할 때, 한시간 마다 반복은 조금 과한게 아닌가 생각이 들었는데 자동 업데이트 되는 다른 프로그램도 다 똑같이 스케줄되어있었다...ㅋㅋ
또 카카오톡은 스케줄러에 등록이 안되어있는데 어떻게 자동업데이트를 하나 궁금해서 찾아봤다.
카카오톡은 'C:\Users\<사용자 이름>\AppData\Local\Kakao\KakaoTalk' 경로의 KakaoUpdate.exe 파일을 사용해서 업데이트 된다고 한다.
만약 자동 업데이트가 싫다면 이 프로그램을 삭제하고, 동명의 의미없는 파일을 하나 만들어서 넣어두면 된다.
(3) 동작>작업 만들기 클릭
(4) 원하는 대로 설정
동작 설정을 할 때는 조금 유의해야 하는 부분이 있다. 기본적으로 찾아보기에서 실행할 프로그램 또는 스크립트를 클릭해서 그 프로그램을 실행시키는데, 일반적으로는 Javascript를 사용한 웹 사이트를 크롤링할 때 사용하는 웹 드라이버라던가 기타 스크레이핑을 위한 파일이 실행할 프로그램과 같은 위치에 있을거다. 그리고 높은 확률로 절대 경로가 아닌 상대 경로로 코드에 지정해놓았을 것이다.
만약에 그렇다면 시작 위치를 크롤러가 위치한 곳으로 설정해줘야 오류가 발생하지 않는다.
그리고 인수 추가 옵션은 간단하게 cmd에서 프로그램을 동작시킬 때와 같다고 생각하면 된다. cmd에서 프로그램을 실행할때 보통 './sample.exe'로 프로그램을 실행시키는데 인자를 받는 프로그램이거나 특수한 설정을 해야하는 경우에는 './sample.exe --auto' 이런식으로 뒤에 인자를 추가한다. 인수 추가 옵션은 그 역할을 해준다고 생각하면 된다.
2. 우분투 서버에서 크롤러 운용하기
소프트웨어 유틸리티 cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
cron은 셸 명령어들이 주어진 일정에 주기적으로 실행하도록 규정해놓은 crontab (cron table) 파일에 의해 구동된다. crontab 파일들은 잡 목록 및 cron데몬에 대한 다른 명령들이 보관된 위치에 저장되어 있다. 사용자들은 자신들만의 개개의 crontab 파일들을 가질 수 있으며, 가끔은 /etc 또는 /etc의 하위 디렉터리에 시스템 관리자들만이 편집할 수 있는, 시스템 전반에 영향을 미치는 crontab 파일이 존재하는 경우도 있다.
- [cron](https://ko.wikipedia.org/wiki/Cron)
윈도우에서 작업 스케줄러를 통해 크롤러를 스케줄링한 것처럼, 우분투에서는 cron이라는 이름의 잡 스케줄러에서 크롤러를 스케줄링한다.
위에서 설명된 것 처럼 사용자 개개인 마다 설정 할 수도 있고, 시스템 전체에 설정 할 수도 있다.
시스템 전체에 설정을 할 경우에는 /etc/crontab 파일에 설정하면 된다.
아무래도 윈도우는 GUI 기반 잡 스케줄러고 우분투는 cron은 CLI 라서 조금 더 복잡하고, 공부해야 하는 부분도 많다. 대신 더 많은 기능이 있고, 익숙해지면 생산성을 훨씬 끌어올릴 수 있다.
(1) /etc/crontab
cat /etc/crontab을 하면 기본 crontab 설정을 볼 수 있고, vi /etc/crontab을 하면 수정할 수 있다.
각 줄에 대한 설명은 위의 이미지에 해두었다.
간단하게 다시 설명하자면 #으로 시작하면 주석이고, 실행할 잡의 설정은 '분 시 일 월 요일 사용자이름 명령어'순으로 한다. 분부터 요일까지의 필드는 잡을 실행할 패턴을 지정하는 부분인데, *을 지정하면 해당 필드 값과 관계없이 실행하라는 의미이다.
스케줄링 예제는 아래의 링크에서 확인할 수 있다.
vi /etc/crontab 을 입력하면 아래와 같은 화면이 나오고 편집 가능하다.
cron은 일반적인 프로그램과 다른 기본적인 환경변수만 설정된 환경에서 실행되어 각종 문제가 발생할 가능성이 있다.
따라서 환경변수를 설정하는 처리를 해야한다. crontab내부에 설정을 변경할 수도 있고 셸 스크립트를 만들어서 필요한 설정과 프로그램 실행을 할 수도 있다.
예를들어 위와 같은 구조에서 셸 스크립트를 만들어서 실행을 하려면
chmod +x run_crawler.sh
chmod라는 명령어를 써서 셸 스크립트를 cron이 실행할 수 있게 권한을 부여하고, /etc/crontab에 설정을 추가하면 된다.
* * * * * user-name command > /log/crawler.log 2>&1
잡을 추가할 때 '> /tmp/crawler.log 2>&1'을 같이 입력하면, 실행한 스크립트의 표준 출력과 표준 오류 출력이 /log/crawler.log 2>&1 위치에 저장된다.
Cron으로 실행하는 프로그램은 문제가 생겨도 직접 확인하기 어렵기 때문에 이와 같이 로그를 저장해서 문제가 생겼을 때 확인할 수 있도록 하는 것이 좋다.
(2) 메일 전송
윈도우즈에서는 크롤링에 오류가 발생했을 때(실행 결과도 보낼 수 있음) 메일로 전송하려면, 크롤러에 메일을 전송해주는 기능이 포함되어 있어야 한다. 하지만 우분투 cron에서는 실행 결과를 메일로 보내는 내장 기능이 있다.
MTA 기능을 하는 소프트웨어를 설정하고, 스팸으로 필터링이 되지 않기 위해 SMTP 서버를 경유해서 메일을 보내면 된다.
- 설치 및 사용 방법
# 설치
sudo apt-get install -y postfix mailutils
# 설정 수정
$ vi /etc/postfix/main.cf
# 내용
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
# 설정 수정
$ vi /etc/postfix/sasl_passwd
# 내용
[smtp.gmail.com]:587 <user-name>@gmail.com:<password>
# 권한 부여
$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap /etc/postfix/sasl_passwd
# 실행
$ sudo service postfix reload
# 메일 전송
$ echo "test mail from postfix" | mail -s "test" <my-email>@gmail.com
- 오류 발생 시 메일 전송 방법
Cron 환경변수에 'MAILTO = <my-email>@gmail.com' 설정을 추가하면 메일 주소로 표준 출력/표준 오류 출력이 전송된다. 문자열이 깨지면 Cron 환경변수 설정으로 메일을 utf-8로 설정하면 된다.
표준 오류 출력에 대해서만 메일을 받고 싶다면 필터링 기능을 추가하면 된다.
cron에 대한 자세한 설명은 아래의 링크에서 확인할 수 있다.
'Crawling' 카테고리의 다른 글
[크롤링/16]메시지 큐(파이썬 Redis) (0) | 2021.03.26 |
---|---|
[크롤링/14]Scrapy로 Javascript 사용한 페이지 크롤링하기(Splash) (1) | 2021.03.25 |
[크롤링/13]Scrapy 오류 처리 설정 (0) | 2021.03.25 |
[크롤링/12]Scrapy HTTP 요청/캐시 설정 (0) | 2021.03.25 |
[크롤링/11]Scrapy 병렬 처리 설정 (2) | 2021.03.25 |