CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Prolem scrapping maps

Nirostreetlourd
Nirostreetlourd
Niveau 26
07 novembre 2021 à 15:12:53

Pour un projet de data science personnel j'aimerais scraper les données de google maps. Je fais cela en utilisant python et sélénium et je suis confronté à un problème étrange, je ne peux extraire que 6 résultats de chaque page (une page peut contenir jusqu'à 20 résultats).

Je partage avec vous ce que j'ai fait jusqu'à présent :


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.common.exceptions import NoSuchElementException
import time
import string
import openpyxl
import os
from selenium.webdriver.common.by import By

# Loading Selenium Webdriver
driver = webdriver.Firefox()
wait = WebDriverWait(driver, 5)

# Opening Google maps
driver.get("https://www.google.com/maps")
time.sleep(3)
#Closing the google consent form
button=driver.find_element(By.XPATH,'/html/body/c-wiz/div/div/div/div[2]/div[1]/div[4]/form/div/div/button')
button.click()

searchbox=driver.find_element(By.ID,'searchboxinput')
location= "Paris"
searchbox.send_keys(location)
searchbox.send_keys(Keys.ENTER)
time.sleep(5)
cancelbut=driver.find_element(By.CLASS_NAME,'gsst_a')
cancelbut.click()
searchbox.send_keys("ASSURANCE")
searchbox.send_keys(Keys.ENTER)
time.sleep(5)

# Locating the results section
while 1==1 :
    #Class name of a section
    entries = driver.find_elements(By.CLASS_NAME,'lI9IFe')
    print(str(entries))



    # Prepare the excel file using the Openpyxl
    wb = openpyxl.load_workbook("C:/Users/ac/Desktop/plombier.xlsx")
    sheet = wb.worksheets[0]
    #sheet = wb[sheetname]
    #sheet.title = "plombier"
    i=0
    for entry in entries:
        print(entry.text)
        print(i)
        i+=1
        # Empty list
        labels = []
        # Extracting the Name, adress, Phone, and website:

        name = entry.find_element(By.CSS_SELECTOR,'.qBF1Pd').text
        #adress = entry.find_element(By.XPATH,'/html/body/div[3]/div[9]/div[8]/div/div[1]/div/div/div[4]/div[1]/div[3]/div/div[2]/div[2]/div[1]/div/div/div/div[4]/div[1]/span[2]').text
        #phone = entry.find_element(By.XPATH,'/html/body/div[3]/div[9]/div[8]/div/div[1]/div/div/div[4]/div[1]/div[1]/div/div[2]/div[2]/div[1]/div/div/div/div[4]/div[2]/span[3]/jsl/span[2]').text
        print(name)
        try:
            webcontainer = entry.find_element(By.CLASS_NAME,'section-result-action-container')
            website = entry.find_element(By.TAG_NAME,'a').get_attribute("href")
        except NoSuchElementException:
            website = "No website could be found"
        print(website)

        # Try/except  to write the extracted info in the Excel file pass if doessn't exist
        try:
            sheet.append([location, name, website])
        except IndexError:
            pass

    # saving the excel file
    wb.save("C:/Users/ac/Desktop/plombier.xlsx")
    time.sleep(4)
    pagesuivantebut = driver.find_element(By.ID, 'ppdPk-Ej1Yeb-LgbsSe-tJiF1e')
    pagesuivantebut.click()
    time.sleep(5)

Azerban
Azerban
Niveau 16
07 novembre 2021 à 15:54:23

C'est parce que quand tu atterris sur une page contenant les résultats, il n'y a que les 6 premiers résultats qui sont chargés dans le DOM.

Les 14 autres résultats sont chargés dynamiquement en scrollant vers le bas dans la section contenant les résultats sur la gauche.

Ce sont les balises jstcache=172 dans la div section-scrollbox.

On voit bien seulement 6 balises quand on atterris sur la page.

https://image.noelshack.com/fichiers/2021/44/7/1636296750-google-maps-scraping.png

Quand tu cliques sur le bouton pour aller à la page suivante, tu ne scrolles pas dans la section et du coup les div ne sont pas générées et placées dans le DOM.

Nirostreetlourd
Nirostreetlourd
Niveau 26
07 novembre 2021 à 16:24:33

Yep je m'en suis rendu compte en écrivant la question ici.

Comme quoi partager un problème ça aide !

Merci pour ton aide je vais juste chercher comment scroller avec selenium et ça va le faire !

Nirostreetlourd
Nirostreetlourd
Niveau 26
07 novembre 2021 à 18:38:12

j'arrive pas identiier pourquoi je donne le mauvais chemin pour récuperer les numéros de téléphones.

Je récupère toujours le même.

une idée de ce que je peux mal faire ?

Azerban
Azerban
Niveau 16
07 novembre 2021 à 19:41:32

C'est normal c'est parce que tu donnes le chemin XPATH, c'est un chemin absolu vers un seul numéro. Essaie avec un sélecteur CSS plutôt.

Azerban
Azerban
Niveau 16
07 novembre 2021 à 19:46:05

Un conseil également, au lieu d'enregistrer tes données dans un fichier xlsx, enregistre-les dans un fichier csv avec le module csv de Python.

Une fois le fichier créé tu pourras le convertir dans n'importe quel format par la suite.

Nirostreetlourd
Nirostreetlourd
Niveau 26
07 novembre 2021 à 20:19:16

phone = entry.find_element(By.CSS_SELECTOR,'div.section-scrollbox:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(4) > div:nth-child(3) > span:nth-child(2) > jsl:nth-child(1) > span:nth-child(2)').text

Me fait planter, avec l'erreur suivante : Unable to locate element:

Je tourne en rond j'ai pas l'habitude de faire du web !
Est-ce que je prends le bon selecteur css ?

Azerban
Azerban
Niveau 16
07 novembre 2021 à 22:03:13

Google maps n'est pas facile à scraper car les noms des classes sont auto-générés et changement régulièrement donc on ne peut pas trop s'appuyer dessus.

Inspire toi de ce script plutôt pour ta besogne : https://lobstr.io/index.php/2021/08/03/comment-scraper-etablissements-google-maps-python-selenium/

Le script de la vidéo Youtube que tu as utilisé n'est pas terrible.

Nirostreetlourd
Nirostreetlourd
Niveau 26
10 novembre 2021 à 20:42:29

hey petit update finalement comme je reçois toutes les données dans une liste j'ai décidé de tout extraire et de faire le nettoyage avec panda.
Merci Azerban pour ton aide !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment