인프런 커뮤니티 질문&답변

최수빈님의 프로필 이미지
최수빈

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

네이버 지도 상세주소 크롤링

작성

·

1.5K

0

현재 네이버 지도 크롤링 시도 중인데,
클릭하지 않으면 나오지 않는 가게의 상세 주소까지 크롤링하고 싶습니다
 
첫 번째 방법으로는 하나씩 누르면서 크롤링하는 방법과
두 번째 방법으로 개발자도구에 script 에 있는 가게 code를 따서, url에 넣어서 결합한 뒤
새로 코드를 짜서 반복문으로 돌려서 상세 주소를 가져오는 방법을 생각 중입니다
 
제 생각에는 2번이 수월할 것 같아 하려고하는데, 아래와 같이 script라는 것 아래에 json 형태로 저장되어 있는 것 같습니다
다만, 제 실력이 미숙하여 어떤 방식으로 입력해도 잘 못따오는데
가게 코드를 따오기 위해 혹시 참고할 강의나.. 방법이 있을까요!?
 
 
현재 하고 있는 코드는 아래와 같으며, 첫번째 방법도 가능할지 선생님께 조언 구해봅니다
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
import openpyxl
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wb = openpyxl.Workbook()
ws = wb.create_sheet("1페이지")
ws.append(["순위","이름","방영일","프로그램"])

browser.get("https://pcmap.place.naver.com/restaurant/list?query=%EB%A7%9B%EC%9E%88%EB%8A%94%EB%85%80%EC%84%9D%EB%93%A4%20%EB%A7%9B%EC%A7%91&x=127.510209&y=36.5851932&bounds=125.8897257%3B35.304463%3B131.3279581%3B37.8016307&isCurrentLocationSearch=true&tvProgram=false&x=128.4255012&y=36.254532&ts=1644222834366&mapUrl=https%3A%2F%2Fmap.naver.com%2Fv5%2Fsearch%2F%25EB%25A7%259B%25EC%259E%2588%25EB%258A%2594%25EB%2585%2580%25EC%2584%259D%25EB%2593%25A4%2520%25EB%25A7%259B%25EC%25A7%2591%3Fc%3D14194371.5368239%2C4381444.7119141%2C7%2C0%2C0%2C0%2Cdh#")
browser.implicitly_wait(10)

wait = WebDriverWait(browser, 10) #
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='_pcmap_list_scroll_container']")))
element.click()

#로딩된 데이터 개수 확인
lis = browser.find_elements_by_css_selector("li._1EKsQ._12tNp")
before_len = len(lis)

while True:
    #맨 아래로 스크롤 내린다
    browser.find_element_by_css_selector("body").send_keys(Keys.END)
    
    #스크롤 사이 페이지 로딩 시간
    time.sleep(2)
    
    #스크롤 후 로딩된 데이터 개수 확인
    lis = browser.find_elements_by_css_selector("li._1EKsQ._12tNp")
    after_len = len(lis)
    
    #로딩된 데이터 개수가 같다면 반복 멈춤
    if before_len == after_len:
        break
    before_len = after_len

# 데이터 기다리는 시간을 0으로 만들어 줘요. (데이터가 없더라도 빠르게 넘어감) 
browser.implicitly_wait(0)

rank = 1
for li in lis:
    #광고 상품 아닌 것만
    if len(li.find_elements_by_css_selector("svg._2ulu3")) == 0:
        #별점이 있는 가게만 크롤링
        if len(li.find_elements_by_css_selector("span._2FqTn._1mRAM>em")) > 0:
            #가게명
            name = li.find_element_by_css_selector("span.OXiLu").text
            # 프로그램
            program = li.find_element_by_css_selector("div._1fp5H._1tGBC > div").text
            #방영일
            star = li.find_element_by_css_selector("div._3hn9q > div > a").text

            print(rank, name, star, program)
            ws.append([rank, name, star, program])
            rank = rank + 1
            
wb.save("1페이지.xlsx")

답변 1

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

안녕하세요!

 

음... 일단 질문 내용만 봐서는 정확히 무엇을 하고 싶은지 이해가 잘 안됩니다.

지도에 노란색으로 표시된 주소를 가지고 오고 싶다는 말씀 인가요?

그러면 첫번째 방법으로, 클릭한다음 가져오게 만들면 좋을 것 같습니다.

 

최수빈님의 프로필 이미지
최수빈

작성한 질문수

질문하기