Cambios notables. Creadas interfaces para la tabla de capturing task

y la tabla de capturas.

Traslado todo lo relacionado a Geocoding a un servicio independiente
del capturer.

Replanteo totalmente el parseo del html, creando un objeto nuevo.
This commit is contained in:
pablomartincalvo 2018-10-06 19:09:44 +02:00
parent 3bd8de0e02
commit 240a61649c
7 changed files with 474 additions and 262 deletions

94
geocoder/geocoder.py Normal file
View file

@ -0,0 +1,94 @@
import requests
class GeocodingCache:
cache_max_size = 1000
def __init__(self):
self.geocoded_addresses = []
def address_in_cache(self, address):
"""
Comprueba si la direccion ya esta en la cache
"""
for geocoded_address in self.geocoded_addresses:
if geocoded_address['address'] == address:
return True
return False
def get_coordinates(self, address):
"""
Recupera los datos asociados a la direccion
"""
for geocoded_address in self.geocoded_addresses:
if geocoded_address['address'] == address:
return geocoded_address['latitude'], \
geocoded_address['longitude'], \
geocoded_address['precision']
return None
def add_address(self, address, latitude, longitude, precision):
"""
Añade la direccion a la cache y le hace sitio si es necesario
"""
if len(self.geocoded_addresses) >= cache_max_size:
self.geocoded_addresses.pop()
self.geocoded_addresses.insert(0, {'address': address,
'latitude': latitude,
'longitude': longitude,
'precision': precision})
class GeocodingTask:
url = 'https://maps.googleapis.com/maps/api/geocode/json'
request_parameters = {'region': 'es',
'key': 'AIzaSyCnKj0WnsxVZcaoxeAYkuRw3cKRNGiISYA'}
geocoding_status_success = ['OK']
geocoding_status_surrender = ['ZERO_RESULTS']
geocoding_status_retry = ['OVER_QUERY_LIMIT',
'REQUEST_DENIED',
'INVALID_REQUEST',
'UNKNOWN_ERROR']
def __init__(self, address):
request_paremeters['address'] = address
def geocode(self):
"""
Lanza la peticion de gecoding al servicio de google
"""
self.response = requests.get(url, request_parameters)
self.response_json = self.response.json()
def get_request_status(self):
"""
Devuelve el status HTTP de la request
"""
return self.response.status_code
def success_surrender_retry(self):
"""
Devuelve el estado del resultado desde el punto de vista de Google
"""
if self.response_json['status'] in geocoding_status_success:
return "Success"
elif self.response_json['status'] in geocoding_status_surrender:
return "Surrender"
else:
return "Retry"
def get_results(self):
"""
Extrae los resultados del JSON de respuesta y los devuelve
"""
results = {'latitude': self.response_json['results'][0]['geometry']['location']['lat'],
'longitude': self.response_json['results'][0]['geometry']['location']['lon'],
'precision': self.response_json['results'][0]['geometry']['location_type']}
return results