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
lorsque l'on valide ou l'on clique sir OK, alors l'email est dans le code source.
avec des proxys variables et aussi le User-Agent.
"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"
Ce que je veux
Mais je n'y arrive pas, car le champ ne se renseigne pas avec le code ci-joint.
Ce que j'obtiens
Cela ne fonctionne pas, Pouvez-vous m'aider ?