티스토리 뷰

728x90

<이번에는 webdriver을 사용한 동적 크롤링으로 위치간의 거리와 예상소요시간, 도착예정시간을 구하는 방법을 포스팅하겠습니다.>

 


 

1번은 눈에 보이는 webdriver창이 켜진상태로 정보 가져오기

- 2번은 눈에 보이지않게, webdriver로 정보 가져오기 입니다.

 


1번. 눈에 보이는 webdriver창이 켜진상태로 크롤링하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#perfect 완성본 - visible
from selenium import webdriver
import pyautogui
from bs4 import BeautifulSoup
import time
from datetime import datetime
 
start = "송천고"
finish = "소래포구역"
data = []
 
driver = webdriver.Chrome('C:\chromedriver.exe')
driver.get('https://map.naver.com/v5/directions/-/-/-/mode?c=14107103.1786139,4494701.9630842,15,0,0,0,dh')
delay = 3
driver.implicitly_wait(delay)
driver.find_element_by_xpath('//*[@id="intro_popup_close"]/span').click()
driver.implicitly_wait(5)
driver.find_element_by_xpath('//*[@id="container"]/div[1]/shrinkable-layout/directions-layout/directions-result/div[1]/ul/li[3]/a').click()
driver.implicitly_wait(5)
driver.find_element_by_id('directionStart').send_keys(start)
time.sleep(0.02)
pyautogui.press('enter')
time.sleep(0.3)
driver.find_element_by_id('directionGoal').send_keys(finish)
time.sleep(0.02)
pyautogui.press('enter')
time.sleep(0.3)
driver.find_element_by_xpath('//*[@id="container"]/div[1]/shrinkable-layout/directions-layout/directions-result/div[1]/directions-search/div[2]/button[3]').click()
time.sleep(0.4)    
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
 
score_result = soup.find('div', {'class''summary_box'})
 
score_result = str(score_result)
times, length = score_result.split("추천"1)
 
times = times.split(">",2)
times = times[2]
times = times.split("<",1)
times = times[0]
 
length = length.split(">",4)
length = length[4]
length = length.split("<",1)
length = length[0]
#print("거리 : " + length + "   /   소요예상시간 : " + times)
times_ff = times
driver.close()
 
now_hour = datetime.today().strftime("%H")
now_min = datetime.today().strftime("%M")
 
now_time = int(now_hour) * 60 + int(now_min)
if '시간' in times:
    times = times.split("시간",1)
    times_hour = times[0]
    times_hour = times_hour.replace("시간","")
    times_min = times[1]
    times_min = times_min.replace(" ","")
    times_min = times_min.replace("분","")
else:
    times = times.replace(" ","")
    times_min = times.replace("분","")
    times_hour = '0'
    
times_hour = str(times_hour)
times_min = str(times_min)
 
times_f = int(times_hour)*60 + int(times_min)
 
time_sum = times_f + now_time
 
time_f_hour = int(time_sum/60)
time_f_min = time_sum % 60
 
if time_f_hour >= 24:
    time_f_hour = time_f_hour - 24
    
    
print("거리 : " + length + "   /   예상소요시간 : " + times_ff + "   /   현재출발시 예상도착시간 : " + str(time_f_hour) + "시 " + str(time_f_min) + "분")
cs

1~6번 줄   : 필요한 라이브러리 불러오기

8~9번 줄   : start는 시작위치, finish는 도착위치를 넣을 변수입니다.

12번 줄     : webdriver으로 C드라이브에 위치한 chrome을 사용합니다.

13번 줄     : 네이버 지도로 이동합니다.

15~28번줄 : 네이버 지도에서 도보를 선택하고 출발,도착위치 지정한 후에 길찾기 버튼을 누릅니다.

30~35번줄 : 길찾기를 누른 페이지의 html정보를 가져오고 필요한 데이터만 뽑아옵니다.

