네이버 지도 이용, 주소 오류 잡아내는 파이썬 프로그램 (절반의 성공, 시간 과다 소요)

소개

네이버 지도 이용, 주소 오류 잡아내는 파이썬 프로그램 (절반의 성공, 시간 과다 소요)시도하고자 했던 것과 그 이유를 알려주세요.

한국어 이름과 전화번호 목록
  1. 고객 배송 주소를 취합하면, (각 쇼핑몰 시스템에서) 정보가 상이

1) 서울 VS 서울 특별시

2) 중랑구, 강북구 등의 정보가 맨 뒤에 있기도 함

위 주소가 네이버 지도에서 검색이 잘 되면, 통과

3) 검색이 되지 않으면, 이상한 주소로 보고, 1차 수동 체크 --> 고객과 유선상 통화하여 주소 확인

2. 하루 수천 건이 넘어가는 주문 건에서 , 눈으로 이상한 주소 찾는 것은 비효율&휴먼 에러 가능성

(내용을 입력해주세요)

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

Tip: 사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.

파이썬 프로그램을 만들어야 해.

1. 한글 주소를 입력할 gui 가 있어야 해.

2. gui 에 입력된 값에

만약 중복 데이터가 있다면 자동으로 중복데이터는 삭제하여, 1개의 값만 남도록 코드를 수정해줘.

3. gui 입력할 때, 줄바꿈으로 여러 데이터가 동시에 입력될 수 있도록 코드를 수정해줘

4. 입력된 한글 주소를 "gui 에 입력된 값을

"https://map.naver.com/v5/search" 에서 검색해줘.

5. gui 에 입력된 값을 위 링크에서 검색하고, url 의 결과값에 "&isCorrectAnswer=true" 를 포함한 케이스는 제외시켜줘. url 의 결과값에 "&isCorrectAnswer=true""&isCorrectAnswer=true" 이 아닌 검색값만 모아서, 엑셀로 저장하는 파이썬 프로그램이야.

6. 엑셀로 저장하기 전, 저장할 위치를 물어보고, pc 내 사용자가 지정할 수 있도록 해줘.

Tip: 활용 이미지나 캡처 화면을 꼭 남겨주세요.

한국어 텍스트가 적힌 컴퓨터 화면

Tip: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)

import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException

class AddressSearchApp:
    def __init__(self, master):
        self.master = master
        master.title("주소 검색 결과 추출 프로그램")
        
        self.label = tk.Label(master, text="검색할 주소를 입력하세요 (여러 줄 가능):")
        self.label.pack(pady=5)
        
        self.text_input = tk.Text(master, height=10, width=50)
        self.text_input.pack(pady=5)
        
        self.search_button = tk.Button(master, text="검색 및 저장", command=self.search_addresses)
        self.search_button.pack(pady=10)

    def search_addresses(self):
        addresses = self.text_input.get("1.0", tk.END).strip().split("\n")
        unique_addresses = list(dict.fromkeys(addresses))
        
        # 크롬 옵션 설정
        chrome_options = Options()
        chrome_options.add_argument("--headless")  # 헤드리스 모드
        chrome_options.add_argument("--no-sandbox")  # 보안 모드 비활성화
        chrome_options.add_argument("--disable-dev-shm-usage")  # 메모리 사용 최적화
        chrome_options.add_argument("--disable-gpu")  # GPU 비활성화
        chrome_options.add_argument("--window-size=1920x1080")  # 창 크기 설정
        
        # 드라이버 설정
        service = Service(ChromeDriverManager().install())
        driver = webdriver.Chrome(service=service, options=chrome_options)
        
        results = []
        try:
            for address in unique_addresses:
                if not address.strip():
                    continue
                    
                url = f"https://map.naver.com/v5/search/{address}"
                driver.get(url)
                
                try:
                    # iframe 로딩 대기
                    WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((By.ID, "searchIframe"))
                    )
                    driver.switch_to.frame("searchIframe")
                    
                    # 검색 결과에서 아이콘 확인
                    try:
                        WebDriverWait(driver, 5).until(
                            EC.presence_of_element_located((By.CLASS_NAME, "place_bluelink"))
                        )
                        
                        # 아이콘 존재 여부 확인
                        icons = driver.find_elements(By.CSS_SELECTOR, ".icon_place")
                        if not icons:
                            results.append({
                                "주소": address,
                                "상태": "아이콘 없음"
                            })
                    except (TimeoutException, NoSuchElementException):
                        results.append({
                            "주소": address,
                            "상태": "검색 결과 없음"
                        })
                        
                except Exception as e:
                    print(f"Error processing {address}: {str(e)}")
                    
                driver.switch_to.default_content()
                
            if results:
                self.save_to_excel(results)
                messagebox.showinfo("완료", f"아이콘이 없는 {len(results)}개의 주소가 저장되었습니다.")
            else:
                messagebox.showinfo("알림", "아이콘이 없는 주소가 없습니다.")
                
        finally:
            driver.quit()
    
    def save_to_excel(self, data):
        file_path = filedialog.asksaveasfilename(
            defaultextension=".xlsx",
            filetypes=[("Excel files", "*.xlsx")]
        )
        if file_path:
            df = pd.DataFrame(data)
            with pd.ExcelWriter(file_path, engine='openpyxl') as writer:
                df.to_excel(writer, index=False)

if __name__ == "__main__":
    root = tk.Tk()
    app = AddressSearchApp(root)
    root.mainloop()

(내용 입력)

한글 텍스트와 한글 숫자가 포함된 스프레드시트

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

  1. 검색 결과값에 "&isCorrectAnswer=true" 이 포함되어 있어, 이걸 기준으로 했으나, 우리 눈에는 그렇게 보이지만 테스팅 결과 실제 URL 에는 위 내용이 불포함 되어 수차례 검색 시도해도 실패

  2. "해당 업체가 없습니다." 라는 검색 결과를 이미지로 캡쳐하여, 예외값 사용 --> 인식 실패

  3. 아이콘 나오면, 검색 성공, 없으면 예외값 --> 엑셀로 저장해줘 --> 성공

    1. 예외, 이모티콘이 식당, 매장 등 몇 개의 예외적인 것들이 있는데, 이 아이콘도 실패값으로 추출

      한국 호텔의 위치를 ​​보여주는 지도
  4. 헤드리스 모드로, 네이버 검색 결과 페이지들이 표시되지 않도록 설정했음에도 불구하고, 12개 검색하는데 2분 정도 소요됨. 이를 개선하기 전에는 실제로 사용하는 것 불가능

실패담도 괜찮아요. 시행착오나 도움이 필요한 부분이 있나요?

고수분들의 도움이 필요합니다. 시간을 세이브 하기 위해 더 시도할 것들이 어떤게 있을까요?

앞으로의 계획이 있다면 들려주세요.

(내용 입력)

도움 받은 글 (옵션)

참고한 지피터스 글이나 외부 사례를 알려주세요.

(내용 입력)

4
9개의 답글

👉 이 게시글도 읽어보세요