Scraper email carte interactive

Bonjour,

Je souhaiterai recupérer les emails présents sur une carte interactive :
https://capgeo.sig.paris.fr/Apps/CommercesLivraison/

Je n’ai aucune idée de comment m’y prendre.

Si vous avez des idées je suis preneur :slight_smile:

Merci !

Hello !

J’ai un peu fouillé dans les requêtes que le site émet et je pense que cette requête te renvoie tout ce qu’il te faut. Tu n’as plus qu’à copier le json et obtenir un csv.

https://capgeo.sig.paris.fr/arcgis/rest/services/capgeo_dicom/Commercants_livraison/MapServer/0/query?f=json&where=((1%3D1))&returnGeometry=true&spatialRel=esriSpatialRelIntersects&geometryType=esriGeometryEnvelope&inSR=102110&outFields=OBJECTID%2CLOC_NAME%2CSTATUS%2CSCORE%2CMATCH_TYPE%2CSIDE%2CMATCH_ADDR%2CARC_ADRESSE%2CARC_CODE%2CNOM_DU_COMMERCE%2CADRESSE%2CCODE_POSTAL%2CTYPE_DE_COMMERCE%2CPRECISIONS%2CSITE_INTERNET%2CTELEPHONE%2CMAIL%2CIDENTIFIANT%2CSE_ANNO_CAD_DATA&outSR=102110#

2 J'aimes

Tiens, utilises ce convertisseur de JSON to CSV:
http://convertcsv.com/json-to-csv.htm

  1. Rends toi dans la section « Step 1 », puis « Enter URL »:

  2. Dans « Enter URL as data source », tu mets ça:
    https://api.jsonbin.io/b/5eac21b307d49135ba48cb9e

  3. Tu cliques sur « Load URL », et voilà:

6 J'aimes

Woo merci beaucoup c’est génial !

Pour info comment passe t-on de la requête à l’url propre ‹ https://api.jsonbin.io/b/5eac21b307d49135ba48cb9e ›?

1 J'aime

Ca c’est moi qui t’ai décortiqué le JSON pour ne te mettre que la partie pertinente sur un service dédié qui me permet d’exposer de la donnée via une API, rien à voir avec le site.

1 J'aime

Ok merci à tous les deux

Salut,
peux tu nous expliquer ton process pour décortiquer le JSON pour en arriver à l’url fournie à Sebmonta ?

merci par avance

  1. Choper l’URL de la requête effectuée par le site qui permet d’obtenir toutes les données nous intéressant, au format JSON. Cette URL a été donnée par @BastienP:
https://capgeo.sig.paris.fr/arcgis/rest/services/capgeo_dicom/Commercants_livraison/MapServer/0/query?f=json&where=((1%3D1))&returnGeometry=true&spatialRel=esriSpatialRelIntersects&geometryType=esriGeometryEnvelope&inSR=102110&outFields=OBJECTID%2CLOC_NAME%2CSTATUS%2CSCORE%2CMATCH_TYPE%2CSIDE%2CMATCH_ADDR%2CARC_ADRESSE%2CARC_CODE%2CNOM_DU_COMMERCE%2CADRESSE%2CCODE_POSTAL%2CTYPE_DE_COMMERCE%2CPRECISIONS%2CSITE_INTERNET%2CTELEPHONE%2CMAIL%2CIDENTIFIANT%2CSE_ANNO_CAD_DATA&outSR=102110#
  1. Ouvrir cette URL dans un onglet du navigateur web de votre choix, en ayant pris d’installer une extension de visualisation de JSON (exemple JSONView), et regarder le JSON obtenu en réponse, histoire de savoir situer dans quelle sous-clé est située la donnée qui nous intéresse:

  2. On remarque que le tableau de données qui nous intéresse est associé à la clé features. On peut copier coller à la main dans le code source la portion de JSON nous intéressant, ou bien choper cette donnée en faisant la requête dans sa console JavaScript, et en affichant le contenu de la clé features, ainsi:

Code source JavaScript:

const fetchData = () => {
    const url = "https://capgeo.sig.paris.fr/arcgis/rest/services/capgeo_dicom/Commercants_livraison/MapServer/0/query?f=json&where=((1%3D1))&returnGeometry=true&spatialRel=esriSpatialRelIntersects&geometryType=esriGeometryEnvelope&inSR=102110&outFields=OBJECTID%2CLOC_NAME%2CSTATUS%2CSCORE%2CMATCH_TYPE%2CSIDE%2CMATCH_ADDR%2CARC_ADRESSE%2CARC_CODE%2CNOM_DU_COMMERCE%2CADRESSE%2CCODE_POSTAL%2CTYPE_DE_COMMERCE%2CPRECISIONS%2CSITE_INTERNET%2CTELEPHONE%2CMAIL%2CIDENTIFIANT%2CSE_ANNO_CAD_DATA&outSR=102110#";
    return fetch(url)
    .then(res=>res.json());
};
const jsonData = await fetchData();
JSON.stringify(jsonData.features);
  1. A partir de la chaine de caractère obtenue dans la console, on obtient le JSON de la liste de toutes les données qui nous intéresse, on peut alors la copier dans notre presse-papier via un « copié/collé »:

  2. Ensuite se créer un compte sur jsonbin dot io, et coller ce code JSON pour en faire une donnée accessible via une API / endpoint hébergé sur jsonbin, ce qui aura pour effet de créer un lien (lien de notre enpoint API donnant accès à nos données JSON).

