공모전 크롤링 개선 방안
프로젝트 소개
프로젝트 요약
- "링커리어", "위비티", "씽굿"에 게시된 공모전 데이터를 한 페이지에서 확인
- 검색 기능 및 추천 검색어 기능을 제공하여 필요한 공모전을 빠르게 탐색
- 표시된 공모전을 클릭하면, 해당 공모전 사이트로 이동
사용한 기술
- Frontend : HTML, CSS
- Backend : Django (5.0.4), sqlite
- Crawling : beautifulsoup (4.12.3), selenium (4.20.0)
- Data-Processing : pandas (2.2.2)
개선 방안
데이터 수집 시간 단축
링커리어, 씽굿의 경우 Selenium으로 동적 웹 스크래핑을 진행하여 시간이 오래 걸리는 (약 30분) 문제점이 있었다. 또한 매번 모든 데이터를 수집하기 때문에 여러 번 실행하더라도 비슷한 시간에 동작한다. 이러한 수집 방법을 정적 웹 스크래핑으로 변경한다면, 엄청난 시간 단축이 이루어질 것이다. 링커리어, 씽굿에 어떻게 적용하면 좋을지 생각해 보자.
- 링커리어
- 공모전 목록 2페이지의 링크는 다음과 같음
- GET 요청과 pagination을 적용하여 각 페이지에 있는 링크를 가져오고, 해당 링크에 다시 접속해 요소 추출
https://linkareer.com/list/contest?filterType=CATEGORY&orderBy_direction=DESC&orderBy_field=CREATED_AT&page=2
- 씽굿 (실패)
- 각 공모전 페이지 및 다음 페이지(pagination)는 파라미터를 받아 Encode된 값을 주소로 사용함
- 테스트 결과 Encode 방식이 일반적인 Base64 방식이 아니기 때문에 페이지 주소 추출 불가
- 내부적으로 Encode 방식에 대해 기술된 js를 찾을 수 없음 (있지만, 찾지 못했을 가능성도 있음)
- 그러나 Encode 방식이 계속 동일하고 같은 값을 반환한다면, 처음 한 번만 pagination에 대한 Encode된 값을 동적 스크래핑으로 가져온 뒤 두 번째부터는 Requests를 활용한 정적 스크래핑 가능
데이터 적재 방식 - Code
- 현재 적재 방식 : 데이터 수집 및 csv 변환 후 로컬에 저장 후 csv를 읽어 Django 내의 Sqlite에 적재
- 문제점 1 : 데이터 중복 처리 수행 X
- 동일한 데이터라도 적재하므로 에러 발생 가능
- 공모전 명이 같으면 적재하지 않는 방식을 채택하여 동일 데이터 적재 방지
- 문제점 2 : Local 환경의 한계
- 로컬 환경이므로 csv로 저장하지 않고 바로 DB에 적재하는 편이 더 경제적
- 클라우드를 활용한다면, 웹 서버와 S3를 활용해 크롤링 자동화 및 S3 파티셔닝 구축 가능
logging & Error Handling - Code
- logging을 활용하여 코드가 어느 정도 진행 중인지, 어디서 오류가 발생했는지 확인 가능
- try-except를 사용이 매우 부분적이기 때문에 오류가 발생했을 때, 추가 이슈 발생 가능
Github settings.py
- Github를 확인하니 settings.py가 업로드된 것을 확인 가능
- 개인 프로젝트로 진행하여 괜찮았지만, ignore 처리를 통한 보안 이슈 방지 필요