티스토리 뷰
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를 넣어줘야 합니다!
'프로그래밍 > 프로젝트' 카테고리의 다른 글
[APi프로젝트] 구글 클래스룸API 활용 서비스 개발 (0) | 2021.02.27 |
---|---|
[Python] 책정보를 가져와 이메일로 보내주기 (0) | 2020.03.07 |
[Python][IFTTT]코로나 현황을 크롤링해 메세지로 전송해보기 (9) | 2020.02.27 |
[python] Tacotron 간단 구현 후기 (2) | 2020.02.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 티처블 머신
- promise반환
- 1254
- 도전
- 1251
- Codeup
- 1253
- 꿈두레
- localstorage
- 크롤링
- 2022.02.05
- 문제풀이
- Anaconda
- JavaScript
- 바닐라 javascript
- SMTP
- 코드설명
- 타이탄의도구들
- 사칙연산
- django
- Python
- pygame
- 1252
- 주석
- 코드업
- 아나콘다
- 바닐라 js
- notion api
- 1255
- 컨트롤타임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함