강의

멘토링

커뮤니티

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

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

작성한 질문수

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

네이버 지도 맛집 자료 수집하기 오류

작성

·

1.9K

1

안녕하세요 네이버 맛집 Data 수집 크롤링 오류 문의 드립니다.

크롬이 실행되고, 이후 마우스 스크롤까지는 잘 되지만 이후 부터는 지연이되다가

나중에는 오류를 출력하고 있는데... 한번 확인부탁드립니다.ㅠ 정말 잘 진도 나가다 오류로 여려 구글링 해도 잘 안되네요!

■ 실행코드

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

url = "https://map.naver.com/v5/"
browser = webdriver.Chrome("C:\startcoding\chromedriver_win32333333333333\chromedriver.exe")
browser.implicitly_wait(10)
browser.maximize_window()
browser.get(url)

#검색창 입력
search = browser.find_element_by_css_selector("input.input_search")
search.click()
time.sleep(1)
search.send_keys("강남역 맛집")
time.sleep(1)
search.send_keys(Keys.ENTER)
time.sleep(2)

# iframe인 경우 그 안으로 들어가야 한다
browser.switch_to.frame("searchIframe")

# browser.switch_to.default_content() frame 밖으로 나오기

# ifram 안쪽을 한번 클릭하기
browser.find_element_by_css_selector("#_pcmap_list_scroll_container").click()

# 로딩된 데이터 갯수 확인
lis = browser.find_elements_by_css_selector("li._1EKsQ")  # elements 여서 리스트 형태로 [] 로 출력된다
before_len = len(lis)

while True:
    # 맨아래로 스크롤 내린다
    browser.find_element_by_css_selector("body").send_keys(Keys.END)

    # 스크롤 사이 시간
    time.sleep(1)

    # 스크롤 후 로딩 된 리스트 갯수 확인
    lis = browser.find_elements_by_css_selector("li._1EKsQ")
    after_len = len(lis)

    # 로딩된  데이터 개수가 같다면 반복을 멈춤
    if before_len == after_len:
        break
    after_len = before_len

# 데이터 기다리는 시간을 0으로만들어 준다(데이터가 없더라도 빨리 넘아검)
browser.implicitly_wait(0)

for li in lis:
    # 별점이 있는 것만
    if len(li.find_elements_by_css_selector("span._2FqTn._1mRAM > em")) >0:  # elements 이므로 리스트 형태를 감안해서 찾는다 있으면 [em] 1로 없으면 [0] 0임
        # 가게명
        name = li.find_element_by_css_selector("span.OXiLu").text
        # 별점
        star = li.find_element_by_css_selector("span._2FqTn._1mRAM > em").text
       
        print(name, star)
        # 영업시간이 있다면
        if len(li.find_elements_by_css_selector("span._2FqTn._4DbfT")) > 0:  # 영업시간이 있는 것으므로 리스트가 1개가 있다
            # 방문자수
            visit_review = li.find_element_by_css_selector("span._2FqTn:nth-child(3)").text
            # 블로그 리슈
            blog_review = li.find_element_by_css_selector("span._2FqTn:nth-child(4)").text
        # 영업시간이 없다면
        else :
            # 방문자수
            visit_review = li.find_element_by_css_selector("span._2FqTn:nth-child(2)").text
            # 블로그 리슈
            blog_review = li.find_element_by_css_selector("span._2FqTn:nth-child(3)").text

            print(name, star, visit_review, blog_review)

 

■ 오류코드

크롬 버전과 드라이버 버전도 맞춰서 하는데... 계속 스크롤 이후 멈추고 아래와 같은 오류가 생깁니다ㅠ

[2612:14204:0411/103851.435:ERROR:util.cc(126)] Can't create base directory: C:\Program Files\Google\GoogleUpdater

[18704:15884:0411/103951.246:ERROR:gpu_init.cc(446)] Passthrough is not supported, GL is disabled, ANGLE is 

Traceback (most recent call last):

  File "c:\startcoding\네이버지도크롤링\03.데이터수집.py", line 41, in <module>

    lis = browser.find_elements_by_css_selector("li._1EKsQ")

  File "C:\Users\hellonature\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 832, in find_elements_by_css_selector

    return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)

  File "C:\Users\hellonature\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1283, in 

