이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

네이버 지도 크롤링

  • 2022.09.25 08:29
  • --------------
반응형

 

 

 

네이버 지도 웹 사이트는 웹 사이트 내부에서 웹 사이트를 보여주는 iframe 태그를 사용하기 기존 작업에서 한 단계 더 처리해줘야 한다.

 

뭔가 대단한 작업을 해야 되는 건 아니고, iframe 태그 내부로 접근 해 주는 부분만 처리하면 된다.

어차피 이 작업도 파이썬 모듈이 다 해 준다. 적절히 사용하는 방법만 기억하자.

 

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

import requests
import time
import pyautogui
import os
import urllib.request
import openpyxl

# 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 불필요한 에러메세지 없애기 
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# 크롬드라이버 매너저를 통해 드라이버를 설치, 서비스를 만들어낸다
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service = service, options=chrome_options)

#---- selenium 기본설정 끝----#

url = "https://map.naver.com/v5/"

driver.implicitly_wait(10)
driver.maximize_window()
driver.get(url)

keyword = pyautogui.prompt("검색어를 입력해주세요.")

wb = openpyxl.Workbook()
ws = wb.create_sheet(keyword)
ws.append(["순위", "이름", "별점", "방문자리뷰", "블로그리뷰"])

# 검색창
search = driver.find_element(By.CSS_SELECTOR, "input.input_search")
search.click()
time.sleep(2)
search.send_keys(f"{keyword}")
time.sleep(2)
search.send_keys(Keys.ENTER)
time.sleep(2)

# iframe 내부로 들어가기
driver.switch_to.frame("searchIframe") # 나오려면 switch_to_default_content

# iframe 내부 클릭해주기 (눌러도 문제 없는 부분)
driver.find_element(By.CSS_SELECTOR, "li.UEzoS.rTjJo.cZnHG").click()

# 로딩된 데이터 개수 확인
lis = driver.find_elements(By.CSS_SELECTOR, "li.UEzoS")
before_len = len(lis)

# 무한스크롤

while True:
    driver.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) # 아무 태그나 선택 body
    
    time.sleep(2)
    lis = driver.find_elements(By.CSS_SELECTOR, "li.UEzoS")
    after_len = len(lis)
    
    if before_len == after_len:
        break
    else:
        before_len = after_len

driver.implicitly_wait(0)

rank = 1

for li in lis:

    # 광고는 제거해줌
    if len(li.find_elements(By.CSS_SELECTOR, "svg.dPXjn")) == 0:        
        
        # 별점이 있는거만 가져옴
        # if len(driver.find_elements(By.CSS_SELECTOR, "span.h69bs.a2RFq > em")) > 0:
        if len(li.find_elements(By.CSS_SELECTOR, "span.h69bs.a2RFq > em")) > 0:
            name = li.find_element(By.CSS_SELECTOR, "span.TYaxT").text
            star = li.find_element(By.CSS_SELECTOR, "span.h69bs.a2RFq > em").text
            
            # 영업 관련 정보가 있으면 
            if len(li.find_elements(By.CSS_SELECTOR, "span.h69bs.KvAhC")) > 0:
                try:
                    visit_review = li.find_element(By.CSS_SELECTOR, "span.h69bs:nth-child(3)").text
                except:
                    visit_review = 0
                try:
                    blog_review = li.find_element(By.CSS_SELECTOR, "span.h69bs:nth-child(4)").text
                except:
                    blog_review = 0
            else:
                try:                
                    visit_review = li.find_element(By.CSS_SELECTOR, "span.h69bs:nth-child(2)").text
                except:
                    visit_review = 0
                try:
                    blog_review = li.find_element(By.CSS_SELECTOR, "span.h69bs:nth-child(3)").text
                except:
                    blog_review = 0

            visit_review = visit_review.replace("방문자리뷰 ", "").replace(",", "")
            blog_review = blog_review.replace("블로그리뷰 ", "").replace(",", "")
            
            print(rank, name, star, visit_review, blog_review)
            ws.append([rank, name, float(star), int(visit_review), int(blog_review)])
            rank += 1

wb.save(f"navermap/{keyword}.xlsx")

 

 

 

switch_to_frame 메서드를 사용해 iframe 내부 요소에 접근할 수 있다.

 

여기서 무한스크롤은 동적으로 로딩되는 리스트의 개수를 비교해서 처리해줬다.

 

나머지는 네이버지도 웹사이트의 구조에 맞춰 진행해줬고, 지난번에 진행한 예시와 크게 다른 점이 없다.

 

 

크롤링에 대한 기본 개념을 잡았으니 개념을 바탕으로 거의 모든 사이트를 크롤링 할 수 있다.

 

이제 경험을 쌓아보자.

 

 

 

 

반응형
저작자표시 (새창열림)

'--------------' 카테고리의 다른 글

[HTML] Layout (1)  (0) 2022.10.25
[HTML] Form (1)  (0) 2022.10.25
크롤링에서 POST 요청이 필요한 경우  (0) 2022.09.24
네이버 금융 크롤링  (2) 2022.09.24
[CSS] CSS 정리 (5)  (0) 2022.09.21

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [HTML] Layout (1)

    [HTML] Layout (1)

    2022.10.25
  • [HTML] Form (1)

    [HTML] Form (1)

    2022.10.25
  • 크롤링에서 POST 요청이 필요한 경우

    크롤링에서 POST 요청이 필요한 경우

    2022.09.24
  • 네이버 금융 크롤링

    네이버 금융 크롤링

    2022.09.24
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (682)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (12)
    • 💬 기록 (8)
    • 📚 공부 (7)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바