Récupérer email journaldesfemmes

Bonjour à tous,
Je souhaite lancer une campagne publicitaire pour notre nouveau site internet, pour cela j’ai penser à scraper les site annuaire pour les crèches et collectivités.

Ma première cible serait:

l’avantage: url des crèche est un numéro donc facile a trouver meme si cela est séquentiel :wink:
exemple: ACCUEIL FAMILIAL à Nantes (44000)

Je souhaite apprendre le scraping et je suis entrain de tester avec import.io après un echec avec webscraper.

Avez vous une solution pour scraper ou récupérer efficacement des email sur ce genre de site internet ?

Je serais prêt a payer une formation ou des tutoriels car cela pourrait mettre d’une grande aide dans les mois futur :slight_smile:

Merci beaucoup pour votre aide, votre partage de savoir et de vos connaissance mise à disposition de tous ! have fun :wink:

2 « J'aime »

Si tu es en mesure d’obtenir la liste complète des URLs des pages crèches, alors tu peux utiliser cette liste (en CSV par exemple) pour l’injecter en tant qu’input dans Dataminer

Ou alors, créer une fausse page HTML contenant toutes ces URLs sous forme de liens <a href="https://www.journaldesfemmes.fr/maman/creches/micro-creche-les-souris-vertes-de-sainte-neomaye/creche-7850">MICRO-CRÈCHE LES SOURIS VERTES DE SAINTE NEOMAYE</a> , et à partir de cette page HTML, créér un scénario avec Webscraper, qui ira cliquer sur chacun des liens pour extraire les infos depuis chaque page crèche.

Salut scraping expert, comment obtenir la liste complète des URLs des pages crèches ? screaming frog ?

J’ai réussi à extraire avec import.io mais qu’une partie

C’est toi même qui a donné la solution, simplement en incrémentant l’ID à la fin de l’URL :slight_smile:

En gros, tu prends ce pattern:

https://www.journaldesfemmes.fr/maman/creches/-/creche-XXXX

En faisant varier XXXX par l’un des chiffres inclus dans la séquence 0-10 000 par exemple (faudrait trouver le min et le max)

oui sauf que entre temps je viens de voir que c’est plus complex que prévus… en effet parfois ca change et j’ai pu récupérer que 300 mail comme ca et en plus les mails sont en doublon xD

je partage ma découverte: site:www.site.fr/xxx/xx « xxx""@orange.fr »
par exemple permet sur google de découvrir tout les mail en orange.fr pour ce qui est de faire du volume avec ceci…

A ce stade, si tu veux récupérer l’intégralité des données, soit il faudrait maîtriser à 100% WebScraper, soit savoir coder pour faire ton propre robot d’extract…

Il te reste à te poser la question: veux tu passer beaucoup de temps là dessus, ou bien déléguer cette tâche, car à priori ce n’est pas sur l’automatisation ou sur la partie extraction que tu vas apporter de la plus-value, tu risques d’y passer du temps, temps que tu pourrais mettre au profit des sujets que tu maitrises vraiment et où tu apportes de la valeur ajoutée.

1 « J'aime »

ok merci beaucoup, pourrais tu faire cette prestation ou serais tu sur quel site je pourrais trouver cela ?

J’ai réussi avec Parsehub mais c’est grave long en free et limité à 200 link pour illimité c’est payant donc si je trouve une alternative c’est cool

De manière générale, je code tous mes propres scripts d’extraction. Je pêche clairement coté tools déjà existants, ce n’est pas mon data.

Je saurais le faire avec un outil comme Dataminer, mais il limite aux 500 premières pages (gratuites), au delà, il faut payer.

J’ai bien un framework maison qui fait le job, mais je préfére laisser la place aux plus smarts qui connaissent l’outil déjà existant qui ferait le job pour rien, si ça existe :slight_smile:

1 « J'aime »

ok ca marche merci, je vais voir si je trouve quelqu’un qui pourrait me le faire. J’ai perdu trop de temps la dessus.

Salut @Papouille,
Sans vouloir faire de la comm pour notre outil, tu peux facilement extraire la liste des crèches dont nous disposons des contacts sur Societeinfo (et il y’en a pas mal…)

Alex

Salut Alex, merci pour ta participation, si ton outil peut m’avoir une base mail de qualité ce m’intéresse

Tu auras besoin de plus de 10 000 crédits, les 7K crédits étant déja à 299€ HT.

Non pas besoin d’autant. En effet, nous décomptons 1 crédit par SIREN même s’il y’a plusieurs contacts :wink:

@Papouille, je tuais le temps cet après midi et j’ai vu ce thread.

J’arrive un peu après la bataille mais si tu maîtrises a minima Python je te partage mon code. En ce moment même il mouline et il en est à +5000 emails

Voici mon code:

#!/usr/bin/env python
# coding: utf-8

