데이터분석과 개발

크롤링 자동화 프로그램 구축 경험 기록 본문

개발&분석 경험

크롤링 자동화 프로그램 구축 경험 기록

긍정적인마인드 2023. 1. 12. 23:41

* 경험한 것을 정리한 글이므로 틀린 내용이 있을 수 있습니다.

* 더 좋은 방법 또는 틀린부분이 발견될 시 계속 수정하며 업데이트 할 예정입니다.

 

안녕하세요

오늘은 크롤링 자동화 프로그램을 만들었던 경험을 포스팅 해볼까 합니다.

소요된 시간은 1달~ 1달 반 정도 걸렸고 15개 정도의 데이터를 크롤링하여 DB에 넣는 것을 자동화한 프로그램을 만들었습니다.

어려운 작업은 아니었지만 배운점이 많아서 한번 기록해보려 합니다! 

 

1. 크롤링 

 크롤링을 꾸준히 하다보니 이제 크롤링은 저에게 단순 작업이 되어서 가볍게 넘어가도록 하겠습니다 !

 

2. 코드 Class화

많은 데이터를 수집하고 또 같은 페이지에서 다른 데이터를 수집하다보니 겹치는 코드가 많아져 쓸데없이 길어져서 보기가 안 좋았습니다.

그래서 저의 경우 크롤링, 전처리, 데이터베이스 3가지의 클래스를 만들어 클래스 객체를 사용하여

겹치는 코드를 없애서 훨씬 간단해졌고 이후 코드를 고치기에도 편했습니다. 

 

3. DB error

DB 를 만들고 데이터를 넣는 건 매우 쉬웠는데 데이터베이스 에러 처리를 하는 부분에서 개인적으로 상당히 어려웠던 것 같습니다.

 

저의 경우 전처리한 데이터프레임의 데이터를 넣는 과정에서

 

(1) 시계열 데이터를 다루고 있어서 날짜가 절대 겹치면 안되고 (Integrity error: 데이터가 중복될 경우)

 

(2) 크롤링할 데이터가 있는 표에 데이터가 비어있고 날짜만 있는 경우가 있어서 (Database error: Nan값 넣을경우)

 

문제였습니다. 

 

위 2문제를 피하려면 정말 날짜1개씩만 넣어줘야 하는데 빠짐없이 데이터를 수집하기 위해서는

매일매일 코드를 돌려야하고 비어있던 칸에 언제 데이터가 채워질지 모르는 상황이어서 고치가 아팠었는데

 

시행착오 끝에 이 문제를 try except 구문의 except 예외처리를 사용해서 해결했습니다.

날짜 5개를 넣어주고 (주말 공휴일 고려시 적어도 5일 안에는 출근)

모든 데이터베이스 에러를 세분화해서 log에 남기도록 하였습니다. 

# 예외처리 예시
import pymysql

try:
	sql='''
    insert into...
    '''
    
except pymysql.err.IntegrityError as e:
                print(e)
                comment= 'IntegrityError'
                
except pymysql.err.DatabaseError as e:
                print(e)
                comment= 'DatabaseError'
        
 except pymysql.err.InterfaceError as e:
                print(e)
                comment= 'InterfaceError'

 

comment에 에러메시지인 'e'를 담고 싶었는데 e가 담겨지진 않았네요,,

예외처리를 해주고 나니 필수적인 에러가 생김에도 끊김없이 코드가 돌아가게 만들 수 있었습니다.

 

4. Airflow

 

코드도 잘 돌아가고 매번 직접 돌리기보다 자동화를 시키고 싶어져서

최근에 스케줄러가 있고 workflow까지 관리해주는 Airflow라는 프로그램이 있다고 들어서 사용을 시도해보았습니다!

 

WSL 설치 ->  Airflow설치 -> 리눅스를 통해  크롬드라이버 설치 ->  Airflow scheduler 실행 ..했지만

 

결론적으로 실패했습니다..ㅎㅎ

 

일단 Airflow가 2018년 이전에 나온 프로그램인데 셀레늄 관련 관련 유투브, 포스팅이 거의 없습니다. 

2018년에 어떤 분이 올려놓으신게 있는데 너무 복잡했습니다.. 아예 플러그인 모듈을 만들어서 셀레늄을 연동시키는 코드인거 같았습니다,,,

어려운 부분도 있고 단기간에 끝낼 자신이 없어서 다른방법을 찾기로 했습니다. 포기!

 

참고:

https://towardsdatascience.com/selenium-on-airflow-automate-a-daily-online-task-60afc05afaae

 

(구글 검색창에 'Airflow selenium' 이라고 검색했을때 그나마 가장 많은 결과가 있었던 것 같네요)

 

 

5. 파이썬 scheduler

 

파이썬에 scheduler라는 모듈이 있습니다. job() 이라는 함수를 만들어주고 scheduler를 사용하면 자동으로 주기적으로 코드를 실행할 수 있습니다.

# scheduler 기본 코드
import scheduler
import time

def job():
	print('Hello')
    
# 매일 오전9시에 job 함수 실행
scheduler.every().day.at("09:00").do(job)

while True:
	scheduler.run_pending()
    time.sleep(1)

참고:

https://www.youtube.com/watch?v=yDPQfj4bZY8 

scheduler 설명영상

그래서 위에서 만든 크롤링 코드를 job() 함수 안에 넣어줬습니다. 

주의해야할 사항은 job()함수가 주기적으로 돌아가기 때문에

필요한 변수들(ex. 오늘날짜,시간)을 모두 job()함수 안에 넣어줘야 했었습니다.

 

하지만 python scheduler는 코드가 잠깐 돌아가고 끝나는게 아니라

계속 돌아가고 있는 상태여야 했기에 사용하지 않기로 했습니다. 

사용해도 상관은 없지만 하나의 프로그램을 계속 돌려 놓는다는 게 불안정하다고 판단했기 때문입니다.

 

6. 리눅스 스케줄러

 

서버 컴퓨터가 리눅스 운영체제였기 때문에 결국 위에서 만든 완성된 크롤링 코드를 리눅스 스케줄러를 사용해 돌리기로 결정하였습니다!  서버 컴퓨터는 항상 켜져있기 때문에 문제없이 잘 돌아갈 것 같네요.

방법 선택 과정은 길었지만 가장 간결한 방법이지 않을까 싶습니다.

 

* 마치며

익숙하지 않았던 Class와 DB에 좀 더 가까워질 수 있었고 

리눅스, Airflow 등 새로운 프로그램을 경험할 수 있어서 좋았던 것 같습니다.

이후에 Airflow는 mlops 카테고리로 공부한 것을 간단하게 정리해볼까 합니다. 

'개발&분석 경험' 카테고리의 다른 글

[기타경험] 스타트업 IR 발표회  (0) 2023.05.05
짧은 시계열 예측 경험 정리  (3) 2023.04.15