scrpae google maps par selenium
Contrôler le navigateur Chrome avec Selenium

Utilisation de Sélénium dans le scraping de données est une chose assez courante. Il automatise les navigateurs et vous permet de simuler les activités réelles des utilisateurs pour éviter d'être bloqué. Il est particulièrement utile lors du scraping de sites JavaScript générés dynamiquement comme Google. De plus, il permet d'éviter tout type de protection contre le crawling car il simule le comportement réel des clients.

Dans cet article, vous verrez un tutoriel étape par étape pour le développement d'un scraper qui sera capable d'analyser les lieux de Google Maps sans être bloqué, même après plus de 1000 pages.

Ce dont nous aurons besoin pour construire la chenille

  1. Python 3+.
  2. Navigateur Chrome installé.
  3. Selenium 3.141.0+ (paquet python).
  4. Pilote Chrome (pour votre système d'exploitation).
  5. Parsel ou toute autre bibliothèque pour extraire des données de HTML comme Beautiful Soup.

Tutoriel étape par étape pour créer l'extracteur Google Maps

Télécharger et enregistrer ChromeDriver

Pour utiliser Selenium avec Google Chrome, vous devrez lier le code python au navigateur en utilisant ChromeDriver.

Téléchargez la version de ChromeDriver qui correspond à la version de votre navigateur et à votre type de système d'exploitation. Le numéro de version de votre navigateur Chrome peut être trouvé ici : Chrom -> icône de menu (coin supérieur droit) -> Aide -> À propos de Google Chrome.

Désarchivez le fichier chromedriver et enregistrez-le quelque part sur votre système (le chemin d'accès sera utilisé plus tard). Dans cet exemple de tutoriel, nous stockons le fichier dans le dossier du projet.

Installer les paquets Selenium et Parsel

Installez les paquets Selenium et Parsel en exécutant les commandes suivantes. Nous utiliserons Parsel plus tard lorsque nous analyserons le contenu du HTML.

				
					pip install selenium
pip install parsel # pour extraire des données du HTML en utilisant XPath ou des sélecteurs CSS
				
			

Initialiser et démarrer Webdriver

Avant d'initialiser le Webdriver, assurez-vous d'avoir effectué les étapes précédentes et d'avoir le chemin d'accès au fichier du pilote chromatique. Initialisez le pilote par le code suivant. Vous devriez voir la nouvelle fenêtre Chrome s'ouvrir.

				
					de selenium import webdriver


chromedrive_path = './chromedriver' # utiliser le chemin vers le pilote que vous avez téléchargé lors des étapes précédentes.
driver = webdriver.Chrome(chromedrive_path)
				
			

Sur mac, vous pouvez voir ce qui suit : "chromedriver ne peut être ouvert car le développeur ne peut être vérifié". Pour résoudre ce problème, cliquez sur le pilote de chrome dans le Finder, choisissez Ouvrir dans le menu, puis cliquez sur Ouvrir dans la boîte de dialogue qui apparaît. Vous devriez voir "ChromeDriver was started successfully" dans la fenêtre de terminal ouverte. Fermez-la et après cela, vous serez en mesure de démarrer ChromeDriver à partir de votre code.

Télécharger la page Google Maps

Une fois que vous avez démarré le pilote, vous êtes prêt à ouvrir certaines pages. Pour ouvrir n'importe quelle page, utilisez la commande "get".

				
					url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url)
				
			

Analyser le contenu de la recherche de Maps

Une fois que votre page est ouverte, vous verrez la page dans la fenêtre de votre navigateur qui est contrôlée par votre code python. Vous pouvez exécuter le code suivant pour obtenir le contenu de la page HTML de ChromeDriver.

				
					page_content = driver.page_source
				
			

Pour voir confortablement le contenu HTML, ouvrez la console de développement dans Chrome en ouvrant le menu Chrome dans le coin supérieur droit de la fenêtre du navigateur et en sélectionnant Autres outils > Outils de développement. Vous devriez maintenant être en mesure de voir les éléments de votre page.

analyse syntaxique HTML de google maps
Trouver le xpath des éléments que nous voulons obtenir avec la console du développeur

Vous pouvez analyser le contenu de la page HTML en utilisant vos outils d'analyse préférés. Nous utiliserons Parsel dans ce tutoriel.

				
					de parsel import Selector

response = Selector(page_content)
				
			

Itérer sur les listes et obtenir les données de chaque lieu.

				
					résultats = []

for el in response.xpath('//div[contient(@aria-label, "Résultats pour")]/div/div[./a]') :
    results.append({
        link' : el.xpath('./a/@href').extract_first(''),
        'titre' : el.xpath('./a/@aria-label').extract_first('')
    })
    
print(results)
				
			

Sortie de Google Maps places (raccourci).

				
					[
  {
    'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
    'title' : 'Black Iron Burger'.
  },
  {
    'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
    'title' : 'Fools Gold NYC'
  },
  {
    'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
    'title' : 'Bar de la 11ème rue'.
  },
  ...
]
				
			

Arrêter le pilote une fois le processus d'extraction terminé

Il est important de démarrer et d'arrêter le conducteur avant et après le grattage en conséquence. C'est la même chose que d'ouvrir et de fermer votre navigateur avant et après avoir surfé sur Internet. Fermez le pilote en exécutant le code suivant.

				
					driver.quit()
				
			

Conclusion et recommandations sur la mise à l'échelle et l'amélioration de la robustesse du grattoir

Malgré la structure HTML délicate de Google Maps, avec Selenium et une bonne connaissance de XPath et des sélecteurs CSS, vous pouvez obtenir d'assez bons résultats en matière de scraping. Cette méthode, qui consiste à utiliser un émulateur de navigateur, devrait vous éviter d'être bloqué. Toutefois, si vous souhaitez faire évoluer votre application, vous pouvez envisager d'utiliser également des proxies afin d'éviter des problèmes inattendus.

Fonctionnement en parallèle

Il est possible d'exécuter les pilotes en multiprocessing (pas en multithreading) mais chaque pilote consommera un CPU. Assurez-vous d'en avoir suffisamment.

Le meilleur moyen de récupérer des cartes Google Maps à l'échelle de l'entreprise

Comme l'exploration de Google peut s'avérer difficile, de nombreuses sociétés et grandes entreprises souhaitent commencer à explorer des millions de pages sans consacrer de temps au développement et à la maintenance de leurs propres robots d'exploration.

Le moyen le plus simple de commencer à exploiter Google Maps est d'utiliser la méthode suivante Plate-forme Outscraper (pour obtenir les résultats dans des fichiers CSV), APIou SDKs (à intégrer dans le code).

Le moyen le plus simple de démarrer avec Google Maps Scraping

Installez le SDK de Outscraper en exécutant la commande suivante.

				
					pip install google-services-api
				
			

Initialiser le client et rechercher des annonces sur Google ou analyser des annonces spécifiques en envoyant les identifiants des lieux.

* vous pouvez obtenir le jeton d'API (SECRET_API_KEY) à partir de la page Page de profil.

				
					from outscraper import ApiClient

api_client = ApiClient(api_key='SECRET_API_KEY')

# Recherche d'entreprises dans des lieux spécifiques :
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Obtenir les données du lieu spécifique par id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Recherche avec plusieurs requêtes (batching)
result = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars brooklyn usa',
], language='en')

