네이버 지도 크롤링

LeeEunJae·2022년 10월 22일
0

개인 프로젝트 때문에 네이버 지도 크롤링을 공부했다.
pc버전 네이버 지도는 크롤링이 까다로워서 모바일 네이버 지도를 선택했다.

무한 스크롤

def infinite_loop(driver):
    # 최초 페이지 스크롤 설정
    # 스크롤 시키지 않았을 때의 전체 높이
    last_page_height = driver.execute_script("return document.documentElement.scrollHeight")

    while True:
        # 윈도우 창을 0에서 위에서 설정한 전체 높이로 이동
        driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
        time.sleep(1.0)
        # 스크롤 다운한 만큼의 높이를 신규 높이로 설정 
        new_page_height = driver.execute_script("return document.documentElement.scrollHeight")
        # 직전 페이지 높이와 신규 페이지 높이 비교
        if new_page_height == last_page_height:
            time.sleep(1.0)
            # 신규 페이지 높이가 이전과 동일하면, while문 break
            if new_page_height == driver.execute_script("return document.documentElement.scrollHeight"):
                break
        else:
            last_page_height = new_page_height

모든 정보를 가져오기 위해서 스크롤이 필요하다

from audioop import add
from selenium import webdriver
from selenium.webdriver.common.by import By
import string
import time

url_list = []
data_id = []
datas = []

def naverMapCrawling(search):
    driver = webdriver.Chrome("./chromedriver.exe") #selenium 사용에 필요한 chromedriver.exe 파일 경로 지정

    driver.get(f"https://m.map.naver.com/search2/search.naver?query={search}") 
    driver.implicitly_wait(3) # 로딩이 끝날 때 까지 10초까지는 기다림

    infinite_loop(driver)

    items = driver.find_elements(By.CSS_SELECTOR, '._item ')

    for item in items:
        title = item.get_attribute('data-title')
        address = item.find_element(By.CSS_SELECTOR,'.item_address ').text.replace('주소보기\n', '')
        longtitude = float(item.get_attribute('data-longitude'))
        latitude = float(item.get_attribute('data-latitude'))
        tel = item.get_attribute('data-tel')
        id = int(item.get_attribute('data-id'))
        
        for character in string.punctuation:
            title = title.replace(character, '') # 특수기호 제거(파이어베이스에 경로로 저장하기 위해서)

        datas.append({
            "id" : id,
            "title" : title,
            "addr" : address,
            "longtitude" : longtitude,
            "latitude" : latitude,
            "tel" : tel
            })

        # url_list.append(item.find_element(By.CSS_SELECTOR, '.item_common > a').get_attribute('data-url'))
        data_id.append(id)

    print(datas)

    for id in data_id:
        driver.get(f'https://m.place.naver.com/place/{id}/photo')
        # 세부정보 가져오는 작업 하면 될듯
        time.sleep(1)

        try:
            image = driver.find_element(By.CSS_SELECTOR, 'div.wzrbN > a > img').get_attribute('src')
            print(image)
        except:
            image = ""
            print("사진 없음")

        for data in datas:
            if data["id"] == id:
                data["img_url"] = image
                
                break

크롤링을 통해 가져온 데이터는 datas 라는 리스트에 딕셔너리 형태로 저장된다.

search = input("검색어를 입력해주세요 >> ")
naverMapCrawling(search)

사용방법은 간단하다. 검색어를 입력하고 함수인자로 전달한다.

profile
매일 조금씩이라도 성장하자

0개의 댓글