3 minute read

0. Motivation

프로젝트에 관련된 다양한 기술을 이용하여, 하나의 프로젝트를 진행하고 완료해보기.

1. 문제 제기 - Problem

취직하면 성남이나 판교, 경기도로 갈 확률이 매우 높음.
왕복 2시간을 출퇴근에 사용 = 하루의 10%를 소비.

2. 해결 방안 - Solution

최소 출근소요시간 -> Min rush hour를 찾아냄 (+@ 최대 출근소요시간도 고려)

3. 목적지&도착지 설정 (경도 longitude, 위도 latitude)

서울시립대 (127.0551130, 37.5834520) <—> 판교 (127.1126840, 37.3947670)

4. 데이터 수집 (Data Mining)

  • 1단계: 노가다, 매일매일 네이버 지도 앱을 이용하여 소요시간 측정하고 기록한다.
|    Date    |    Duration    |
|-----------------------------|
| 1902140119 |      19분      |
| 1902140920 |      45분      |
| 1902141207 |      36분      |
| 1902141734 |      59분      |
| 1902141808 |      66분      |
| 1902142043 |      38분      |
| 1902142257 |      26분      |
| 1902151225 |      33분      |
| 1902151948 |      39분      |
| 1902161445 |      40분      |
| 1902161758 |      41분      |
| 1902170005 |      24분      |
| 1902171151 |      30분      |
| 1902171900 |      32분      |
| 1902172207 |      28분      |
| 1902172216 |      34분      |
| 1902180846 |      43분      |

----    출장으로 일시 중지    ----

| 1903091300 |      43분      |
| 1903100022 |      24분      |
| 1903132308 |      27분      |
  • 1단계 결과
    Minimum Rush Hour = 2월 14일 새벽 1시 19분 : 19분
    Maximum Rush Hour = 2월 14일 오후 6시 08분 : 66분

대략적으로 시간이 얼마나 걸리는지에 대한 느낌정도는 왔음.
그러나 4일정도 수동으로 일일히 데이터를 수집해본 결과, 가성비가 너무 안좋음.
매일 같은 시간에 데이터를 모을 수 없고, 느리고, 힘들고, 속상하고, 무엇보다 전문성이 매우 떨어짐. 굳이 컴퓨터를 쓸 필요가 있을까하는 의문.
—> 데이터 마이닝 자동화 시스템 구축 (멋짐)

  • 2단계: Python 네이버 지도 크롤링
    크롬의 개발자도구를 이용하여, Request url을 얻어서 날짜와 소요시간을 저장.

(1) https://map.naver.com/ 에서 서울시립대학교 -> 판교역 길찾기
(2) 개발자도구 -> command + option + i 이용하여 Network 들어가고, findCarRoute.nhn function 확인

