Recherche d'adresse entreprise par nom via l'API de Gaode

Objectif Récupérer automatiquement les adresses géographiques associées à 3 000 noms d’entreprises à partir d’un fichier Excel.

Approche choisie Utilisation de l’API de Gaode Maps (AMAP), offrant un quota gratuit de 5 000 requêtes par mois, ce qui rend la solution économiquement viable pour ce projet. L’alternative (comme Qichacha) impliquerait un coût significatif (environ 500 yuan).

Configuration API

Script principle Le script suivant utilise la bibliothèque requests pour interroger l’API Gaode et extraire les informations petrinentes.

import requests
from typing import Tuple, Optional

def query_company_location(company_name: str) -> Optional[Tuple[str, str, str]]:
    """
    Récupère le nom, la ville et l'adresse d'une entreprise via l'API Gaode.
    
    Args:
        company_name: Nom de l'entreprise à rechercher
        
    Returns:
        Tuple contenant (nom, ville, adresse) ou None en cas d'échec
    """
    api_url = "https://restapi.amap.com/v3/place/text"
    
    params = {
        "key": "votre_clé_api_ici",  # Remplacer par votre clé réelle
        "keywords": company_name,
        "types": "公司企业",  # Type spécifique aux entreprises
        "children": 1,
        "offset": 10,
        "extensions": "base"
    }
    
    try:
        response = requests.get(api_url, params=params, timeout=10)
        if response.status_code != 200:
            return None
            
        data = response.json()
        if not data.get("pois") or len(data["pois"]) == 0:
            return None
            
        result = data["pois"][0]
        return (
            result.get("pname", ""),
            result.get("cityname", ""),
            result.get("address", "")
        )
        
    except Exception as e:
        print(f"Erreur lors de la requête pour '{company_name}': {e}")
        return None

Script d'orchestration Ce script lit un fichier Excel, traite chaque entrée, sauvegarde progressivement les résultats et gère les échecs.

import pandas as pd
import time
from pathlib import Path

def load_data(filepath: str) -> pd.DataFrame:
    """Charge le fichier Excel contenant les noms d'entreprises."""
    df = pd.read_excel(filepath)
    return df

def process_companies():
    input_file = "company.xlsx"
    output_file = "company_with_location.xlsx"
    
    df = load_data(input_file)
    
    # Assurez-vous que les colonnes existent
    for col in ['pname', 'cityname', 'address']:
        if col not in df.columns:
            df[col] = None
    
    total_rows = len(df)
    valid_count = df.iloc[:, 0].notna().sum()
    
    print(f"Total lignes : {total_rows}, Traitement requis : {valid_count}")
    
    processed = 0
    success = 0
    failed = 0
    
    for idx, name in enumerate(df.iloc[:, 0]):
        if pd.isna(name):
            continue
            
        processed += 1
        print(f"\n[{processed}/{valid_count}] Traitement : {name}")
        
        result = query_company_location(str(name))
        
        if result:
            pname, city, addr = result
            df.at[idx, 'pname'] = pname
            df.at[idx, 'cityname'] = city
            df.at[idx, 'address'] = addr
            print(f"✓ Réussi : {pname} | {city} | {addr}")
            success += 1
        else:
            df.at[idx, 'pname'] = "Non trouvé"
            df.at[idx, 'cityname'] = ""
            df.at[idx, 'address'] = ""
            print("✗ Échec")
            failed += 1
        
        # Sauvegarde temporaire toutes les 10 requêtes
        if processed % 10 == 0:
            backup_path = f"progress_{processed}.xlsx"
            df.to_excel(backup_path, index=False)
            print(f"💾 Sauvegarde partielle : {backup_path}")
            
        # Respecter la limite de fréquence
        time.sleep(0.1)
    
    # Sauvegarde finale
    df.to_excel(output_file, index=False)
    print(f"\n✅ Traitement terminé. Résultats sauvegardés dans : {output_file}")
    print(f"Statistiques : {success} réussites, {failed} échecs")
    
    return df

if __name__ == "__main__":
    final_df = process_companies()
    
    # Affichage des premières lignes
    print("\n=== Aperçu des résultats ===")
    print(final_df.head(10))
    
    # Calcul du taux de succès
    total_valid = final_df['pname'].notna().sum()
    success_rate = (final_df['pname'].apply(lambda x: x != "Non trouvé").sum() / total_valid * 100) if total_valid > 0 else 0
    print(f"\nTaux de réussite : {success_rate:.1f}% ({final_df['pname'].apply(lambda x: x != 'Non trouvé').sum()}/{total_valid})")

Structure du projet

project/
├── company.xlsx              # Fichier source avec les noms
├── query_location.py         # Fonction de requête API
├── main_processor.py         # Script principal de traitement
└── results/
    └── company_with_location.xlsx  # Résultat final

Conseisl pratiques

  • Utilisez une clé API dédiée avec accès limité au service de recherche.
  • Limitez les requêtes à 10 par seconde environ pour éviter les blocages.
  • Activez les logs si nécessaire pour surveiller les erreurs.
  • Testez sur un petit jeu de données avant le traitement complet.

Étiquettes: Python Gaode Maps API Pandas Excel API REST

Publié le 8 septembre à 17h43