1 J'aime

Top ton process !
Très clair, très pro !

merci pour cela !

Hello Bastien
Comment t’y prends-tu pour récupérer cette url ?

merci de ton retour

A priori, depuis la carte, une fois qu’on a pris soin de « cleaner » toutes les requêtes ayant transitées, et qu’on s’amuse à cliquer quelque part dans la carte et qu’on se positionne dans l’onglet « Network », filtre « XHR » activé, on voit cette requête qui passe:

https://capgeo.sig.paris.fr/arcgis/rest/services/capgeo_dicom/Commercants_livraison/MapServer/0/query?f=json&where=((1%3D1))&returnGeometry=true&spatialRel=esriSpatialRelIntersects&geometry=%7B%22xmin%22%3A649967.0499313268%2C%22ymin%22%3A6862730.708277043%2C%22xmax%22%3A650196.36158995%2C%22ymax%22%3A6862960.019935667%2C%22spatialReference%22%3A%7B%22wkid%22%3A102110%2C%22latestWkid%22%3A2154%7D%7D&geometryType=esriGeometryEnvelope&inSR=102110&outFields=OBJECTID%2CLOC_NAME%2CSTATUS%2CSCORE%2CMATCH_TYPE%2CSIDE%2CMATCH_ADDR%2CARC_ADRESSE%2CARC_CODE%2CNOM_DU_COMMERCE%2CADRESSE%2CCODE_POSTAL%2CTYPE_DE_COMMERCE%2CPRECISIONS%2CSITE_INTERNET%2CTELEPHONE%2CMAIL%2CIDENTIFIANT%2CSE_ANNO_CAD_DATA&outSR=102110

Or ici on voit que le tableau features est vide: []

En analysant un peu la tête de la requête et des paramètres passés en GET, puis en virant le paramètre geometry depuis les paramètres passés à la requête:

&geometry=%7B%22xmin%22%3A649967.0499313268%2C%22ymin%22%3A6862730.708277043%2C%22xmax%22%3A650196.36158995%2C%22ymax%22%3A6862960.019935667%2C%22spatialReference%22%3A%7B%22wkid%22%3A102110%2C%22latestWkid%22%3A2154%7D%7D

On obtient la requête qui permet de choper toutes les données, indépendamment d’un point précis de la carte. C’est ça @BastienP ?

2 J'aimes

Hello !

C’est exactement ça @ScrapingExpert, super tuto !

J’ai pris cette requête que le navigateur faisait à chaque fois que je cliquais sur un établissement et je l’ai décortiqué pour comprendre la structure. Et comme tu dis, il y avait des paramètres geometry pour renvoyer les informations propres à une structure, en les enlevant, l’API renvoie toutes les informations propres à toutes les structures.

On a aussi accès à un dashbord pour faire sa propre requête sur ce lien
https://capgeo.sig.paris.fr/arcgis/rest/services/capgeo_dicom/Commercants_livraison/MapServer/0/query

mais je n’ai pas plus creusé.

Merci encore pour tes tutos, ils sont très clairs

2 J'aimes

Merci à toi qui nous a mis sur la voie ! :slight_smile:

Merci messieurs !!!

Pour info, au sujet de la demande initiale, la mairie de Paris a développé un site ou elle met en ligne ses données :
https://parisdata.opendatasoft.com/pages/home/

Oups, j’arrive trop tard ! Mais je vais sortir un petit tuto vidéo dans la semaine sur le scraping de flux XHR, stay connected :wink:

1 J'aime

Hello, dans le même genre j’essaie de scraper ce site pour récupérer les mails & numéros de téléphone : https://plateforme.produits-locaux-nouvelle-aquitaine.fr/?entry_id=355279
J’ai essayé avec des outils comme web scraper ou data miner mais j’y arrive pas tout comme en regardant les requêtes dans Network (je suis pas expert) ! Si quelqu’un a la solution je prends :slight_smile:

Tu peux commencer par récupérer le JSON contenant la liste de tous les producteurs, on la trouve en bidouillant dans la console JavaScript, via la variable jsVars.producteurs :

image

Une fois ce JSON obtenu, tu peux faire un script pour envoyer les requêtes XHR pour récupérer le JSON de chaque page détails producteur.

[
  {
    "id": "354839",
    "categories": [
      "Bières et Cidres"
    ],
    "livraison": "les particuliers, les commerces alimentaires de proximité",
    "rayonLivraison": 0,
    "lat": "45.252012904109534",
    "lng": "1.6296532275390607",
    "public": "Oui"
  },
  {
    "id": "354676",
    "categories": [
      "Fromages et produits laitiers"
    ],
    "livraison": "les commerces alimentaires de proximité",
    "rayonLivraison": 0,
    "lat": "43.240687",
    "lng": "-1.028499",
    "public": "Oui"
  }

Hello @ScrapingExpert merci pour ta réponse !

Je retrouve pas la requête comprenant un ID producteur pour aller les chercher et ne serai pas capable de créer un script donc je vais me débrouiller autrement, merci bcp :slight_smile:

Si jamais tu veux voir où trouver les requêtes:

  • Quand tu cliques sur un des marqueurs indiquant un producteur sur la carte, on observe ceci:

  • Puis plus bas, en dessous des headers de la requête POST / XHR, on peut voir l’ID passé dans le body de cette requête: