https://www.youtube.com/watch?v=ElOAGrXZicQ
๋๋ ์๋ ์ ๋ ๋์์ผ๋ก ํฌ๋กค๋ง ํ๋ ๊ฒ์ ์ข์ํ๋ค ๊ทธ๋์ 2๋ ์ ์๋ ์ธ์คํ๊ทธ๋จ์ ์ ๋ ๋์์ ํตํด์
ํ๋ก์ฐ ๋ด์ ๋ง๋ค์๊ณ 3000๋ช ๊น์ง ํ๋ก์ฐ๋ฅผ ๋๋ ธ์๋ค.
๊ทธ ํ๋ก๋ ์ ๋ ๋์์ ๋ค์ ์ฌ์ฉํ ์ผ์ ์๋ค๊ณ ์๊ฐํ๋๋ฐ
์ด๋ฒ์ ๊ฐ์ ๋ํ๊ต ํ์๋ค๊ณผ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๊ฒ ๋๋ฉด์
๋ค์ด๋ฒ ์ง๋์ ์๋ ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ง์ ธ๋ณด๊ฒ ๋์๋ค.
๋ง์ฝ ์ง๊ธ ์ด ๊ธ์ ๋ณด๊ณ ์๋ ๋น์ ์ด ์ ๋ ๋์ ์ด๋ณด๋ผ๋ฉด ์์ฃผ ์ข๋ค.
๋ด๊ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฒ์๋ถํฐ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ์ค๊ธ ์ฝ์ค๊น์ง ์ฌ์ฉํ ์ ์์์ง ์์ฃผ ์ฝ๊ฒ ์ค๋ช ์ ํด์ฃผ๊ฒ ๋ค
์ผ๋จ ๋ค์ด๋ฒ ์ง๋๋ฅผ ์ผ๋๊ณ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋ง ํ ์ง ๋ฏธ๋ฆฌ ์๊ฐํ๊ณ ์ ๋ฆฌ๋ฅผ ํด์ผ ํ๋ค.
๋ ๊ฐ์๊ฒฝ์ฐ์๋ ์ฃผ๋ก ์บก์ณ๋ฅผ ํด๋๊ณ ๋ฐ์ ์ฒ๋ผ ํ๋์ ๋ณด๊ธฐ ์ฝ๋๋ก ๊ทธ๋ ค๋๋ ์์ ์ ํ๋ค.
1. ๊ฐ๊ฒ ์ด๋ฆ
2. ์นดํ ๊ณ ๋ฆฌ
3. ํ์
4. ๋ฐฉ๋ฌธ์ ๋ฆฌ๋ทฐ / ๋ธ๋ก๊ทธ ๋ฆฌ๋ทฐ
5. ์์ ์๊ฐ
6. ์์ ์๊ฐ
๋๋ ์ด๋ ๊ฒ ๊ฐ์ ธ์ค๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๋ด๊ฐ ๋ง๋๋ ํ๋ก์ ํธ๊ฐ ๋ํ๊ต ๊ทผ์ฒ๋ด์ ์๋ ์์์ ์ ๋๋คํ๊ฒ ์ถ์ฒํด์ ๊ฐ๋ตํ๊ฒ ๋ณด์ฌ์ฃผ๋ ์ฑ์ด๊ธฐ์ ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ถ๋ ธ๋ค.
์! ์ด์ ๊ฐ์ ธ์์ผํ๋ ๋ฐ์ดํฐ๋ ์์์ผ๋ ์ด์ ํฌ๋กค๋ง์ ์์ํด๋ณด์!
๊ทผ๋ฐ ๋ค์ด๋ฒ ์ง๋์ ์ฌ๋ฐ๋์ ์ด ๊ฐ๊ฒ ๋ชฉ๋ก์ด ๋์ค๋ List ๋ถ๋ถ์ด iframe์ผ๋ก ๋ง๋ค์ด์ ธ ์๋ค.
๊ทธ๋์ ๊ทธ๋ฅ xpath๋ก ๋ ๋ค ๋๋ ค๋ฐ์ผ๋ฉด noSuchElement ์ค๋ฅ๊ฐ ์์ํ๊ฒ ๋์จ๋ค.
์ค์? ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํ์ง? ๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค๋ฉด ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค
๊ทธ๋ฅ driver๊ฐ ๊ฐ๋ฆฌํค๋ frame์ ์ค์์น ํ๋ฉด ๋์ด๋ค.
def switch_left():
############## iframe์ผ๋ก ์ผ์ชฝ ํฌ์ปค์ค ๋ง์ถ๊ธฐ ##############
driver.switch_to.parent_frame()
iframe = driver.find_element(By.XPATH,'//*[@id="searchIframe"]')
driver.switch_to.frame(iframe)
def switch_right():
############## iframe์ผ๋ก ์ค๋ฅธ์ชฝ ํฌ์ปค์ค ๋ง์ถ๊ธฐ ##############
driver.switch_to.parent_frame()
iframe = driver.find_element(By.XPATH,'//*[@id="entryIframe"]')
driver.switch_to.frame(iframe)
๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ค์์นญํ ์ผ์ด ๋ง์ ๊ฒ ๊ฐ์์ ์ด๋ ๊ฒ 2๊ฐ์ ํจ์๋ฅผ ๋ง๋ค์ด์ ๋ฐ๋ก๋ฐ๋ก ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด ๋จ๋ค.
์ 2๊ฐ๊ฐ ํ์ํ๋๋ฉด ๊ฐ๊ฒ๋ฅผ ๋๋ ์๋ ์ค๋ฅธ์ชฝ์ ๊ฐ๊ฒ์ ๋ํ ์์ธ ์ ๋ณด๊ฐ ๋์ค๋๋ฐ ์ด ๋ถ๋ถ๋ iframe์ผ๋ก ๊ฐ์ธ์ ธ์๊ธฐ์
ํฌ๋กค๋ง์ ํ ๋ ๋๊ฐ๋ฅผ ์ ํํด ๊ฐ๋ฉด์ ํฌ๋กค๋ง์ ํด์ผ ํ๋ค.
์ค์ผ์ด! ์ผ๋จ ํฌ๋กค๋งํ๋ฉด์ ์์๋ฌ์ผํ ์ฃผ์์ฌํญ์ ํ์ธํ์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ํํค์ณ๋ณด์!
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
import random
import re
from selenium import webdriver
import sys
options = webdriver.ChromeOptions()
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')
options.add_argument('window-size=1380,900')
driver = webdriver.Chrome(options=options)
# ๋๊ธฐ ์๊ฐ
driver.implicitly_wait(time_to_wait=3)
# ๋ฐ๋ณต ์ข
๋ฃ ์กฐ๊ฑด
loop = True
URL = 'https://map.naver.com/p/search/%EC%9D%B8%ED%95%98%EB%8C%80%20%EC%9D%8C%EC%8B%9D%EC%A0%90?c=15.23,0,0,0,dh'
driver.get(url=URL)
while(True):
switch_left()
# ํ์ด์ง ์ซ์๋ฅผ ์ด๊ธฐ์ ์ฒดํฌ [ True / False ]
# ์ด๊ฑด ํ์ด์ง ๋์ด๊ฐ๋๋ง๋ค ๊ณ์ ํ์ธํด์ค์ผ ํจ (ํ์ด์ง ์๋ก ๋ก๋ ๋ ๋๋ง๋ค ๋ฒํผ ์ํ ๊ฐ์ด ๋ฐ๋)
next_page = driver.find_element(By.XPATH,'//*[@id="app-root"]/div/div[3]/div[2]/a[7]').get_attribute('aria-disabled')
if(next_page == 'true'):
break
############## ๋งจ ๋ฐ๊น์ง ์คํฌ๋กค ##############
scrollable_element = driver.find_element(By.CLASS_NAME, "Ryr1F")
last_height = driver.execute_script("return arguments[0].scrollHeight", scrollable_element)
while True:
# ์์ ๋ด์์ ์๋๋ก 600px ์คํฌ๋กค
driver.execute_script("arguments[0].scrollTop += 600;", scrollable_element)
# ํ์ด์ง ๋ก๋๋ฅผ ๊ธฐ๋ค๋ฆผ
sleep(1) # ๋์ ์ฝํ
์ธ ๋ก๋ ์๊ฐ์ ๋ฐ๋ผ ์กฐ์
# ์ ๋์ด ๊ณ์ฐ
new_height = driver.execute_script("return arguments[0].scrollHeight", scrollable_element)
# ์คํฌ๋กค์ด ๋ ์ด์ ๋์ด๋์ง ์์ผ๋ฉด ๋ฃจํ ์ข
๋ฃ
if new_height == last_height:
break
last_height = new_height
############## ํ์ฌ page number ๊ฐ์ ธ์ค๊ธฐ - 1 ํ์ด์ง ##############
page_no = driver.find_element(By.XPATH,'//a[contains(@class, "mBN2s qxokY")]').text
# ํ์ฌ ํ์ด์ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๊ฐ๊ฒ ์กฐํ
# ์ฒซํ์ด์ง ๊ด๊ณ 2๊ฐ ๋๋ฌธ์ ์ฒซํ์ด์ง๋ ์ 2๊ฐ๋ฅผ ๋นผ์ผํจ
if(page_no == '1'):
elemets = driver.find_elements(By.XPATH,'//*[@id="_pcmap_list_scroll_container"]//li')[2:]
else:
elemets = driver.find_elements(By.XPATH,'//*[@id="_pcmap_list_scroll_container"]//li')
print('ํ์ฌ ' + '\033[95m' + str(page_no) + '\033[0m' + ' ํ์ด์ง / '+ '์ด ' + '\033[95m' + str(len(elemets)) + '\033[0m' + '๊ฐ์ ๊ฐ๊ฒ๋ฅผ ์ฐพ์์ต๋๋ค.\n')
for index, e in enumerate(elemets, start=1):
final_element = e.find_element(By.CLASS_NAME,'CHC5F').find_element(By.XPATH, ".//a/div/div/span")
print(str(index) + ". " + final_element.text)
print(Colors.RED + "-"*50 + Colors.RESET)
switch_left()
sleep(2)
for index, e in enumerate(elemets, start=1):
store_name = '' # ๊ฐ๊ฒ ์ด๋ฆ
category = '' # ์นดํ
๊ณ ๋ฆฌ
new_open = '' # ์๋ก ์คํ
rating = 0.0 # ํ์
visited_review = 0 # ๋ฐฉ๋ฌธ์ ๋ฆฌ๋ทฐ
blog_review = 0 # ๋ธ๋ก๊ทธ ๋ฆฌ๋ทฐ
store_id = '' # ๊ฐ๊ฒ ๊ณ ์ ๋ฒํธ
address = '' # ๊ฐ๊ฒ ์ฃผ์
business_hours = [] # ์์
์๊ฐ
phone_num = '' # ์ ํ๋ฒํธ
switch_left()
# ์์๋๋ก ๊ฐ์ ํ๋์ฉ ํด๋ฆญ
e.find_element(By.CLASS_NAME,'CHC5F').find_element(By.XPATH, ".//a/div/div/span").click()
sleep(2)
switch_right()
################### ์ฌ๊ธฐ๋ถํฐ ํฌ๋กค๋ง ์์ ##################
title = driver.find_element(By.XPATH,'//div[@class="zD5Nm undefined"]')
store_info = title.find_elements(By.XPATH,'//div[@class="YouOG DZucB"]/div/span')
# ๊ฐ๊ฒ ์ด๋ฆ
store_name = title.find_element(By.XPATH,'.//div[1]/div[1]/span[1]').text
# ์นดํ
๊ณ ๋ฆฌ
category = title.find_element(By.XPATH,'.//div[1]/div[1]/span[2]').text
if(len(store_info) > 2):
# ์๋ก ์คํ
new_open = title.find_element(By.XPATH,'.//div[1]/div[1]/span[3]').text
###############################
review = title.find_elements(By.XPATH,'.//div[2]/span')
# ์ธ๋ฑ์ค ๋ณ์ ๊ฐ
_index = 1
# ๋ฆฌ๋ทฐ ROW์ ๊ฐฏ์๊ฐ 3๊ฐ ์ด์์ผ ๊ฒฝ์ฐ [๋ณ์ , ๋ฐฉ๋ฌธ์ ๋ฆฌ๋ทฐ, ๋ธ๋ก๊ทธ ๋ฆฌ๋ทฐ]
if len(review) > 2:
rating_xpath = f'.//div[2]/span[{_index}]'
rating_element = title.find_element(By.XPATH, rating_xpath)
rating = rating_element.text.replace("\n", " ")
_index += 1
try:
# ๋ฐฉ๋ฌธ์ ๋ฆฌ๋ทฐ
visited_review = title.find_element(By.XPATH,f'.//div[2]/span[{_index}]/a').text
# ์ธ๋ฑ์ค๋ฅผ ๋ค์ +1 ์ฆ๊ฐ ์ํด
_index += 1
# ๋ธ๋ก๊ทธ ๋ฆฌ๋ทฐ
blog_review = title.find_element(By.XPATH,f'.//div[2]/span[{_index}]/a').text
except:
print(Colors.RED + '------------ ๋ฆฌ๋ทฐ ๋ถ๋ถ ์ค๋ฅ ------------' + Colors.RESET)
# ๊ฐ๊ฒ id
store_id = driver.find_element(By.XPATH,'//div[@class="flicking-camera"]/a').get_attribute('href').split('/')[4]
# ๊ฐ๊ฒ ์ฃผ์
address = driver.find_element(By.XPATH,'//span[@class="LDgIH"]').text
try:
driver.find_element(By.XPATH,'//div[@class="y6tNq"]//span').click()
# ์์
์๊ฐ ๋๋ณด๊ธฐ ๋ฒํผ์ ๋๋ฅด๊ณ 2์ด ๋ฐ์์๊ฐ ๊ธฐ๋ค๋ฆผ
sleep(2)
parent_element = driver.find_element(By.XPATH,'//a[@class="gKP9i RMgN0"]')
child_elements = parent_element.find_elements(By.XPATH, './*[@class="w9QyJ" or @class="w9QyJ undefined"]')
for child in child_elements:
# ๊ฐ ์์ ์์ ๋ด์์ ํด๋์ค๊ฐ 'A_cdD'์ธ span ์์ ์ฐพ๊ธฐ
span_elements = child.find_elements(By.XPATH, './/span[@class="A_cdD"]')
# ์ฐพ์ span ์์๋ค์ ํ
์คํธ ์ถ๋ ฅ
for span in span_elements:
business_hours.append(span)
# ๊ฐ๊ฒ ์ ํ๋ฒํธ
phone_num = driver.find_element(By.XPATH,'//span[@class="xlx7Q"]').text
except:
print(print(Colors.RED + '------------ ์์
์๊ฐ / ์ ํ๋ฒํธ ๋ถ๋ถ ์ค๋ฅ ------------' + Colors.RESET))
print(Colors.BLUE + f'{index}. ' + str(store_name) + Colors.RESET + ' · ' + str(category) + Colors.RED + str(new_open) + Colors.RESET)
print('ํ์ ' + Colors.RED + str(rating) + Colors.RESET + ' / ' + visited_review + ' · ' + blog_review)
print(f'๊ฐ๊ฒ ๊ณ ์ ๋ฒํธ -> {store_id}')
print('๊ฐ๊ฒ ์ฃผ์ ' + Colors.GREEN + str(address) + Colors.RESET)
print(Colors.CYAN + '๊ฐ๊ฒ ์์
์๊ฐ' + Colors.RESET)
for i in business_hours:
print(i.text)
print('')
print('๊ฐ๊ฒ ๋ฒํธ ' + Colors.GREEN + phone_num + Colors.RESET)
print(Colors.MAGENTA + "-"*50 + Colors.RESET)
switch_left()
# ํ์ด์ง ๋ค์ ๋ฒํผ์ด ํ์ฑํ ์ํ์ผ ๊ฒฝ์ฐ ๊ณ์ ์งํ
if(next_page == 'false'):
driver.find_element(By.XPATH,'//*[@id="app-root"]/div/div[3]/div[2]/a[7]').click()
# ์๋ ๊ฒฝ์ฐ ๋ฃจํ ์ ์ง
else:
loop = False
์ ์ฒด์ฝ๋๋ง ๋ณด๋ฉด ์ ํ ์ดํด๊ฐ ์๋ ๊ฒ ์ด๋ค. ์ฌ์ค ๋ด๊ฐ ๋ด๋ ์ดํด๊ฐ ์ ์๋๋ค.
ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์์ด ๋๋์ง ์ค๋ช ํด ๋ณด๊ฒ ๋ค.
1. ๋ค์ด๋ฒ ์ง๋ URL ์ ์
2. ํ์ฌ ํ์ด์ง ๋ชฉ๋ก์ ์๋ ๋ชจ๋ ๊ฐ๊ฒ ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
3. ํ๋์ฉ ๊ฐ๊ฒ๋ฅผ ํด๋ฆญํ์ฌ ์์ธ์ ๋ณด ํ์ด์ง์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋ง ํ๋ค.
4. ํ์ฌ ํ์ด์ง์ ์๋ ๋ชจ๋ ๋ชฉ๋ก์ ํฌ๋กค๋งํ๋ค๋ฉด ๋ค์ ํ์ด์ง๋ก ๋์ด๊ฐ์ ๋ค์ ๋ฐ๋ณตํ๋ค.
5. ๋ชจ๋ ๊ณผ์ ์ด ๋๋๋ฉด ์ข ๋ฃ!
ํฌ๊ฒ ๋ณด์๋ฉด ์ด๋ ๊ฒ ๊ฐ๋ตํ๊ฒ ์์ฝ์ด ๊ฐ๋ฅํ๋ค.
์...! ๊ทธ๋ ๊ตฐ ๋ฐ๋ก ์ฝ๋๋ก ํ๋์ฉ ์ค๋ช ์ ํด๋ณด์!
URL = 'https://map.naver.com/p/search/%EC%9D%B8%ED%95%98%EB%8C%80%20%EC%9D%8C%EC%8B%9D%EC%A0%90?c=15.23,0,0,0,dh'
driver.get(url=URL)
๋ค์ด๋ฒ ์ง๋ URL์ ์ด์ด์ ํฌ๋กฌ๋๋ผ์ด๋ธ๋ฅผ ํตํด ์ ์ด๊ฐ ๊ฐ๋ฅํ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ๋ค
switch_left()
# ํ์ด์ง ์ซ์๋ฅผ ์ด๊ธฐ์ ์ฒดํฌ [ True / False ]
# ์ด๊ฑด ํ์ด์ง ๋์ด๊ฐ๋๋ง๋ค ๊ณ์ ํ์ธํด์ค์ผ ํจ (ํ์ด์ง ์๋ก ๋ก๋ ๋ ๋๋ง๋ค ๋ฒํผ ์ํ ๊ฐ์ด ๋ฐ๋)
next_page = driver.find_element(By.XPATH,'//*[@id="app-root"]/div/div[3]/div[2]/a[7]').get_attribute('aria-disabled')
if(next_page == 'true'):
break
๊ทธ ๋ค์์ผ๋ก๋ ์ด๋ฐ์ ์ค๋ช ํ๋ฏ์ด ์ํ๋ iframe์ผ๋ก ํฌ์ปค์ฑ์ ๋ง์ถ ํ
ํ์ฌ ํ์ด์ง์ ๊ฐ์ ๊ฐ์ ธ์์ผ ํ๋ค. ์ด ๋ถ๋ถ์ ๋ฌด์์ด๋๋ฉด...
๋ค์ด๋ฒ ์ง๋์ ๋ฆฌ์คํธ ๋ชฉ๋ก์ ํ์ด์ง ๋ฒํธ์ด๋ค.
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ธฐ๋๋ฌธ์ ํ์ฌ ํ์ด์ง ๋ฒํธ๋ฅผ ๋ค์์ผ๋ก ๊ณ์ ๋๊ธฐ๋ฉด์ ํฌ๋กค๋ง์ ํด์ผ ํ๋ค.
############## ๋งจ ๋ฐ๊น์ง ์คํฌ๋กค ##############
scrollable_element = driver.find_element(By.CLASS_NAME, "Ryr1F")
last_height = driver.execute_script("return arguments[0].scrollHeight", scrollable_element)
while True:
# ์์ ๋ด์์ ์๋๋ก 600px ์คํฌ๋กค
driver.execute_script("arguments[0].scrollTop += 600;", scrollable_element)
# ํ์ด์ง ๋ก๋๋ฅผ ๊ธฐ๋ค๋ฆผ
sleep(1) # ๋์ ์ฝํ
์ธ ๋ก๋ ์๊ฐ์ ๋ฐ๋ผ ์กฐ์
# ์ ๋์ด ๊ณ์ฐ
new_height = driver.execute_script("return arguments[0].scrollHeight", scrollable_element)
# ์คํฌ๋กค์ด ๋ ์ด์ ๋์ด๋์ง ์์ผ๋ฉด ๋ฃจํ ์ข
๋ฃ
if new_height == last_height:
break
last_height = new_height
๊ทธ ๋ค์์ผ๋ก ์งํํ ๊ณณ์ ๋ฐ๋ก ์คํฌ๋กค ๋ถ๋ถ์ด๋ค.
์คํฌ๋กค...? ์ด๋๋ฅผ ์คํฌ๋กค ํ๋ค๋๊ฑฐ์ง ์๊ฐ ํ ์ ์๋๋ฐ
๊ทผ๋ฐ ์กฐ๊ธ ๊น๋ค๋ก์ด ์ ์ด ํน์ ์ธ์คํ๊ทธ๋จ ํฌ๋กค๋ง ํด๋ณธ์ฌ๋์ ์์ง ๋ชจ๋ฅด๊ฒ ๋๋ฐ
lazy-loading์ด๋ผ๊ณ ํด์ ์ค์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ํ ๋๋ง๋ค ๊ทธ๋ ๋ง๋ค ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์
ํ๋ฉด์ ๋์์ฃผ๋ ๋ฐฉ์์ด๋ผ ์กฐ๊ธ ๊น๋ค๋กญ๋ค.
๊ทธ๋์ 600px๋งํผ ์คํฌ๋กค์ ์ผ๋จ ๋ด๋ฆฌ๊ณ ์ด๊ธฐ ๋์ด / ์ ๋์ด๋ฅผ ๊ณ์ฐ ํ์ฌ ๋น๊ตํ๋ฉด์
๋ง์ง๋ง๊น์ง ๋๋ฌ ํ์๋ ์คํฌ๋กค์ด ์ข ๋ฃ๋๋๋ก ๊ตฌํํ์๋ค. (์์ธํ ๋ถ๋ถ์ ์ฝ๋ ์ฐธ๊ณ )
์... ๊ทธ๋์ ์ผ๋จ ์คํฌ๋กค์ด ์ ์์ ์ผ๋ก ๋๊น์ง ์๋ฃ๊ฐ ๋๋ฉด
ํ์ฌ ํ์ด์ง์ ์๋ ๋ชจ๋ ๊ฐ๊ฒ๋ค์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ถ ๋ถ๋ฌ์ฌ ์ ๊ฐ ์๊ฒ ๋๋ค. (๋ง์ธ~)
์ ์ด์ ๊ทธ ๋ค์์ผ๋ก๋
############## ํ์ฌ page number ๊ฐ์ ธ์ค๊ธฐ - 1 ํ์ด์ง ##############=
page_no = driver.find_element(By.XPATH,'//a[contains(@class, "mBN2s qxokY")]').text
# ํ์ฌ ํ์ด์ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๊ฐ๊ฒ ์กฐํ
# ์ฒซํ์ด์ง ๊ด๊ณ 2๊ฐ ๋๋ฌธ์ ์ฒซํ์ด์ง๋ ์ 2๊ฐ๋ฅผ ๋นผ์ผํจ
if(page_no == '1'):
elemets = driver.find_elements(By.XPATH,'//*[@id="_pcmap_list_scroll_container"]//li')[2:]
else:
elemets = driver.find_elements(By.XPATH,'//*[@id="_pcmap_list_scroll_container"]//li')
print('ํ์ฌ ' + '\033[95m' + str(page_no) + '\033[0m' + ' ํ์ด์ง / '+ '์ด ' + '\033[95m' + str(len(elemets)) + '\033[0m' + '๊ฐ์ ๊ฐ๊ฒ๋ฅผ ์ฐพ์์ต๋๋ค.\n')
for index, e in enumerate(elemets, start=1):
final_element = e.find_element(By.CLASS_NAME,'CHC5F').find_element(By.XPATH, ".//a/div/div/span")
print(str(index) + ". " + final_element.text)
print(Colors.RED + "-"*50 + Colors.RESET)
switch_left()
sleep(2)
๋์ถฉ ์ด๋ฐ์์ผ๋ก ๋ชจ๋ ๋ฆฌ์คํธ์ ๋ํ ๊ฐ๊ฒ ์ด๋ฆ์ ์ญ ๊ฐ์ ธ์์ ํ๋์ ๋ณด๊ธฐ ์ข๋๋ก ๋ง๋ค์๋ค.
์ด์ ๊ทธ ๋ค์์ผ๋ก๋ ๋ถ๋ฌ์จ ๋ชจ๋ ๋ฆฌ์คํธ๋ฅผ ๊ฐ ํ๋์ฉ ํด๋ฆญํ๋ฉด์ ์์ธ ํ์ด์ง์์ ๋ด๊ฐ ์ํ๋ ๊ฐ๋ง ๊ฐ์ ธ์ค๋ฉด ๋์ด๋ค.
for index, e in enumerate(elemets, start=1):
...
...
# ์์๋๋ก ๊ฐ์ ํ๋์ฉ ํด๋ฆญ
e.find_element(By.CLASS_NAME,'CHC5F').find_element(By.XPATH, ".//a/div/div/span").click()
# ํ๋ ์ ์ ํ (์๋ํ๋ฉด ์ค๋ฅธ์ชฝ์ ์์ธ์ ๋ณด ์ฐฝ์ด ์๋ก ์๊ฒผ๊ธฐ ๋๋ฌธ)
switch_right()
...
...
# ๊ฒฐ๊ณผ๋ฌผ ์ถ๋ ฅ
print(Colors.BLUE + f'{index}. ' + str(store_name) + Colors.RESET + ' · ' + str(category) + Colors.RED + str(new_open) + Colors.RESET)
print('ํ์ ' + Colors.RED + str(rating) + Colors.RESET + ' / ' + visited_review + ' · ' + blog_review)
print(f'๊ฐ๊ฒ ๊ณ ์ ๋ฒํธ -> {store_id}')
print('๊ฐ๊ฒ ์ฃผ์ ' + Colors.GREEN + str(address) + Colors.RESET)
print(Colors.CYAN + '๊ฐ๊ฒ ์์
์๊ฐ' + Colors.RESET)
for i in business_hours:
print(i.text)
print('')
print('๊ฐ๊ฒ ๋ฒํธ ' + Colors.GREEN + phone_num + Colors.RESET)
print(Colors.MAGENTA + "-"*50 + Colors.RESET)
...
...
์ฝ๋์ ๋๋จธ์ง ๋ถ๋ถ์ ๋์ถฉ ์ฃผ์๋ง ์ฝ์ด๋ ์ดํด๊ฐ ๋๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
์ค์ํ ๋ถ๋ถํ ๊ฐ์ถ๋ ค์ ์ ์ด๋ดค๋ค.
์ฌ์ค ์ด๋ ค์ด ๋ถ๋ถ์ ์๋๋ฐ ์ ๋ ๋์์ 80% ์ค๋ฅ๋
1. sleep ๊ฐ์ ์ ์ ํ ์ฃผ์ง ์์์ ๊ฒฝ์ฐ -> ํ์ด์ง๊ฐ ์ ๋๋ก ๋ก๋๊ฐ ์๋๋๋ฐ ์ฐพ์ผ๋ผ๊ณ ํ๋ ์ค๋ฅ ๋ฑ์...
2. find_element ๋ฅผ ์ ๋๋ก ํ์ง ๋ชปํ ๊ฒฝ์ฐ (์๋ element๋ฅผ ์ฐพ๋๋ก ์์ผฐ์๋)
3. ๋ง์ง๋ง์ผ๋ก๋ ์์ธ์ฒ๋ฆฌ๊ฐ ์ ๋๋ก ๋์ง ์์์ ๊ฒฝ์ฐ์ด๋ค.
์ฌ์ค ์ฐ๋ฆฌ๋ API๋ฅผ ์ ๊ณต๋ฐ๋ ๊ฒ์ด ์๋๋ผ ์ฐ๋ฆฌ๊ฐ ์ผ์ผํ ๋ฐ๊ตดํด ๋๊ฐ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋ชจ๋ ์ค๋ฅ๋ฅผ ์ ๋ถ ์๊ฐํ๋ฉด์ ์ฝ๋ฉํ ์ ๋ ์๋ค.
๊ทธ๋์ ์ ๋ ๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ try except ๊ตฌ๋ฌธ๋ง ์ ์จ๋ ์ค๋ฅ๋ ์ด๋์ ๋ ํด๊ฒฐ ํ ์ ์๋ค.
(์ข์ ๋ฐฉ๋ฒ์ ์๋....)
๋ฌดํผ ์ด๋ ๊ฒ ๋๋ ์ ๋ ๋์์ ํตํด ๋ค์ด๋ฒ ์ง๋ ์๋น์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๊ณ
์ ์์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ์๋ค.