Guide pour récupérer les données de Google Maps avec Python

Commentaires: 0

L'extraction de données de Google Maps à l'aide de Python permet de collecter des informations précieuses sur les lieux, les entreprises et les services, ce qui est utile pour l'analyse du marché, l'identification de nouveaux emplacements optimaux, la mise à jour des répertoires actuels, l'analyse de la concurrence et l'évaluation de la popularité des lieux. Ce guide explique en détail comment extraire des informations de Google Maps à l'aide des bibliothèques Python requests et lxml. Il comprend des instructions détaillées sur la formulation des requêtes, le traitement des réponses, l'analyse des données structurées et l'exportation vers un fichier CSV.

Mise en place de votre environnement

Assurez-vous que les bibliothèques Python suivantes sont installées:

  • requests;
  • lxml;
  • csv (bibliothèque standard).

Installez ces bibliothèques à l'aide de pip si nécessaire:


pip install requests
pip install lxml

Nous vous présentons ci-dessous un processus de scraping étape par étape, avec des exemples à l'appui.

Guide étape par étape du scraping de données à partir de Google Maps

Dans les sections suivantes, nous allons présenter un processus détaillé, étape par étape, pour le scraping de données à partir de Google Maps, complété par des exemples visuels pour vous guider à travers chaque étape.

Étape 1. Définir l'URL cible

Spécifiez l'URL à partir de laquelle vous souhaitez extraire des données.


url = "https link"

Etape 2. Définir les en-têtes et les proxies

La mise en place d'en-têtes appropriés est cruciale pour imiter les activités d'un utilisateur authentique, ce qui réduit considérablement les risques que le scraper soit signalé comme un bot. En outre, l'intégration de serveurs proxy permet de maintenir des activités de scraping continues en contournant les blocages qui pourraient résulter du dépassement des limites de requête associées à une seule adresse IP.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

Etape 3. Récupérer le contenu de la page

Envoyez une requête à l'URL de Google Maps et récupérez le contenu de la page:


import requests

response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")

Etape 4. Analyser le contenu HTML

Utilisez lxml pour analyser le contenu HTML:


from lxml import html

parser = html.fromstring(page_content)

Identification des données XPaths

Il est essentiel de comprendre la structure du document HTML pour extraire correctement les données. Vous devez identifier les expressions XPath pour les points de données que vous souhaitez extraire. Voici comment procéder:

  1. Inspectez la page Web: Ouvrez la page Google Maps dans un navigateur web et utilisez les outils de développement du navigateur (clic droit > ; Inspecter) pour examiner la structure HTML.
  2. Trouvez les éléments pertinents: Recherchez les éléments HTML qui contiennent les données que vous souhaitez récupérer (par exemple, les noms des restaurants, les adresses).
  3. Écrire des XPaths: Sur la base de la structure HTML, écrivez des expressions XPath pour extraire les données. Pour ce guide, les XPaths sont les suivants:

Nom du restaurant:


//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()

Adresse:


 //div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()

Options:


 = ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))

Latitude géographique:


//div[@jscontroller="AtSb"]/div/@data-lat

Géo Longitude:


 //div[@jscontroller="AtSb"]/div/@data-lng

Étape 5. Extraction des données

Extraire les données à l'aide des XPaths identifiés:


results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # Ajouter à la liste des données
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Étape 6. Enregistrer les données au format CSV

Enregistrer les données extraites dans un fichier CSV:


import csv

with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

Code complet

Voici le code complet pour récupérer les données de Google Maps:


import requests
from lxml import html
import csv

# Définir l'URL cible et les en-têtes
url = "https://www.google.com/search?sca_esv=04f11db33f1535fb&sca_upv=1&tbs=lf:1,lf_ui:4&tbm=lcl&sxsrf=ADLYWIIFVlh6WQCV6I2gi1yj8ZyvZgLiRA:1722843868819&q=google+map+restaurants+near+me&rflfq=1&num=10&sa=X&ved=2ahUKEwjSs7fGrd2HAxWh1DgGHbLODasQjGp6BAgsEAE&biw=1920&bih=919&dpr=1"
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

# Récupérer le contenu de la page
response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")
    exit()

# Analyse du contenu HTML
parser = html.fromstring(page_content)

# Extraire des données à l'aide de XPath
results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # Ajouter à la liste des données
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Enregistrer les données au format CSV
with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

print("Data has been successfully scraped and saved to google_maps_data.csv.")

Pour un web scraping efficace, il est essentiel d'utiliser les bons en-têtes de requête et les bons proxys. Les meilleurs choix de proxy sont les proxys des centres de données ou des FAI, qui offrent des vitesses élevées et une faible latence. Cependant, comme il s'agit de proxys statiques, il est nécessaire de mettre en œuvre une rotation d'IP pour empêcher le blocage de manière efficace. Une autre option, plus conviviale, consiste à utiliser des proxys résidentiels. Ces proxys dynamiques simplifient le processus de rotation et ont un facteur de confiance plus élevé, ce qui les rend plus efficaces pour contourner les blocages.

Commentaires:

0 Commentaires