Python/JSP/R 이용한 맛집 프로젝트 - 1 (Python 크롤링)
2021/04/14(수)
프로젝트 이름 : Korean Food Finder (코리안 푸드 파인더) --> 코푸파
서울, 부산, 대전, 대구, 울산, 광주, 인천, 제주 지역의 한식, 중식, 일식, 양식별로 크롤링을 해오기로 했다
서울 --> 한식집, 중식집, 일식집, 양식집
부산 --> 한식집, 중식집, 일식집, 양식집
....
제주 --> 한식집, 중식집, 일식집, 양식집
8 X 4 총 32개의 파일이 만들어져야하고 모두 크롤링을 해와야 한다
나는 카카오맵에서 크롤링을 하기로 했고 내가 했던 방식을 설명해 보려고 한다.
<크롬창 띄우기>
#미니 프로젝트
#웹 가져오기
import re
import time
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import requests
import csv
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import googlemaps
import pandas as pd
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}
list=[]
url = "https://map.kakao.com/"
#현재파일에 있는 크롬 드라이버를 가져와서 열기
options = webdriver.ChromeOptions() # 크롬 브라우저 옵션
# options.add_argument('headless') # 브라우저 안 띄우기
options.add_argument('lang=ko_KR') # KR 언어
chromedriver_path = "chromedriver" # 크롬 드라이버 위치
driver = webdriver.Chrome(os.path.join(os.getcwd(), chromedriver_path), options=options) # chromedriver 열기
드라이버에서 크롬 브라우저를 열어준다
--> 결과화면
<카카오맵으로 이동 후 검색하기>
# 1. 카카오 지도로 이동
driver.get(url)
searchloc = input("찾고싶은 음식종류 : ")
filename = input("파일이름 영어로치기 : ")
#2. 음식점 입력 후 찾기 버튼 클릭 xpath활용
search_area = driver.find_element_by_xpath('//*[@id="search.keyword.query"]') # 검색 창
search_area.send_keys(searchloc) # 검색어 입력
driver.find_element_by_xpath('//*[@id="search.keyword.submit"]').send_keys(Keys.ENTER) # Enter로 검색
time.sleep(2)
#3 장소 버튼 클릭
driver.find_element_by_xpath('//*[@id="info.main.options"]/li[2]/a').send_keys(Keys.ENTER)
1. url에 카카오맵 주소를 넣어놨기 때문에 구글 웹에서 카카오맵으로 이동을 하고
찾고싶은 음식종류와 저장할 파일이름을 입력
2. xpath를 통해 검색창에 검색어가 입력되고 send_key를 통해 검색됌
3. time.sleep은 너무 빨리 이동이되면 문제가 생기기 때문에 넣어줌
4. 탭에 장소버튼까지 클릭되도록 구현
** 이유는 장소 버튼을 클릭해야 페이지별로 크롤링이 가능하기 때문에
--> 결과화면
<페이지에 음식점이름, 평점, 리뷰, 링크, 주소 저장하는 함수>
def storeNamePrint():
time.sleep(0.2)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
cafe_lists = soup.select('.placelist > .PlaceItem')
count =1
for cafe in cafe_lists:
temp=[]
cafe_name = cafe.select('.head_item > .tit_name > .link_name')[0].text # cafeName
food_score = cafe.select('.rating > .score > .num')[0].text
review = cafe.select('.rating > .review')[0].text
link = cafe.select('.contact > .moreview' )[0]['href']
addr = cafe.select('.addr')[0].text
#"리뷰" 문자열 제거 후 숫자만 반환
review= review[3:len(review)]
#숫자만 반환된 문자를 쉼표를
review = int(re.sub(",","",review))
temp.append(cafe_name)
temp.append(food_score)
temp.append(review)
temp.append(link)
temp.append(addr)
list.append(temp)
f=open(filename+'.csv',"w",encoding="utf-8-sig",newline="")
writercsv=csv.writer(f)
header=['Name','Score','Review','Link','Addr']
writercsv.writerow(header)
for i in list:
writercsv.writerow(i)
크롤링해오기 위한 메소드 선언
1. 반복적으로 페이지 마다 가져와야하기 때문에 시간이 필요함 그래서 time.sleep을 줬음
2. 음식점 리스트를 가져올수 있도록 html에서 개발자모드로 확인
3. 음식점 이름과, 평점, 리뷰수, 링크, 주소를 가져와 저장
4. 리뷰수만 가져오기 위해 글자수를 잘라주는 코드 적용
5. 숫자만 반환된 문자에서 쉼표를 제거해줌
ex) 리뷰 1,005 --> 1005
6. temp배열에 추가해주고 리스트에 temp를 추가해줌
7. 설정해준 파일이름으로 행은 Name, Score, Review, Link, Addr을 가진 csv파일을 생성
<페이지를 돌아가며 크롤링>
# 전 음식점 받아오기 위해
# 페이지 수를 넘기면서 음식점 크롤링
page =1
page2=0
#1페이지부터 34페이지까지 출력
for i in range(0,34):
#페이지 넘어가며 출력
try:
page2+=1
print("**",page,"**")
driver.find_element_by_xpath(f'//*[@id="info.search.page.no{page2}"]').send_keys(Keys.ENTER)
storeNamePrint()
if (page2)%5==0:
driver.find_element_by_xpath('//*[@id="info.search.page.next"]').send_keys(Keys.ENTER)
page2=0
page+=1
except:
break
print("**크롤링완료**")
이제 웹에서 페이지를 넘겨가며 음식점이름과 평점, 리뷰, 링크, 주소를 크롤링
1. 전체 페이지는 1~34
2. 5페이지까지 도달하면 그 다음 페이지는 다음 페이지를 클릭해줘야 6~10으로 넘어갈 수 있음
3. if문을 사용해서 0~4까지 돌고나면 page2를 0으로 초기화 시켜줌
4. 모든게 다끝나면 크롤링 완료
--> 결과화면
다음과 같은 파일 생성완료
이 파일에 있는 주소를 가지고 위도, 경도 추출과 지도 html만드는것은 다음 게시물에서 생성해 보도록 하겠다.