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

Attachment: proxy_list
Description: Binary data

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a