Partage
  • Partager sur Facebook
  • Partager sur Twitter

Extraction de données avec Python et Selenium

Mappy

    17 juin 2024 à 19:07:00

    Hello,
    Je débute avec Python et Selenium, mais je n'arrive pas à extraire les emails de sociétés stocké dans un fichier via un site Français qui est : https://fr.mappy.com/#/suggestion
    Je souhaite que le champ "On va ou ?" soit renseigné automatiquement par des noms et adresses stockés dans un fichier "Test extraction-mail-mappy.txt", exemples :
    SANI-CHAUFF  247  rue  Félix  Faure  76320  Caudebec  les  Elbeuf
    Dyneff  SA  27  avenue  Léonard  de  Vinci  33600  Pessac
    Cotib  11  avenue  Vieux  Moulins  74000  Annecy
    Lorsque l'on valide ou l'on clique sur OK, alors l'email est dans le code source, mais je ne parviens pas à arriver jusque là.
    ceci avec avec des proxys variables que j'ai et aussi le User-Agent aléatoire à chaque recherche.
    Exemples de proxys :
    IP Address
    209.121.164.50
    8.219.97.248
    Mais je n'y arrive pas, car le champ ne se renseigne pas avec le code ci-joint ?
    Pouvez-vous m'aider ?
    Voici mon code :
    "from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.chrome.service import Service as ChromeService
    from selenium.webdriver.chrome.options import Options as ChromeOptions
    from webdriver_manager.chrome import ChromeDriverManager
    from bs4 import BeautifulSoup
    import random
    import time
    import re
    import logging
    # Configurer le logging
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    # Chemins des fichiers
    url_file_path = 'D:/Test extraction-mail-mappy.txt'
    output_file_path = 'D:/RecupMail.txt'
    # User-Agent pour différents navigateurs
    user_agents = [
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0"
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"
    ]
    # Lecture des URL à scraper à partir du fichier
    with open(url_file_path) as f:
        locations = f.read().splitlines()
    # Initialisation du fichier de sortie
    with open(output_file_path, 'w') as f:
        f.write("Location,Email\n")
    # Fonction pour initialiser le driver avec un User-Agent aléatoire
    def init_driver():
        user_agent = random.choice(user_agents)
        options = ChromeOptions()
        options.add_argument(f"user-agent={user_agent}")
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--ignore-ssl-errors')
        options.add_argument('--disable-web-security')
        logging.info(f"Initialising Chrome driver with User-Agent: {user_agent}")
        # Utiliser webdriver_manager pour installer et gérer chromedriver automatiquement
        service = ChromeService(ChromeDriverManager().install())
        driver = webdriver.Chrome(service=service, options=options)
        return driver
    # Fonction pour extraire les emails de la page
    def extract_emails(page_source):
        logging.info("Extracting emails from the page source")
        soup = BeautifulSoup(page_source, 'html.parser')
        emails = set(re.findall(r'"email":\s*"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"', soup.text))
        logging.info(f"Found emails: {emails}")
        return emails
    # Boucle sur toutes les URL et extraction des emails
    for location in locations:
        logging.info(f"Processing location: {location}")
        driver = init_driver()
        try:
            driver.get("https://fr.mappy.com")
            time.sleep(4)  # Augmenter le délai pour s'assurer que la page est complètement chargée
            # Gestion de la fenêtre de consentement
            try:
                accept_button = driver.find_element(By.XPATH, "//button[text()='Accepter & fermer']")
                accept_button.click()
                logging.info("Accepted consent window")
                time.sleep(3)  # Augmenter le délai après acceptation
            except Exception as e:
                logging.warning("Consent window not found or could not be clicked")
            # Remplissage du champ de recherche
            search_field = driver.find_element(By.ID, "SearchHomePage withToaster withSuggest")
            search_field.clear()
            search_field.send_keys(location)
            search_field.send_keys(Keys.ENTER)
            logging.info(f"Search initiated for location: {location}")
            time.sleep(5)  # Augmenter le délai pour s'assurer que les résultats sont chargés
            # Extraction des emails
            emails = extract_emails(driver.page_source)
            # Enregistrement des résultats
            with open(output_file_path, 'a') as f:
                for email in emails:
                    f.write(f"{location},{email}\n")
            logging.info(f"Emails found for {location}: {emails}")
        except Exception as e:
            logging.error(f"Error processing {location}: {e}")
        finally:
            driver.quit()
        time.sleep(random.randint(1, 3))  # Temporisation aléatoire entre les recherches"
    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2024 à 20:07:59

      Bonjour, Merci de lire les règles du forum AVANT de créer un sujet.

      Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code </>

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton  </> de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2024 à 15:12:39

        pour commencer, il n'y a pas d'éléments ayant pur ID "SearchHomePage withToaster withSuggest", ce sont 3 classes, et elles pointent vers une div, donc, il vaudrait peut-être mieux chercher la zone de saisie (input) d'ID "SearchInput0"
        • Partager sur Facebook
        • Partager sur Twitter

        Extraction de données avec Python et Selenium

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown