CoderCastrov logo
CoderCastrov
Google Maps API

Как парсить рестораны с использованием Google Maps API

Как парсить рестораны с использованием Google Maps API
просмотров
3 мин чтение
#Google Maps API
Table Of Content

    Использование Google Maps API - отличный способ открывать новые варианты еды и находить самые популярные рестораны, а также избегать худших. Однако стоит отметить, что Google Maps API не возвращает полный список ресторанов в городе или даже вокруг адреса в одном запросе, и результаты могут отличаться от одного района к другому.

    Первый шаг - получить ключ Google Maps API для отправки запросов. Затем вам потребуется создать список адресов в вашем городе, которые будут использоваться для нескольких запросов. Например, чтобы получить рестораны в Париже, я создал список адресов каждого района в 20 округах Парижа и добавил адреса станций метро, чтобы получить более актуальные результаты, так как многие рестораны находятся рядом с этими станциями.

    Затем вам потребуется создать карту координат, которая охватывает область поиска. Вы можете сгенерировать координаты станций метро из файла, содержащего названия станций метро, используя следующий код. Этот код запишет координаты в 'metro_points.csv':

    import googlemaps
    import pandas as pd
    
    gmaps = googlemaps.Client(key='ВАШ-КЛЮЧ-API')
    
    csv_file_name = 'metro_points.csv'
    
    with open(csv_file_name, "w", encoding="utf-8", newline='') as f:
         # Записываем заголовок
         f.write("latitude,longitude\n")
    
    import pandas as pd
    metros_df = pd.read_csv("metros.txt", header=None, names=["metro_name"])
    for index, row in metros_df.iterrows():
        metro = row["metro_name"]
        query_station = "metro " + metro + " Paris"
        place = gmaps.geocode(query_station)
        place_info = place[0]
        geo_results = place_info['geometry']
        geo_coordinates = geo_results['location']
        lat = geo_coordinates['lat']
        lng = geo_coordinates['lng']
        point_df = pd.DataFrame({'latitude': [lat], 'longitude': [lng]})
        with open(csv_file_name, mode='a', encoding="utf-8", newline='') as csvfile:
            point_df.to_csv(csvfile, mode='a', header=False, index=False, line_terminator='\n')

    Если вы визуализируете координаты на карте с помощью библиотеки folium, вы сможете определить отсутствующие места.

    карта

    Вы также можете сделать то же самое с названиями районов, чтобы получить больше адресов. Кроме того, чтобы увеличить количество результатов, вы можете применить алгоритм, который добавляет больше маркеров на основе существующих, чтобы охватить каждый конкретный небольшой радиус в городе (например, 500 метров).

    После генерации этих маркеров вы можете объединить их в один CSV-файл и использовать их для получения ресторанов в вашем городе. Вот пример того, как получить рестораны для каждого адреса:

    points_df = pd.read_csv("points.csv", header=0)
    for i in range(len(points_df)-1, -1, -1):
        point = points_df.iloc[i]    
        j+=1
        flag = False
        counter = 0
        lat = point['latitude']
        lng = point['longitude']
        while not flag:
            if counter == 0:
                results = gmaps.places_nearby(type="restaurant", location=[
                                       lat, lng], rank_by="distance")
                response_items = results['results']
                restaurants_in_response = restaurant_response(response_items)
                writeToFile(restaurants_in_response)
                restaurants.extend(restaurants_in_response)
                counter += 1
            else:
                if results.get('next_page_token') is None:
                    flag = True
                else:
                    next_page = results.get('next_page_token')
                    time.sleep(2)
                    results = gmaps.places_nearby(type="restaurant", location=[
                                           lat, lng], rank_by="distance", page_token=next_page)
                    response_items = results['results']
                    restaurants_in_response = restaurant_response(response_items)
                    writeToFile(restaurants_in_response)
                    restaurants.extend(restaurants_in_response)
                    counter += 1

    Сначала я нашел около 2000 ресторанов, а добавив больше маркеров на карту, чтобы охватить большую площадь, и настроив API мест, меняя радиус, применяя различные критерии, такие как сортировка по релевантности или по расстоянию, а также поиск ресторанов по типу кухни, такой как индийская, китайская и т. д., я наконец получил более 16000 ресторанов в Париже, объединив различные результаты в один файл Excel.

    Получив список ресторанов с помощью Google Maps API, я отфильтровал и отсортировал результаты, чтобы найти лучшие рестораны в городе. Я сохранил результаты в файл Excel и использовал различные критерии, такие как рейтинг и количество отзывов, для фильтрации данных.

    Например, я отсортировал рестораны по рейтингу и оставил только те, у которых рейтинг 4.0 или выше. Я также отфильтровал рестораны на основе количества отзывов, оставив только те, у которых значительное количество отзывов.

    В случае с Парижем меня удивило то, что рестораны группы Big Mamma оказались на вершине списка по популярности и отзывам, и так я узнал о них.

    рестораны

    В заключение, хотя процесс был трудоемким и требовал различных настроек и корректировок критериев поиска и данных, но конечный результат стоил затраченных усилий и предоставил ценную информацию о лучших ресторанах в Париже.