Scraping Federation Francaise du Batiment

Bonjour à tous,

J’espère que vous allez bien et merci à tous pour ce forum aussi actif :slight_smile:

J’ai un petit problème : je scrap des sites avec Octoparse depuis pas mal de temps déjà et je n’ai jamais réellement été « bloqué » par un site (ou quand ça arrivait je passais par Dataminer en mode bourrin).

Sauf qu’aujourd’hui, je suis tombé sur cet annuaire de la Fédération française du bâtiment :

https://www.outils.ffbatiment.fr/federation-francaise-du-batiment/laffb/annuaire.html

Et là, pas moyen de faire quoi que ce soit… Octoparse ne m’est d’aucune utilité car :

  • Je n’ai pas un accès à la liste complète des entreprises
  • La multitude de filtres (notamment par région) rends le process trop long

Est-ce que quelqu’un a une idée de comment scraper ce site ? Ou qui arriverait à me partager une page avec toutes les entreprises que je puisse moi même scraper ?

Merci d’avance pour votre aide :slight_smile:

Elliot

le site m’a l’air assez compliqué à scraper effectivement, sauf à simuler un navigateur, on peut en discuter en MP je peux te proposer de le faire, sinon il existe d’autres annuaires comme https://www.artisans-du-batiment.com j’ai déjà les données, là aussi on peut en discuter

Salut Elliot,

pareil que djousto,
on offre ce type de service ( on a 2 apps : rocketlead et siretinfo)
ma société scrape les sites pour 50 /l’unité des nouveaux site et 30 quand c’est déja scrapé, on en fait environ 200 / mois , on a un salarié qui fait que ça
On pas fait le ffbatiment donc ca m’intéresse toujours de le rentrer
pour artisan du bâtiment on la en stock avec le script en maj, on passe par le sitemap sur celui ci de mémoire. Si ce que Djousto te propose ne t’interesse pas n’hesites pas me contacter.

Comme dit plus haut, la méthode simple, c’est de simuler un navigateur et de simuler les clicks sur chaque filtre (ça va être très long). Tu pourrais également passer par l’url, mais ce n’est pas forcément mieux de ce que je vois.

En tout cas, même en tant qu’utilisateur, l’UX est juste horrible, car tu dois remplir tous les filtres pour au final que l’on te retourne : « rien n’a été trouvé » :roll_eyes:

Merci @DJousto ! Je te contacte en MP :wink:

On est d’accord, l’UX est horrible :joy: Merci pour ta réponse @kalek19

Merci @Sonic, j’en discute avec Djousto et je reviens vers toi si besoin :wink:

on en discute avec Elliot, on va voir ce qu’on peut faire, après première analyse, personnellement ce que je ferais c’est construire une liste d’urls de recherche comme "https://www.outils.ffbatiment.fr/federation-francaise-du-batiment/laffb/annuaire.html?Typ=1&Rs=&SecteurActivite=B%c3%a2timent&Dep=01&Acti=704&Activite=Agencement&Comm=0 "
on peut facilement générer une liste d’urls pour chaque activité et département, mais ensuite la recherche des résultats est un gros code immonde javascript qui va construire des paramètres et cookies particuliers, et refaire une requete GET assez complexe, alors certes on pourrait faire de la rétro-ingénierie mais pas sur que l’enjeu en vaille la peine, du coup pour chaque url il vaut mieux lancer un navigateur type selenium, cliquer sur recherche, gérer la pagination, et récupérer les données

je sais pas si le site a été fait exprès pour contrer le scraping :laughing: en tout cas c’est réussi, mais je pencherais plutot pour un site fait avec les pieds et sous-traité quelque part en asie

1 « J'aime »

Vous avez réussi votre scrap ?

Il a vu çà avec Sonic je crois, je ne peux pas m’aligner sur ses tarifs !! :sweat_smile:

j’essaye de lui faire cela à la rentrée, enfin mon alternant ( c’est lui qui fait nos scrapes mais il a le covid la)

  1. Itérer sur « Secteur d’activité »
  2. Itérer sur « Activité »
  3. Itérer sur « Département »

