묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
네이버 지도 상세주소 크롤링
현재 네이버 지도 크롤링 시도 중인데, 클릭하지 않으면 나오지 않는 가게의 상세 주소까지 크롤링하고 싶습니다 첫 번째 방법으로는 하나씩 누르면서 크롤링하는 방법과 두 번째 방법으로 개발자도구에 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")
-
해결됨[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
네이버 지도 크롤링 관련 질문
안녕하세요 선생님 만들어주신 크롤링 강의 신청해서 잘 수강하고 있는 한 학생입니다 다름이 아니라, 업무에서 '생생정보통 맛집'에 대한 네이버지도 크롤링이 필요하여 셀레니움으로 메뉴까지 크롤링하는 방법에 도전하던 중 커뮤니티에 json으로 크롤링하는 방법을 올려주신 분이 있어서 활용해보았습니다 다만, json의 경우 '생생정보통맛집 서울'이라는 쿼리로는 제대로 값이 생성이 안되더라구요 아무래도 이게 키워드라기보단 필터라서 그런 것 같긴한데 api 주소로 요청해서 받아오는데 필터를 아무리 검색해도 찾아볼 수가 없더라구요.. 유튜브때처럼 api에 해당하는 필터 값을 알려주는 사이트가 있으면 좋으련만... 고민해봤는데, 위도경도가 현재 컴퓨터 위치를 자동으로 보내서 탐색하기 때문이라고 생각합니다 이런건 혹시 어떤 값으로 바꿔줄 수 있을지.. 아니면 제대로 크롤링 될 수 있도록 해보고싶은데 힌트나.. 방법을 얻을 수 있을까요? 감사합니다 import requests import urllib, openpyxl, time wb = openpyxl.Workbook() ws = wb.active ws.append(['상호명', '주소', '연락처', '메뉴']) with open('C:/program_list.txt', 'r', encoding='utf-8') as tf: keywords = tf.readlines() for keyword in keywords: keyword = keyword.strip().replace('\t', '') print(keyword, '에 나온 맛집입니다.\n\n') url_keyword = urllib.parse.quote(keyword) try: for i in range(1, 20): print('\n', i,'페이지입니다.\n') response = requests.get(f'https://map.naver.com/v5/api/search?caller=pcweb&query={url_keyword}&type=all&page={i}&displayCount=40&lang=ko', headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}).json() numbers = response['result']['place']['list'] for i in range(0,len(numbers)): name = response['result']['place']['list'][i]['name'] address = response['result']['place']['list'][i]['roadAddress'] tel = response['result']['place']['list'][i]['telDisplay'] menuinfo = response['result']['place']['list'][i]['menuInfo'] print(name, address, tel, menuinfo) ws.append([name, address, tel, menuinfo]) time.sleep(1) except: print('끝났습니다.') wb.save(f'{target_word}결과.xlsx') tf.close()