print(result)
				
			

Résultat de sortie (abrégé).

				
					[
  [
    {
      "nom" : "Colonie",
      "full_address" : "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough" : "Brooklyn Heights",
      "street" : "127 Atlantic Ave",
      "city" : "Brooklyn",
      "postal_code" : "11201",
      "country_code" : "US",
      "country" : "Etats-Unis d'Amérique",
      "us_state" : "New York",
      "state" : "New York",
      "plus_code" : null,
      "latitude" : 40.6908464,
      "longitude" : -73.9958422,
      "time_zone" : "America/New_York",
      "popular_times" : null,
      "site" : "http://www.colonienyc.com/",
      "phone" : "+1 718-855-7500",
      "type" : "Restaurant américain",
      "catégorie" : "restaurants",
      "sous-types" : "Restaurant américain, Bar à cocktails, Restaurant italien, Restaurant biologique, Restaurant, Bar à vins",
      "posts" : null,
      "rating" : 4.6,
      "reviews" : 666,
      "reviews_data" : null,
      "photos_count" : 486,
      "google_id" : "0x89c25a4590b8c863:0xc4a4271f166de1e2",
      "place_id" : "ChIJY8i4kEVawokR4uFtFh8npMQ",
      "reviews_link" : "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=fr&gl=US",
      "reviews_id" : "-4277250731621359134",
      "photo" : "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
      "street_view" : "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
      "working_hours_old_format" : "Lundi : 5\u20139:30PM | Mardi : Fermé | Mercredi : Fermé | Jeudi : 5\u20139:30PM | Vendredi : 5\u20139:30PM | Vendredi : 5\u20139:30PM | Samedi : 11h00\u20133PM, 17h00\u20139:30PM | Dimanche : 11h00\u20133PM, 17h00\u20139:30PM",
      "working_hours" : {
        "Lundi" : "17h20139:30h",
        "Mardi" : "Fermé",
        "Mercredi" : "Fermé",
        "Jeudi" : "17h0020139:30",
        "Vendredi" : "17h00", "17h30",
        "Samedi" : "11AM\\u20133PM,5\\u20139:30PM",
        "Dimanche" : "11AM\\u20133PM,5\\u20139:30PM"
      },
      "business_status" : "OPERATIONAL",
      },
      "reserving_table_link" : "https://resy.com/cities/ny/colonie",
      "booking_appointment_link" : "https://resy.com/cities/ny/colonie",
      "owner_id" : "114275131377272904229",
      "vérifié" : vrai,
      "owner_title" : "Colonie",
      "owner_link" : "https://www.google.com/maps/contrib/114275131377272904229",
      "location_link" : "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
      ...
    },
   ...
  ]
]
				
			

