Сбор мест с использованием Python и Google Places API - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу собрать места вокруг моего города, Пеканбару, с помощью latlong (0.507068, 101.447777), и я преобразую его в набор данных. Набор данных (он содержит place_name, place_id, lat, long и тип столбцы).

Ниже приведен скрипт, который я пробовал.

import json
import urllib.request as url_req
import time
import pandas as pd

NATAL_CENTER = (0.507068,101.447777)
API_KEY = 'API'
API_NEARBY_SEARCH_URL = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json'
RADIUS = 30000
PLACES_TYPES = [('airport', 1), ('bank', 2)] ## TESTING

# PLACES_TYPES = [('airport', 1), ('bank', 2), ('bar', 3), ('beauty_salon', 3), ('book_store', 1), ('cafe', 1), ('church', 3), ('doctor', 3), ('dentist', 2), ('gym', 3), ('hair_care', 3), ('hospital', 2), ('pharmacy', 3), ('pet_store', 1), ('night_club', 2), ('movie_theater', 1), ('school', 3), ('shopping_mall', 1), ('supermarket', 3), ('store', 3)]

def request_api(url):
    response = url_req.urlopen(url)
    json_raw = response.read()
    json_data = json.loads(json_raw)
    return json_data

def get_places(types, pages):
    location = str(NATAL_CENTER[0]) + "," + str(NATAL_CENTER[1])
    mounted_url = ('%s'
        '?location=%s'
        '&radius=%s'
        '&type=%s'
        '&key=%s') % (API_NEARBY_SEARCH_URL, location, RADIUS, types, API_KEY)

    results = []
    next_page_token = None

    if pages == None: pages = 1

    for num_page in range(pages):
        if num_page == 0:
            api_response = request_api(mounted_url)
            results = results + api_response['results']
        else:
            page_url = ('%s'
                '?key=%s'
                '&pagetoken=%s') % (API_NEARBY_SEARCH_URL, API_KEY, next_page_token)
            api_response = request_api(str(page_url))
            results += api_response['results']

        if 'next_page_token' in api_response:
            next_page_token = api_response['next_page_token']
        else: break

        time.sleep(1)
    return results

def parse_place_to_list(place, type_name):
    # Using name, place_id, lat, lng, rating, type_name
    return [
        place['name'],
        place['place_id'],
        place['geometry']['location']['lat'],
        place['geometry']['location']['lng'],
        type_name       
    ]

def mount_dataset():
    data = []

    for place_type in PLACES_TYPES:
        type_name = place_type[0]
        type_pages = place_type[1]

        print("Getting into " + type_name)

        result = get_places(type_name, type_pages)
        result_parsed = list(map(lambda x: parse_place_to_list(x, type_name), result))
        data += result_parsed

    dataframe = pd.DataFrame(data, columns=['place_name', 'place_id', 'lat', 'lng', 'type'])
    dataframe.to_csv('places.csv')

mount_dataset()

Но скрипт вернулся с Пустой фрейм данных. Как решить и получить правильный набор данных?

1 Ответ

1 голос
/ 03 ноября 2019

Боюсь, что очистка данных и их хранение запрещены Условиями обслуживания Google Maps Platform.

Ознакомьтесь с Условиями предоставления услуг до начала внедрения. В пункте 3.2.4 «Ограничения в отношении неправомерного использования Сервисов» читается

(a) Нет очистки. Клиент не будет извлекать, экспортировать или иным образом очищать контент Карт Google для использования внеУслуги. Например, Заказчик не будет: (i) осуществлять предварительную выборку, индексировать, хранить, перераспределять или повторно размещать Контент Карт Google вне служб; (ii) массово загружать фрагменты Карт Google, изображения улиц, геокоды,направления, результаты матрицы расстояний, информация о дорогах, информация о местах, значения высоты и сведения о часовом поясе;(iii) копировать и сохранять названия компаний, адреса или отзывы пользователей; или (iv) использовать Контент Google Maps с услугами преобразования текста в речь.

источник: https://cloud.google.com/maps-platform/terms/#3-license

Извините, что несу плохие новости.

...