Scraping Chirurgien

Salut à tous :slight_smile:
Je galère un peu sur un scraping un peu particulier : Résultats de recherche - L'Annuaire Santé

Je cherche à scraper les chirurgiens de France et je suis naturellement tombé sur cet annuaire.
On est limité à 10 pages par recherche, et il n’y a rien de fou dans le sitemap.

Je cherche plutot a comprendre comment faire plutot qu’une presta ^^
Je gère le python pour cela, mais aussi en no code évidement, mais pas assez tout ce qui est onglets network etc :wink:
Merci à vous !

Hello !

Spoiler : j’ai pas réussi :sweat_smile: (ma fierté en a pris un petit coup)

Quand je réplique la requête avec le js activé, et même un scénario js pour attendre (car le site est très lent), j’obtiens 0 résultats, alors que des résultats étaient bien présents sur navigateur…

Il doit y avoir des ID / cookies à passer de requête en requête pour garder la même session, mais je ne trouve pas d’où ils viennent !

Je te donne ma dernière version de code, si jamais ca peut t’être utile… Sinon tes données sont accessibles ici il me semble : https://annuaire.sante.fr/web/site-pro/extractions-publiques

Interessé si jamais quelqu’un y arrive !

(j’utilise The best web scraping API comme proxy, le prix d’entrée est de 2e)

import requests
import json
from urllib.parse import urlencode

API_KEY = (
    "API_SCRAPING_FISH"
)
proxy_url = "https://scraping.narf.ai/api/v1/"

base_url = "https://annuaire.sante.fr/web/site-pro/recherche/recherchecarto"

params = {
    "p_p_id": "rechercheportlet_INSTANCE_Op0iv2YnHPvJ",
    "p_p_lifecycle": "1",
    "p_p_state": "normal",
    "p_p_mode": "view",
    "_rechercheportlet_INSTANCE_Op0iv2YnHPvJ_javax.portlet.action": "rechercheCoordoneesAction",
    "p_auth": "zY8lhC7u",
}


target_url = f"{base_url}?{urlencode(params)}"

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",
    "dnt": "1",
    "priority": "u=0, i",
    "referer": "https://www.google.com/",
    "sec-ch-ua": '"Chromium";v="129", "Not=A?Brand";v="8"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"macOS"',
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "cross-site",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "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",
}

data = {
    "_rechercheportlet_INSTANCE_Op0iv2YnHPvJ_texttofind": "",
    "_rechercheportlet_INSTANCE_Op0iv2YnHPvJ_cordonneesGeo": "48.09840368374199,-1.675972198742392",
    "_rechercheportlet_INSTANCE_Op0iv2YnHPvJ_integralite": "active_only",
}

query_params = {
    "api_key": API_KEY,
    "url": target_url,
    "render_js": "true",
    "headers": json.dumps(headers),
    "cookies": json.dumps(
        [
            {"name": "JSESSIONID", "value": "27813B6KE8F9C9C6CF0C04EA11B6E2FD"},
            {"name": "COOKIE_SUPPORT", "value": "true"},
            {"name": "GUEST_LANGUAGE_ID", "value": "fr_FR"},
            {"name": "LFR_SESSION_STATE_20119", "value": "1727946283190"},
        ]
    ),
    "js_scenario": json.dumps({"steps": [{"wait": 200_000}]}),
    "total_timeout_ms": 210_000,
}


response = requests.post(proxy_url, params=query_params, json=data)

print(response.text)

1 « J'aime »

Sinon la requête POST dans le browser renvoie un statut 302 FOUND avant de trigger une autre requête. Mais normalement le module requests redirige les url par défaut…

Yes je suis parti sur la même méthode et flop :smiley:

Effectivement j’ai regardé extraction publique et non malheureusement les données cherchéesne sont pas dedans :confused:
En plus j’aimerais quand même bien y arriver :wink:

Il n’y a pas les données que tu veux dans l’export proposé ici ?
https://annuaire.sante.fr/web/site-pro/extractions-publiques
J’ai vu des tel et emails…
Tu voulais quoi en plus ?

Non en fait dedans par exemple il n’y a pas les mail des chirurgiens par exemple (sauf dentiste)

Ma cible étant par exemple les chirurgiens viscéral

quand il n’ya plus d’espoir, une seul personne peut faire le taf!

vous savez qui s’est ?

tie-knot

Non toujours pas :

T6ALTa

c’est la @LaGruge

giphy

4 « J'aime »
2 « J'aime »

Donc si je comprends bien par exemple

Je dois d’abord faire une requête de recherche, par exemple
Chirurgien → 07100
Attendre que ça charge
Et récupérer lez donnés affiches en gros

Et ce pour chaque Code Postale

Ça va pas aller vite cette histoire :smiling_face_with_tear:

ou @etal ? :wink:

3 « J'aime »