36~48번줄 : 필요한 데이터를 정제합니다.

49번 줄     :  드라이브를 닫습니다.

51~52번줄 : 현재 시간의 "시"와 "분"을 가져옵니다.

54~78번줄 : 예상도착시각을 구합니다.

81번 줄     : 거리, 예상소요시간, 예상도착시각을 출력합니다.


2. 눈에 보이지않게, webdriver로 정보 가져오기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import pyautogui
from bs4 import BeautifulSoup
from datetime import datetime
 
try:
    start = "논현역"
    finish = "논현고"
    data = []
 
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('headless')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('lang=ko_KR')
 
    driver = webdriver.Chrome('C:\chromedriver.exe', chrome_options=chrome_options)
 
    driver.get('https://map.naver.com/v5/directions/-/-/-/mode?c=14107103.1786139,4494701.9630842,15,0,0,0,dh')
    delay = 3
    driver.implicitly_wait(delay)
    driver.find_element_by_xpath('//*[@id="intro_popup_close"]/span').click()
    driver.implicitly_wait(5)
    driver.find_element_by_xpath('//*[@id="container"]/div[1]/shrinkable-layout/directions-layout/directions-result/div[1]/ul/li[3]/a').click()
    driver.implicitly_wait(5)
    el = driver.find_element_by_id('directionStart')
    el.send_keys(start)
    time.sleep(0.02)
    el.send_keys(Keys.ENTER)
    time.sleep(0.2)
    al = driver.find_element_by_id('directionGoal')
    al.send_keys(finish)
    time.sleep(0.02)
    al.send_keys(Keys.ENTER)
    time.sleep(0.2)
    driver.find_element_by_xpath('//*[@id="container"]/div[1]/shrinkable-layout/directions-layout/directions-result/div[1]/directions-search/div[2]/button[3]').click()
    time.sleep(0.3)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
 
    score_result = soup.find('div', {'class''summary_box'})
    score_result = str(score_result)
    times, length = score_result.split("추천"1)
 
    times = times.split(">",2)
    times = times[2]
    times = times.split("<",1)
    times = times[0]
 
    length = length.split(">",4)
    length = length[4]
    length = length.split("<",1)
 
    length = length[0]
    times_ff = times
    driver.quit()
 
    now_hour = datetime.today().strftime("%H")
    now_min = datetime.today().strftime("%M")
 
    now_time = int(now_hour) * 60 + int(now_min)
    if '시간' in times:
        times = times.split("시간",1)
        times_hour = times[0]
        times_hour = times_hour.replace("시간","")
        times_min = times[1]
        times_min = times_min.replace(" ","")
        times_min = times_min.replace("분","")
    else:
        times = times.replace(" ","")
        times_min = times.replace("분","")
        times_hour = '0'
 
    times_hour = str(times_hour)
    times_min = str(times_min)
 
    times_f = int(times_hour)*60 + int(times_min)
 
    time_sum = times_f + now_time
 
    time_f_hour = int(time_sum/60)
    time_f_min = time_sum % 60
 
    if time_f_hour >= 24:
        time_f_hour = time_f_hour - 24
 
 
    print("거리 : " + length + "   /   예상소요시간 : " + times_ff + "   /   현재출발시 예상도착시간 : " + str(time_f_hour) + "시 " + str(time_f_min) + "분")
except:
    print("해당 위치 사이의 거리가 50km를 초과한 경우 도보 이동거리를 제공할 수 없습니다.")
cs

13~16번 줄 : webdriver를 disable모드로 설정하여 창이 보이지 않는 상태로 정보를 가져옵니다.

나머지는 위와 모두 같습니다.


주의할 점: 네이버 지도를 webdriver로 돌릴때 간혹 ENTER키가 입력되어 인식되기 전에 다음 코드로 넘어가 에러가 생길 수 있으므로 적절한 때에 time delay를 넣어줘야 합니다!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함