Impossible de scraper totalement annuaire.santé

Effectivement, stratégie de limite d’affichage classique — utilisé ici, sur Linkedin (max. 2500 profils), sur leboncoin (max. 3500 annonces) etc.

Il faut dans ces cas là segmenter ta recherche

  • par département
  • par profession

e.g. d’abord les dentistes du 75001, puis les dentistes du 75002 etc.


Attention, du côté technique, sur https://annuaire.sante.fr/ les données sont chargées dynamiquement

Il y a 2 requêtes

updateSearchCriteria — tu mets à jour tes critères de recherche

curl 'https://annuaire.sante.fr/web/site-pro/recherche/resultats?p_p_id=rechercheportlet_INSTANCE_ctPdpHA24ctE&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_rechercheportlet_INSTANCE_ctPdpHA24ctE_javax.portlet.action=rechercheAction&p_auth=9umZqncQ' \
  -H 'Accept: */*' \
  -H 'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryjmz8Gcga1OntmjAC' \
  -H 'Cookie: JSESSIONID=747347A854773B23C9E316C38BC3D3FE; COOKIE_SUPPORT=true; GUEST_LANGUAGE_ID=fr_FR; LFR_SESSION_STATE_20119=1696332052434' \
  -H 'Origin: https://annuaire.sante.fr' \
  -H 'Referer: https://annuaire.sante.fr/web/site-pro/recherche/resultats' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36' \
  -H 'X-PJAX: true' \
  -H 'X-Requested-With: XMLHttpRequest' \
  -H 'sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  --data-raw $'------WebKitFormBoundaryjmz8Gcga1OntmjAC\r\nContent-Disposition: form-data; name="_rechercheportlet_INSTANCE_ctPdpHA24ctE_texttofind"\r\n\r\ndentiste\r\n------WebKitFormBoundaryjmz8Gcga1OntmjAC\r\nContent-Disposition: form-data; name="_rechercheportlet_INSTANCE_ctPdpHA24ctE_adresse"\r\n\r\n75002\r\n------WebKitFormBoundaryjmz8Gcga1OntmjAC\r\nContent-Disposition: form-data; name="_rechercheportlet_INSTANCE_ctPdpHA24ctE_cordonneesGeo"\r\n\r\n\r\n------WebKitFormBoundaryjmz8Gcga1OntmjAC\r\nContent-Disposition: form-data; name="_rechercheportlet_INSTANCE_ctPdpHA24ctE_integralite"\r\n\r\nactive_only\r\n------WebKitFormBoundaryjmz8Gcga1OntmjAC\r\nContent-Disposition: form-data; name="_rechercheportlet_INSTANCE_ctPdpHA24ctE_typeRecherche"\r\n\r\ntextLibre\r\n------WebKitFormBoundaryjmz8Gcga1OntmjAC--\r\n' \
  --compressed

Et displayResults — tu affiches tes résultats de recherche

curl 'https://annuaire.sante.fr/web/site-pro/recherche/resultats' \
  -H 'Accept: */*' \
  -H 'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'Connection: keep-alive' \
  -H 'Cookie: JSESSIONID=747347A854773B23C9E316C38BC3D3FE; COOKIE_SUPPORT=true; GUEST_LANGUAGE_ID=fr_FR; LFR_SESSION_STATE_20119=1696332052434' \
  -H 'Referer: https://annuaire.sante.fr/web/site-pro/recherche/resultats' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36' \
  -H 'X-PJAX: true' \
  -H 'X-Requested-With: XMLHttpRequest' \
  -H 'sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  --compressed

C’est assez complexe — et sauf erreur de ma part, impossible à faire avec un click-to-scrape add-on.

Voilà ce qu’on récupère en continu sur le site:

Tu peux me contacter par MP.

NB: attention, j’ai anonymisé les données de contact pour des raisons évidentes de respect des données personnelles