Table des matières

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.

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

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 # to extract data from HTML using XPath or CSS selectors
				
			

Initialiser et démarrer Webdriver

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

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
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 XPath aux éléments que l'on veut obtenir avec Developer Console

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.

				
					from parsel import Selector

response = Selector(page_content)
				
			

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

				
					results = []

for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': 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': '11th St. Bar'
  },
  ...
]
				
			

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')

# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Search with many queries (batching)
result = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars brooklyn usa',
], language='en')

print(result)
				
			

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

				
					[
  [
    {
      "name": "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": "United States of America",
      "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": "American restaurant",
      "category": "restaurants",
      "subtypes": "American restaurant, Cocktail bar, Italian restaurant, Organic restaurant, Restaurant, Wine bar",
      "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=en&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": "Monday: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
      "working_hours": {
        "Monday": "5\\u20139:30PM",
        "Tuesday": "Closed",
        "Wednesday": "Closed",
        "Thursday": "5\\u20139:30PM",
        "Friday": "5\\u20139:30PM",
        "Saturday": "11AM\\u20133PM,5\\u20139:30PM",
        "Sunday": "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",
      "verified": true,
      "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).

				
					# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Get only new reviews during last 24 hours
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é).

				
					{
  "name": "Memphis Seoul",
  "address": "569 Lincoln Pl, Brooklyn, NY 11238, \\u0421\\u043f\\u043e\\u043b\\u0443\\u0447\\u0435\\u043d\\u0456 \\u0428\\u0442\\u0430\\u0442\\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": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
      "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": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice  topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\ud83d\\udc4d",
      "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
    },
    ...
  ]
}
				
			

FAQ

Questions et réponses les plus fréquentes

Grâce au SDK de Outscraper, il est possible de scrapper les données de Google Maps avec Python Selenium. Consultez la documentation de l'API Google Maps Places de Outscraper pour voir ce que vous pouvez faire.

En utilisant Python et Selenium, il est possible d'automatiser le processus d'extraction de données de Google Maps. Outscraper propose un API Places de Google Maps et des SDK qui simplifient cette tâche.

Il est possible d'automatiser le scraping de Google Maps en utilisant Python et Selenium. Outscraper Google Maps Places API et les SDK vous permettent de le faire de la manière la plus simple qui soit.

Catégories : Pyhton

Vlad

Chef de projet Linkedin

0 Commentaire

Laisser un commentaire

Espace réservé d'avatar