(3) Request url = https://map.naver.com/spirra/findCarRoute.nhn?route=route3&output=json&result=web3&coord_type=naver&search=2&car=0&mileage=12.4&start=127.0551130%2C37.5834520%2C%EC%84%9C%EC%9A%B8%EC%8B%9C%EB%A6%BD%EB%8C%80%ED%95%99%EA%B5%90&destination=127.1126840%2C37.3947670%2C%ED%8C%90%EA%B5%90%EC%97%AD+%EC%8B%A0%EB%B6%84%EB%8B%B9%EC%84%A0&via=
Response = {“routes”:[{“summary”:{“distance”:정수, “duration”:정수, 형태로 나오는 것 확인.

(4)Python으로 url 열어서 response 값 읽고, json으로 가져와서 dataset으로 구축

#!/usr/env/bin python3

from urllib.request import urlopen
import json

url = 'https://m.map.naver.com/spirra/findCarRoute.nhn?route=route3&output=json&result=web3&coord_type=latlng&search=2&car=0&mileage=12.4&start=127.0551130%2C37.5834520%2C%EC%84%9C%EC%9A%B8%EC%8B%9C%EB%A6%BD%EB%8C%80%ED%95%99%EA%B5%90&destination=127.1126840%2C37.3947670%2C%ED%8C%90%EA%B5%90%EC%97%AD+%EC%8B%A0%EB%B6%84%EB%8B%B9%EC%84%A0'

content = urlopen(url).read()
jsonValue = json.loads(content)
dataset = jsonValue['routes'][0]['summary']
duration = dataset['duration']
durationSecToMin = duration / 60
durationSecToMin = round(durationSecToMin, 2)

#get date & time
import datetime
currentDT = datetime.datetime.now()

date = currentDT.strftime('%Y%m%d%H%M')
#date = (currentDT.year * 100000000) + (currentDT.month * 1000000) + (currentDT.day * 10000) + (currentDT.hour * 100) + currentDT.minute


#save to text file
textFile = open("dataset.txt", "a+")
textFile.write(str(date) + ' : ' + str(durationSecToMin) + '\n')
textFile.close()

이러면 수동으로 한번짜리 코드이므로,
조금 더 자동화시켜서 한번 켜두면 계속 크롤링하게 만.

#!/usr/env/bin python3

from urllib.request import urlopen
import json
import threading

def minRushHour() :
    url = 'https://m.map.naver.com/spirra/findCarRoute.nhn?route=route3&output=json&result=web3&coord_type=latlng&search=2&car=0&mileage=12.4&start=127.0551130%2C37.5834520%2C%EC%84%9C%EC%9A%B8%EC%8B%9C%EB%A6%BD%EB%8C%80%ED%95%99%EA%B5%90&destination=127.1126840%2C37.3947670%2C%ED%8C%90%EA%B5%90%EC%97%AD+%EC%8B%A0%EB%B6%84%EB%8B%B9%EC%84%A0'

    content = urlopen(url).read()
    jsonValue = json.loads(content)
    dataset = jsonValue['routes'][0]['summary']
    duration = dataset['duration']
    durationSecToMin = duration / 60
    durationSecToMin = round(durationSecToMin, 2)

    import datetime
    currentDT = datetime.datetime.now()

    date = currentDT.strftime('%Y%m%d%H%M')
    #date = (currentDT.year * 100000000) + (currentDT.month * 1000000) + (currentDT.day * 10000) + (currentDT.hour * 100) + currentDT.minute


    textFile = open("dataset.txt", "a+")
    textFile.write(str(date) + ' : ' + str(durationSecToMin) + '\n')
    textFile.close()


end = False

def autoFunction(second = 1.0):
    global end
    if end :
        return

    minRushHour()
    threading.Timer(second, autoFunction, [second]).start()


try :
    autoFunction(60)
except :
    print('warning')
  • 2단계 결과
    서울시립대학교 -> 판교까지의 소요시간을 1분마다 dataset으로 구축했다.
    201904251303 : 46.7
    201904251304 : 46.7
    201904251305 : 46.7
    201904251306 : 46.7
    201904251307 : 46.7
    201904251308 : 44.32
    201904251309 : 44.32
    201904251310 : 44.32
    201904251311 : 44.32
    201904251312 : 44.32
    201904251313 : 44.25
    201904251314 : 44.25
    201904251315 : 44.25
    201904251316 : 44.25
    201904251317 : 44.25
    201904251318 : 43.8
    201904251319 : 43.8
    201904251320 : 43.8
    201904251321 : 43.8
    201904251322 : 43.8
    

+TMI, 네이버 지도의 소요 시간 함수는 밤에 10분마다, 낮에 5분마다 업데이트된다는 사실을 확인하였다.

$cat dataset.txt | wc -l
4406

자동화

minRushHour.py 파일을 항상 돌리는 것은 쓰레기 데이터 마이닝을 위한 전기소모라는 느낌이 든다.
탄력근무제를 고려하여 7시~10시 사이로 출근 시간을 가정하고 파일을 돌려서, 도착예정시간을 txt파일로 저장하자.

(1) 크론유틸리티, cron

touch crontab_file.txt #cron file 생성
crontab -e #cron file 편집
crontab crontab_file.txt #cron file 실행

crontab_file.txt 파일 안에 몇가지 규칙을 포함한 명령을 적어준다.

$crontab -e
#In crontab_file.txt,
0 6-11 * * 1-5 /Users/username/minRushHour.py

분 시 일 월 요일 file 순으로 작성.

(2) tmux
tmux를 이용하여, 데이터 구축용 간이 서버로 사용할 수 있다.

결론

Min Rush Hour = 출근: 11시 51분 (30분), 퇴근: 1시 19분 (19분)