div > form > ul > li:nth-child(3) > a search_selector = '#search > div > form > ul > li:nth-child(3) > a' search = driver.find_element(By.CSS_SELECTOR, search_selector) search.click() time.sleep(3) driver.execute_script"> div > form > ul > li:nth-child(3) > a search_selector = '#search > div > form > ul > li:nth-child(3) > a' search = driver.find_element(By.CSS_SELECTOR, search_selector) search.click() time.sleep(3) driver.execute_script"> div > form > ul > li:nth-child(3) > a search_selector = '#search > div > form > ul > li:nth-child(3) > a' search = driver.find_element(By.CSS_SELECTOR, search_selector) search.click() time.sleep(3) driver.execute_script">
import selenium
import time
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # enter 치는 명령어
import csv 
import pandas as pd 
from selenium.webdriver.common.by import By

# url입력
driver = webdriver.Chrome()
url = "<https://www.yogiyo.co.kr/>" # 사이트 입력
driver.get(url) # 사이트 오픈
driver.maximize_window() # 전체화면
time.sleep(2) # 2초 지연

xpath = '''//*[@id="search"]/div/form/input'''  # 검색창
element = driver.find_element(By.XPATH, xpath)
element.clear()
time.sleep(2)

# 검색창 입력
value = "서울특별시 광진구 능동로 209"
element.send_keys(value)
time.sleep(2)

# 조회버튼 클릭
search_xpath = '''//*[@id="button_search_address"]/button[2]'''
driver.find_element(By.XPATH, search_xpath).click()

time.sleep(3)

# 검색 콤보상자 선택
# 선택 : #search > div > form > ul > li:nth-child(3) > a
search_selector = '#search > div > form > ul > li:nth-child(3) > a'
search = driver.find_element(By.CSS_SELECTOR, search_selector)
search.click()
time.sleep(3)

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") # 스크롤을 가장 아래로 내린다
time.sleep(2)
pre_height = driver.execute_script("return document.body.scrollHeight") # 현재 스크롤 위치 저장

page=0
while True :
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")  # 스크롤을 가장 아래로 내린다
    cur_height = driver.execute_script("return document.body.scrollHeight")  # 현재 스크롤을 저장한다.
    page+=1
    if page>=40 :  #페이지 40쪽까지 설정
        break

time.sleep(3)
html = driver.page_source # 페이지 소스 
html_source = BeautifulSoup(html, 'html.parser') #파서하기

# 데이터 추출
restaurant_name = html_source.find_all("div", class_ = "restaurant-name ng-binding") #업체명
restaurant_score = html_source.find_all("span", class_ = "ico-star1 ng-binding") #별점
restaurant_review = html_source.find_all("span", attrs = {"class":"review_num ng-binding", "ng-show":"restaurant.review_count > 0"}) # 리뷰 수
restaurant_ceo_review = html_source.find_all("span", attrs = {"class":"review_num ng-binding", "ng-show":"restaurant.owner_reply_count > 0"}) # 사장님 리뷰
del_limit = html_source.find_all("li", class_ = "delivery-time ng-binding") # 배달소요시간

sub_list = [] #temp
result_list = [] #데이터 삽입
#데이터 배열
for i, j, k, l, m in zip(restaurant_name, restaurant_score, restaurant_review, restaurant_ceo_review, del_limit) :
    sub_list.append(i.string) # 업체명
    sub_list.append(j.string.replace("★ ","")) # 별점 스코어
    sub_list.append(re.sub(" |\\n|리뷰","",k.string)) # 리뷰 수
    sub_list.append(re.sub(" |\\n|사장님댓글","",l.string)) # 사장님 리뷰
    sub_list.append(m.string.replace("\\n","").replace(" ","")) # 배달소요시간
    result_list.append(sub_list) # 리스트 요소 추가
    sub_list = [] # 변수 초기화

time.sleep(10) #10초 ㄱㄷ
driver.close() # 크롬드라이버 종료

# 크롤링한 데이터를 DataFrame으로 변환
df = pd.DataFrame(result_list, columns=["음식점 이름", "평점", "리뷰 수", "사장 리뷰 수", "배달 시간"])

# DataFrame을 CSV 파일로 저장
df.to_csv('restaurant_data.csv', index=False, encoding='utf-8')

print("CSV 파일이 저장되었습니다.")

1위부터 100위까지 csv파일로 저장 및 전체 저장(csv, xlsx)

# 요기요순위매기는파일
import pandas as pd

# CSV 파일에서 데이터 불러오기
df = pd.read_csv(r"C:\\Users\\c1224\\OneDrive\\바탕 화면\\SAI_practice\\restaurant_data.csv")

# 매장 정보와 별점 데이터만 추출
df = df[['음식점 이름', '평점','리뷰 수']]

# 중복된 매장 정보가 있다면 평균 별점과 총 리뷰 수 계산
df = df.groupby('음식점 이름', as_index=False).agg({'평점': 'mean', '리뷰 수': 'sum'})

# 별점과 리뷰 수를 고려하여 순위 매기기
# 이 때, 리뷰 수로 올라가는 가중평점은 최대 0.1이 넘지 않는다. 평점이 소숫점 한 자리까지만 표시되며, 그 수준을 엎을 정도는 되지 않았으면 좋기 때문
df['가중 평점'] = df['평점'] + ((df['리뷰 수'] / df['리뷰 수'].max())/10)

# 가중 평점으로 순위 매기기
df_ranked = df.sort_values(by='가중 평점', ascending=False)

# 리뷰 수가 100개 이하인 음식점 제거
df_ranked = df_ranked[df_ranked['리뷰 수'] > 100]

# 결과를 CSV 파일로 저장
output_csv = "요기요_매장별_평점_순위.csv"
df_ranked.to_csv(output_csv, index=False)

print(f"매장별 별점 순위가 저장된 파일: {output_csv}")

# 가중 평점 순위 중 상위 100개 선택
top_100_ranked = df_ranked.head(100)

# 상위 100개의 데이터를 표로 정리
top_100_table = top_100_ranked[['음식점 이름', '평점', '리뷰 수', '가중 평점']]

# 결과를 CSV 파일로 저장
output_csv = "요기요_매장별_평점_순위_100위.csv"
top_100_table.to_csv(output_csv, index=False)

print(f"상위 100위 매장별 별점 순위가 저장된 파일: {output_csv}")

# 결과를 엑셀 파일로 저장
output_excel = "요기요_매장별_평점_순위.xlsx"
df_ranked.to_excel(output_excel, index=False)

print(f"매장별 별점 순위가 엑셀 파일로 저장됨: {output_excel}")