Extra : Le moyen le plus simple de commencer à exploiter les avis de Google

Vous pouvez extraire les critiques en exécutant le code suivant (en supposant que vous avez installé le paquet python et lancé le client).

				
					# Obtenir les critiques de l'endroit spécifique par id.
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Obtenir les avis sur les lieux trouvés par la requête de recherche
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Obtenir uniquement les nouveaux avis des dernières 24 heures
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())

result = api_client.google_maps_reviews(
    'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')
				
			

Résultat de sortie (abrégé).

				
					{
  "nom" : "Memphis Séoul",
  "adresse" : "569 Lincoln Pl, Brooklyn, NY 11238, \N-u0421\N-u043f\N-u043e\N-u043b\N-u0443\N-u0447\N-u0435\N-u043d\N-u0456\N-u0428\N-u0442\N-u0430\N-u0442\N-u0438",
  "address_street" : "569 Lincoln Pl",
  "owner_id" : "100347822687163365487",
  "owner_link" : "https://www.google.com/maps/contrib/100347822687163365487",
  ...
  "reviews_data" : [
    {
      "google_id" : "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link" : "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
      "autor_name" : "Eliott Levy",
      "autor_id" : "112314095435657473333",
      "review_text" : "Très bonne cuisine fusion locale réconfortante ! \\Salade de chou au kimchi ! ! Une idée géniale !",
      "review_link" : "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating" : 5,
      "review_timestamp" : 1560692128,
      "review_datetime_utc" : "06/16/2019 13:35:28",
      "review_likes" : null
    },
    {
      "google_id" : "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link" : "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
      "autor_name" : "fenwar1",
      "autor_id" : "106144075337788507031",
      "review_text" : "Superbes ailes de poulet avec plusieurs sortes de sauce piquante. Les ramen au mac et au fromage sont excellents." "Je suis retourné plus tard pour essayer le slider au pain de viande, une tranche épaisse de viande garnie de slaw et d'une sauce fantastique, délicieux. \\Je suis un habitué.",
      "review_link" : "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating" : 5,
      "review_timestamp" : 1571100055,
      "review_datetime_utc" : "10/15/2019 00:40:55",
      "review_likes" : null
    },
    ...
  ]
}
				
			
Catégories : Pyhton

Vlad

Chef de projet Linkedin

0 Commentaires

Laisser un commentaire

Espace réservé d'avatar