Scrap du tableau de l'ordre des architectes

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}")

1 « J'aime »