Une fois ces trois dimensions prises en compte, récupérer les valeurs des dropdowns pour chaque dimension et les populer dans la querystring de cette URL en GET, ex. https://www.outils.ffbatiment.fr/federation-francaise-du-batiment/laffb/annuaire.html?Typ=1&Rs=&SecteurActivite=B%c3%a2timent&Dep=01&Acti=721&Activite=Autres+activit%c3%a9s&Comm=0

Chercher dans la réponse en HTML <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"> et récupérer son attribut value.

Faire POST sur la même URL mentionnée ci-dessus avec une payload x-www-urlencoded __VIEWSTATE = value.

Cela permet d’accéder à la page des résultats. Ensuite, checher tous les attributs href de ce format : javascript:__doPostBack(&#39;ctl00$ctl00$ContentPlaceHolderGlobal$ContentPlaceHolderContenu$RadGrid1$ctl00$ctl08$ctl00&#39;,&#39;&#39;) (penser à parser les éléments HTML-quoted)

Effectuer exactement la même requête POST mais en ajoutant __EVENTTARGET = ctl00$ctl00$ContentPlaceHolderGlobal$ContentPlaceHolderContenu$RadGrid1$ctl00$ctl04$ctl00 par exemple dans la payload.

Vous tombez sur la page contenant les coordonnées :

<div class="SG_CContent_StyleSheet_Right">
    <div class="StyleSheet">
        <h1>
            <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_NomLabel">CARRIERES DU VUACHE</span>
        </h1>
        <div class="SG_CContent_1_2 SG_CContent_Fiche left">
            <p>
            <p style="width: 16%;" class="left">
                <span class="couleur">Adresse:</span>
            </p>
            <p style="width: 90%; padding-left: 60px;" class="rignt">
                <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_AdresseLabel" style="display: block;">ZAE la vie Chatelme</span>
                <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_AdresseLabel1" style="display:none;"></span>
                <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_AdresseLabel2" style="display:none;"></span>
            </p>
            </p>
            <p>
                <span class="couleur">Code postal:</span>
                <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_CpLabel">01170</span>
            </p>
            <p>
                <span class="couleur">Ville:</span>
                <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_VilleLabel">CROZET</span>
            </p>
            <p>
                <span class="couleur">Tel:</span>
                <a id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_TelHyperLink"
                    href="tel:0450422383">04 50 42 23 83</a>
            </p>
            <p>
                <span class="couleur">Fax:</span>
                <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_FaxLabel"></span>
            </p>
            <p>
                <span class="couleur">Email:</span>
                <a id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_Ent_EmailHyperLink"
                    href="mailto:[email protected]">[email protected]</a>
            </p>
        </div>
        <div class="SG_CContent_1_2 SG_CContent_Fiche right">
            <div class="SG_CContent_box_1">
                <h5 class="couleur">
                    Activité de l'entreprise
                </h5>
                <ul class="liste_puce">
                    <li>
                        <p>
                            <span id="ctl00_ctl00_ContentPlaceHolderGlobal_ContentPlaceHolderContenu_FormView1_ListViewActivite_ctrl0_CoE_NomLabel">Autres</span>
                        </p>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</div>
<!-- fin SG_CContent_StyleSheet_Right -->
<div class="passage_ligne">
</div>
</div>

Répéter fois le nombre de href trouvés, fois le nombre de départements, fois le nombre d’activités, fois le nombre de secteurs d’activité.

1 « J'aime »

Faire un GET la dessus ne suffit pas, avec POSTMAN cela recharge juste la page de recherche avec les combobox selected.
Je pense qu’il faut gérer les cookies en plus pour avoir les résultats.

Comment gères-tu la pagination ?

Je n’ai pas fait le test jusqu’au bout du coup…

Non ça fonctionne même sans cookies pré-injectés.
La pagination fonctionne en postant le bon paramètre dans la querystring selon la dimension souhaitée et il faur parcourir les options du drop-down. Ensuite il faut récupérer le viewstate de chaque page.

Effectivement erreur de ma part.
Bravo, avec quelques petits réglages :wink: ça fonctionne bien de mon coté :+1:
Je n’ai pas la main pour le faire, mais pour moi le sujet est résolu !

1 « J'aime »

hello est-ce que vous avez réussi à scrapper ? Je suis intéressé par cette base svp (FFB ou artisans-du-batiment)