find_elements

    return self.execute(Command.FIND_ELEMENTS, {

  File "C:\Users\hellonature\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 425, in execute

    self.error_handler.check_response(response)

  File "C:\Users\hellonature\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response

    raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.WebDriverException: Message: chrome not reachable

  (Session info: chrome=100.0.4896.75)

Stacktrace:

Backtrace:

        Ordinal0 [0x01058BD3+2395091]

        Ordinal0 [0x00FEACA1+1944737]

        Ordinal0 [0x00EDCED0+839376]

        Ordinal0 [0x00ED1052+790610]

        Ordinal0 [0x00ED1888+792712]

        Ordinal0 [0x00ED3122+799010]

        Ordinal0 [0x00ECCA79+772729]

        Ordinal0 [0x00EDE380+844672]

        Ordinal0 [0x00F34542+1197378]

        Ordinal0 [0x00F249D6+1133014]

        Ordinal0 [0x00EFEF76+978806]

        Ordinal0 [0x00EFFE86+982662]

        GetHandleVerifier [0x0120C912+1719138]

        GetHandleVerifier [0x012BB2CD+2434333]

        GetHandleVerifier [0x010F4001+569937]

        GetHandleVerifier [0x010F3066+565942]

        Ordinal0 [0x00FF265B+1975899]

        Ordinal0 [0x00FF72A8+1995432]

        Ordinal0 [0x00FF7395+1995669]

        Ordinal0 [0x010002F1+2032369]

        BaseThreadInitThunk [0x7572FA29+25]

        RtlGetAppContainerNamedObjectPath [0x775C7A9E+286]

        RtlGetAppContainerNamedObjectPath [0x775C7A6E+238]

 

 

 

 

답변 2

0

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

제가 클래스명 수정했을 때는 잘 되는데,

제 코드로 돌려 보시겠어요??

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

browser = webdriver.Chrome("c:/chromedriver.exe")
browser.get("https://map.naver.com/v5/")
browser.implicitly_wait(10)
browser.maximize_window()

# 검색창 입력
search = browser.find_element_by_css_selector("input.input_search")
search.click()
time.sleep(1)
search.send_keys("강남역 맛집")
time.sleep(1)
search.send_keys(Keys.ENTER)
time.sleep(2)

# iframe 안으로 들어가기
browser.switch_to.frame("searchIframe")

# browser.switch_to_default_content() iframe 밖으로 나오기

# iframe 안쪽을 한번 클릭하기
browser.find_element_by_css_selector("#_pcmap_list_scroll_container").click()

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

while True:
    # 맨 아래로 스크롤 내린다.
    browser.find_element_by_css_selector("body").send_keys(Keys.END)

    # 스크롤 사이 페이지 로딩 시간
    time.sleep(1.5)

    # 스크롤 후 로딩된 데이터 개수 확인
    lis = browser.find_elements_by_css_selector("li._1EKsQ")
    after_len = len(lis)

    # 로딩된 데이터 개수가 같다면 반복 멈춤
    if before_len == after_len:
        break
    before_len = after_len

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

for li in lis:
    # 별점이 있는 것만
    if len(li.find_elements_by_css_selector("span._2FqTn._1mRAM > em")) > 0:
        # 가게명
        name = li.find_element_by_css_selector("span.OXiLu").text
        # 별점
        star = li.find_element_by_css_selector("span._2FqTn._1mRAM > em").text

        # 영업 시간이 있다면
        if len(li.find_elements_by_css_selector("span._2FqTn._4DbfT")) > 0:
            # 방문자 리뷰수
            try:
                visit_review = li.find_element_by_css_selector("span._2FqTn:nth-child(3)").text
            except:
                visit_review = "0"
            # 블로그 리뷰수
            try:
                blog_review = li.find_element_by_css_selector("span._2FqTn:nth-child(4)").text
            except:
                blog_review = "0"
        # 영업 시간이 없다면
        else:
            # 방문자 리뷰수
            try:
                visit_review = li.find_element_by_css_selector("span._2FqTn:nth-child(2)").text
            except:
                visit_review = "0"
            # 블로그 리뷰수
            try:
                blog_review = li.find_element_by_css_selector("span._2FqTn:nth-child(3)").text
            except:
                blog_review = "0"

        print(name, star, visit_review, blog_review)
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

browser = webdriver.Chrome("c:/chromedriver.exe")
browser.get("https://map.naver.com/v5/")
browser.implicitly_wait(10)
browser.maximize_window()

# 검색창 입력
search = browser.find_element_by_css_selector("input.input_search")
search.click()
time.sleep(1)
search.send_keys("강남역 맛집")
time.sleep(1)
search.send_keys(Keys.ENTER)
time.sleep(2)

# iframe 안으로 들어가기
browser.switch_to.frame("searchIframe")

# browser.switch_to_default_content() iframe 밖으로 나오기

# iframe 안쪽을 한번 클릭하기
browser.find_element_by_css_selector("#_pcmap_list_scroll_container").click()

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

while True:
    # 맨 아래로 스크롤 내린다.
    browser.find_element_by_css_selector("body").send_keys(Keys.END)

    # 스크롤 사이 페이지 로딩 시간
    time.sleep(1.5)

    # 스크롤 후 로딩된 데이터 개수 확인
    lis = browser.find_elements_by_css_selector("li._1EKsQ")
    after_len = len(lis)

    # 로딩된 데이터 개수가 같다면 반복 멈춤
    if before_len == after_len:
        break
    before_len = after_len

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

for li in lis:
    # 별점이 있는 것만
    if len(li.find_elements_by_css_selector("span._2FqTn._1mRAM > em")) > 0:
        # 가게명
        name = li.find_element_by_css_selector("span.OXiLu").text
        # 별점
        star = li.find_element_by_css_selector("span._2FqTn._1mRAM > em").text

        # 영업 시간이 있다면
        if len(li.find_elements_by_css_selector("span._2FqTn._4DbfT")) > 0:
            # 방문자 리뷰수
            try:
                visit_review = li.find_element_by_css_selector("span._2FqTn:nth-child(3)").text
            except:
                visit_review = "0"
            # 블로그 리뷰수
            try:
                blog_review = li.find_element_by_css_selector("span._2FqTn:nth-child(4)").text
            except:
                blog_review = "0"
        # 영업 시간이 없다면
        else:
            # 방문자 리뷰수
            try:
                visit_review = li.find_element_by_css_selector("span._2FqTn:nth-child(2)").text
            except:
                visit_review = "0"
            # 블로그 리뷰수
            try:
                blog_review = li.find_element_by_css_selector("span._2FqTn:nth-child(3)").text
            except:
                blog_review = "0"

        print(name, star, visit_review, blog_review)

0

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

음.. 제가 이건 조금 더 깊게 봐야 겠네요.

지금 책 집필 마감일이라.. 시간이 부족합니다. 

조금만 기다려 주세요.

 

우선, 셀레니움 4버전으로 맞춰서 한번 코드를 변경해 보시겠어요? 

제가 영상 올려 놨습니다.

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

작성한 질문수

질문하기