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 Python@lists.python.it http://lists.python.it/mailman/listinfo/python