II fallait modifier un peu les headers que tu injectais dans la requête get pour les archi. Le code modifié :
import requests
from bs4 import BeautifulSoup
import time
# URL de base pour l'annuaire
url = "https://annuaire.architectes.org/"
# Headers pour la requête
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7",
"Cache-Control": "max-age=0",
"Content-Type": "application/x-www-form-urlencoded",
"DNT": "1",
"Origin": "https://annuaire.architectes.org",
"Referer": "https://annuaire.architectes.org/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
}
# Payload pour la requête POST (Région Bretagne)
payload = {
"type": "non_habilite",
"id": "",
"posted": "1",
"nom": "",
"prenom": "",
"cp": "",
"ville": "",
"code_region": "103", # Code Région de la Bretagne
"submit": "Rechercher",
}
# Requête POST pour récupérer la liste des architectes
response = requests.post(url, headers=headers, data=payload)
# Vérification de la requête POST
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
# Trouver les architectes avec la classe 'summary'
architects = soup.find_all("div", class_="summary")
# Liste pour stocker les IDs des architectes
architect_ids = []
# Parcourir les résultats et extraire les IDs
for architect in architects:
architect_id = architect.find("span", class_="id").text.strip()
architect_ids.append(architect_id)
print(f"ID trouvé: {architect_id}")
# Boucle sur chaque ID pour récupérer les détails via GET
for architect_id in architect_ids:
# Construire l'URL pour chaque architecte
detail_url = f"https://annuaire.architectes.org/architecte/{architect_id}/"
headers2 = {
"Accept": "text/html, */*; q=0.01",
"Accept-Language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7",
"Cookie": "PHPSESSID=b6103ufhlp8o30ba1m1me6vfte",
"DNT": "1",
"Priority": "u=1, i",
"Referer": "https://annuaire.architectes.org/",
"Sec-CH-UA": '"Chromium";v="129", "Not=A?Brand";v="8"',
"Sec-CH-UA-Mobile": "?0",
"Sec-CH-UA-Platform": '"macOS"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
detail_response = requests.get(detail_url, headers=headers2)
print(detail_response.text)
if detail_response.status_code == 200:
detail_soup = BeautifulSoup(detail_response.text, "html.parser")
# Récupérer la section des détails avec la classe 'details toprint'
details_section = detail_soup.find("div", class_="details toprint")
if details_section:
# Extraire les informations
nom = (
details_section.find("div", class_="elt nom")
.find("span", class_="value")
.text.strip()
)
prenom = (
details_section.find("div", class_="elt prenom")
.find("span", class_="value")
.text.strip()
)
adresse = (
details_section.find("div", class_="elt adresse")
.find("span", class_="value")
.text.strip()
)
telephone = (
details_section.find("div", class_="elt telephone")
.find("span", class_="value")
.text.strip()
)
email = details_section.find("div", class_="elt email")
email = email.find("a").get("href") if email else "Non fourni"
diplome = (
details_section.find("div", class_="elt diplome")
.find("span", class_="value")
.text.strip()
)
# Afficher les informations
print(f"\nDétails pour l'ID {architect_id}:")
print(f"Nom: {nom}")
print(f"Prénom: {prenom}")
print(f"Adresse: {adresse}")
print(f"Téléphone: {telephone}")
print(f"Email: {email}")
print(f"Diplôme: {diplome}")
else:
print(
f"Pas de section 'details toprint' trouvée pour l'ID {architect_id}"
)
else:
print(
f"Erreur lors de la requête GET pour l'ID {architect_id}: {detail_response.status_code}"
)
# Pause de 5 à 10 secondes entre les requêtes pour éviter d'être bloqué par le serveur
time.sleep(5 + (time.time() % 5))
else:
print(f"Erreur lors de la requête POST: {response.status_code}")