[Tistory] 구글맵 리뷰 크롤하기

원글 페이지 : 바로가기

구글 맵을 크롤하기 위해서 구글 api key가 필요하다. 1. 구글 API 키 발급 받기 하단은 공식 사이트 https://developers.google.com/maps/documentation/javascript/get-api-key?hl=ko API 키 사용하기 | Maps JavaScript API | Google for Developers 새로운 지도 스타일이 곧 Google Maps Platform에 제공될 예정입니다. 이 지도 스타일 지정 업데이트에는 새로운 기본 색상 팔레트와 지도 환경 및 사용성 개선사항이 포함됩니다. 모든 지도 스타일이 developers.google.com 하단은 내가 참고한 블로그 링크 https://velog.io/@sukqbe/API-%EA%B5%AC%EA%B8%80-%EC%A7%80%EB%8F%84Google-Map-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0-API-Key-%EB%B0%9C%EA%B8%89%EB%B0%9B%EA%B8%B0-qumur49u [API] 구글 지도(Google Map) 추가하기 (+ API Key 발급받기) 구글 지도(Google Map) API Key 발급 및 사용법 velog.io 하루에 사용횟수, 한 번에 긁어올 수 있는 글자 갯수 제한이 있으니 알아보고 설정하기! 2. 크롤링 코드 구글맵 식당 리뷰를 긁어오기 위해 작성한 크롤링 코드 from datetime import datetime, timedelta

import requests
import pandas as pd

# 식당명 검색 및 Place ID 추출
def get_place_id(query, api_key):
url = f”https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input={query}&inputtype=textquery&fields=place_id&language=ko&key={api_key}”
response = requests.get(url)
place_id = response.json()[‘candidates’][0][‘place_id’]
return place_id

# 전화번호, 리뷰 추출
def get_place_details(place_id, api_key):
url = f”https://maps.googleapis.com/maps/api/place/details/json?place_id={place_id}&fields=name,formatted_phone_number,reviews&key={api_key}&language=ko”
response = requests.get(url)
result = response.json()[‘result’]
return result

# 최신 리뷰 필터링 (5개월 이내), 최신순 정렬
def filter_and_sort_recent_reviews(reviews, months=5):
cutoff_date = datetime.now() – timedelta(days=months * 30)
recent_reviews = [
review for review in reviews
if datetime.utcfromtimestamp(int(review[‘time’])) >= cutoff_date
]
recent_reviews.sort(key=lambda x: x[‘time’], reverse=True)
return recent_reviews

def get_place_reviews(api_key, place_id, max_reviews=100):
url = f”https://maps.googleapis.com/maps/api/place/details/json?place_id={place_id}&fields=reviews&language=ko&key={api_key}”

response = requests.get(url)
if response.status_code != 200:
print(f”Error fetching data: {response.status_code}”)
return []

place_details = response.json()
reviews = place_details.get(‘result’, {}).get(‘reviews’, [])

# Limit the number of reviews to max_reviews
reviews = reviews[:max_reviews]

formatted_reviews = []
for review in reviews:
formatted_reviews.append({
‘author_name’: review.get(‘author_name’),
‘rating’: review.get(‘rating’),
‘text’: review.get(‘text’),
‘relative_time_description’: review.get(‘relative_time_description’)
})

return formatted_reviews

# Example usage
if __name__ == “__main__”:
api_key = “”
place_id = get_place_id(“우진해장국”,api_key)
reviews = get_place_reviews(api_key, place_id, max_reviews=100)
recent_reviews = filter_and_sort_recent_reviews(reviews)

for idx, review in enumerate(recent_reviews):
print(f”Review {idx + 1}:”)
print(f”Author: {review[‘author_name’]}”)
print(f”Rating: {review[‘rating’]}”)
print(f”Review Text: {review[‘text’]}”)
print(f”Relative Time: {review[‘relative_time_description’]}”)
print(“-” * 20)

# 리뷰 데이터를 pandas DataFrame으로 변환
reviews_data = []
for review in recent_reviews:
reviews_data.append({
“author_name”: review[‘author_name’],
“rating”: review[‘rating’],
“text”: review[‘text’],
“review_time”: datetime.utcfromtimestamp(int(review[‘time’])).strftime(‘%Y-%m-%d %H:%M:%S’)
})

df_reviews = pd.DataFrame(reviews_data)

# 전체 데이터를 CSV 파일로 저장
#csv_filename = f”{restaurant_info[‘name’]}_reviews.csv”
csv_filename = “우진해장국_reviews.csv”

# DataFrame을 CSV로 저장
df_reviews.to_csv(csv_filename, index=False, encoding=’utf-8-sig’)

print(f”CSV 파일로 저장되었습니다: {csv_filename}”) 3. 리뷰 갯수 5개 제한 오류 해당 코드는 잘 실행됬으나 한 JSON당 5개의 리뷰만 넘어오는 것을 발견 공식문서를 찾아보니 구글에서 5개로 제한해 놓았다고 한다. 4. 해결방법 해결방법은 2가지가 있다. 1. 구글 비지니스 계정을 등록하는 것 승인까지 2~4주가 걸린다고 한다. 해커톤 제출까지 일주일 조금 넘게 남은 상황이라 사용할 수 없음 2. scrapy, selenium과 같은 코드 작성하는 것 이 방법을 사용했는데 다음 게시물에 내용을 작성하겠다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다