#On importe quelques librairies utiles
import json
import requests
from bs4 import BeautifulSoup

import pandas as pd
import numpy as np 



#On définit la fonction qui récupèrera les détails de chaque page interrogée

def getDetails(url):
    
    #On interroge l'adresse
    response = requests.get(url)
    
    #Si la réponse est une erreur (la page n'existe pas), on interrompt la fonction
    if response.status_code == 404:
        return None
    
    #BeautifulSoup sert à "parser" / décomposer les infos d'une page html
    soup = BeautifulSoup(response.content)
    
    #On extrait l'id de l'établissement
    creche_id = url.split('/')[-1]
    #On extrait le nom de l'établissement
    name = soup.find('div', {'class':'marB20'}).find('h1').text
    
    
    
    ## Tout un tas de champs que l'on teste
    
    #Le nom du gestionnaire
    try:
        manager = soup.find('p',text=re.compile("Gestionnaire"))
        manager = manager.text.replace("Gestionnaire :",'').strip()
    except:
        manager = None
    #La date de la création de la structure (si elle existe...)
    try:
        opening_date = soup.find('p',text=re.compile("Date d'ouverture"))
        opening_date = opening_date.replace("Date d'ouverture :",'').strip()
    except:
        opening_date = None
        
    #Et tous les autres champs qui nous interessent
    try:
        type_creche = soup.find('td',text=re.compile("Type de la structure")).find_next('td').contents[0]
    except:
        type_creche=None
    
    try:
        capacity = soup.find('td',text=re.compile("Capacité d'accueil")).find_next('td').contents[0]
    except:
        capacity=None
      
    try:
        geo = soup.select('div[data-leaflet*=latitude]')
        geo = json.loads(geo[0].get('data-leaflet'))
        lat = geo['center']['latitude']
        lng = geo['center']['longitude']

    except:
        lat = lng = None
    
    try:
        info_table = soup.find(text=re.compile("Adresse e-mail")).find_parent('table')
        full_address = info_table.find(text=re.compile("Adresse postale")).find_next('td').contents
        address = full_address[0]
        city = full_address[-1]
    except:
        address = city = None
    try:
        phone = info_table.find(text=re.compile("Numéro de téléphone")).find_next('td').contents[0]
    except:
        phone=None
    
    try:
        email = info_table.find(text=re.compile("Adresse e-mail")).find_next('td').contents[0]
        email = email.text
    except:
        email=None
    
    #Une fois fini, la fonction retourne les données extraites
    return dict(creche_id = creche_id, name=name,capacity=capacity, manager=manager,
                opening_date=opening_date,
                address = address,city=city,
                lat=lat, lng= lng, phone= phone, email=email)



#On génère une liste d'adresses que l'on va visiter
liste_url = []

#Ici on fait une boucle jusqu'à 100000 mais c'est une borne au hasard
#On trouve des réponses à ce niveau là
#Plus le chiffre est important, plus le script va être long

borne_max = 100000
for i in range(1, borne_max):
    liste_url.append("https://www.journaldesfemmes.fr/maman/creches/-/creche-{}".format(i))


#Cette variable va stocker les resultats
creches_details_results = []

#On fait une boucle dans la liste d'adresses générées
for idx, creche in enumerate(liste_url):
    print(creche)    
    
    #La variable ci-dessous appelle la fonction "getDetails" qui donne les détails par établissement
    res = getDetails(creche)
    
    #S'il n'y a pas de résultat on passe à l'adresse suivante
    if res == None:
        continue
        
    #Sinon on ajoute le résultat à notre liste
    creches_details_results.append(res)
    
    print(len(creches_details_results), "crèches trouvées")
    print(len([x for x in creches_details_results if x['email'] != None]), 'emails trouvés')
    print(int((idx/borne_max)*100), "% accomplis")
    print()
    


df = pd.DataFrame(creches_details_results)
df = df[['creche_id','name','capacity','manager', 'address',  'city',  'email', 
         'opening_date', 'phone', 'lat', 'lng']]
print(len(df.email.unique()), "adresses email uniques")
df.head(2)


#Export vers Excel
df.to_excel("output.xlsx", index=False)

Fonctionne en Python v3 et probablement aussi en v2.

1 « J'aime »

merci beaucoup ! maintenant je me lance dans l’apprentissage de python , j’ai lu que c’est le code incontournable aujourd’hui alors go ahead :smiley: merci beaucoup ! maintenant je me lance dans l’apprentissage de python , j’ai lu que c’est le code incontournable aujourd’hui alors go ahead :smiley:

je dois apprendre python v1 et V2 ou directement python v3 ?

Oops… un long weekend avant que je ne vois ta réponse.

Commence directement avec la v3, aujourd’hui c’est ce qu’il y a de plus logique. Bon apprentissage !