Un aggiornamento... ho lavorato un poco con il modulo requests che mi permette di usare un proxy per superare il limite delle 2500 richieste sulle mappe di google.
Vi allego il codice e un file con un elenco di proxy come omaggio ;-)) Funziona, ma il problema è la lentezza: 40 richieste in 10 minuti Il debug non è facile e a volte mi da errori strani... Volevo dare l'idea dei numeri in gioco: per scandagliare la zona (bounds) di una città ci vogliono quasi 15000 richieste con step = 0.001 , quindi occorre trovare un compromesso. Es. con step = 0.02 sono appena 42, ma il tempo è dell'ordine dei 10 minuti... Sto indagando il modulo async in request, ma pare che impatti solo sulle richieste al server e non sui tempi di download...è un casino... Scusatemi per il codice per nulla documentato, ma per adesso mi preme il risultato; poi documento in maniera decente. Accetto suggerimenti e per adesso non demordo
#!/usr/bin/python
import simplejson
import requests
def frange(start,end,step):
return map(lambda x: x*step, range(int(start*1./step),int(end*1./step)))
def query_get(url,proxies):
# flag_dati = '0' non presenti - '1' presenti
flag_dati = 0
diz_geometry = {}
diz_address = {}
r = requests.get(url,proxies=proxies)
if r.status_code == requests.codes.ok:
ris = simplejson.loads(r.content)
#print ris['status']
if ris['status'] <> 'ZERO_RESULTS':
#print ris['results'][0]
diz_geometry = geometry_components(ris['results'][0]['geometry'])
diz_address = address_components_requests(ris['results'][0]['address_components'])
flag_dati = 1
else:
diz_geometry = {}
diz_address = {}
flag_dati = 0
return flag_dati,diz_geometry, diz_address
def geometry_components(dati):
ris = {}
if dati.has_key('bounds'):
ris['bounds_northeast_lat'] = dati['bounds']['northeast']['lat']
ris['bounds_southwest_lat'] = dati['bounds']['southwest']['lat']
ris['bounds_northeast_lng'] = dati['bounds']['northeast']['lng']
ris['bounds_southwest_lng'] = dati['bounds']['southwest']['lng']
if dati.has_key('viewport'):
ris['viewport_northeast_lat'] = dati['viewport']['northeast']['lat']
ris['viewport_southwest_lat'] = dati['viewport']['southwest']['lat']
ris['viewport_northeast_lng'] = dati['viewport']['northeast']['lng']
ris['viewport_southwest_lng'] = dati['viewport']['southwest']['lng']
if dati.has_key('location'):
ris['location_lat'] = dati['location']['lat']
ris['location_lng'] = dati['location']['lng']
return ris
def address_components_requests(dati):
ris = {}
for d in dati:
if d['types'] == [u'route']:
ris['via'] = d['long_name']
if d['types'] == [u'locality', u'political']:
ris['comune'] = d['long_name']
if d['types'] == [u'country', u'political']:
ris['nazione'] = d['long_name']
ris['cod_nazione'] = d['short_name']
if d['types'] == [u'administrative_area_level_1', u'political']:
ris['regione'] = d['long_name']
if d['types'] == [u'administrative_area_level_2', u'political']:
ris['provincia'] = d['long_name']
ris['cod_provincia'] = d['short_name']
if d['types'] == [u'postal_code']:
ris['cap'] = d['long_name']
return ris
def street_names_requests(testa,coda,proxies,dati,step):
from requests import async
diz_strade = {}
tipo = 'latlng'
max_lat = dati['bounds_northeast_lat']
min_lat = dati['bounds_southwest_lat']
max_lng = dati['bounds_northeast_lng']
min_lng = dati['bounds_southwest_lng']
print min_lat,max_lat
print min_lng,max_lng
latlng_List = []
richiesta_List = []
for lat in frange(min_lat, max_lat, step):
for lng in frange(min_lng, max_lng, step):
latlng = str(lat)+','+str(lng)
latlng_List.append(latlng)
conta = 0
validi = 0
print 'Nr. richieste: '+str(len(latlng_List))
for latlng in latlng_List:
conta += 1
url = testa+tipo+'='+latlng+coda
flag_dati,diz_geometry, diz_address = query_get(url,proxies)
if flag_dati == 1:
validi += 1
diz_strade[latlng] = [diz_geometry, diz_address]
print 'totali: '+str(conta),'validi: '+str(validi)
#richiesta_List.append(async.get(url,proxies=proxies))
#print len(richiesta_List)
#risposta_List = async.map(richiesta_List, size=10)
#print riposta_List[0]
#if risposta_List[0].status_code == requests.codes.ok:
# ris = simplejson.loads(risposta_List[0].content)
#print ris
return diz_strade
if __name__ == '__main__':
tipo = 'address' # tipo = 'address' or 'latlng'
filtro = 'Galatina'
#filtro = '40.1775244,18.1696415' # Via Bari, Galatina (LE)
testa = 'http://maps.google.com/maps/api/geocode/json?'
coda = '&sensor=false'
url = testa+tipo+'='+filtro+coda
proxies = {"http":"195.222.83.75:3128"}
flag_dati = 0
flag_dati,diz_geometry, diz_address = query_get(url,proxies)
if flag_dati == 1:
#print diz_geometry
#print diz_address
diz_strade = {}
step = 0.0200000
diz_strade = street_names_requests(testa,coda,proxies,diz_geometry,step)
print len(diz_strade)
print diz_strade
proxy_list
Description: Binary data
_______________________________________________ Python mailing list [email protected] http://lists.python.it/mailman/listinfo/python
