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 파일이 저장되었습니다.")
# 요기요순위매기는파일
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}")