Regex solide pour récupérer des mails ?

Hello !

Je suis en train de développer beaucoup de scripts de scraping web, et je cherche en ce moment à naviguer dans les pages d’un site web à la recherche de mails à extraire.

Ma cible est principalement des TPE/PME, et beaucoup (à juste titre) essaient d’éviter le scraping en changeant le format des mails sur leur site, par exemple :

contact@google[.]fr
contact(at)google.fr
contact[@]google.fr
contact ( at ) google ( . ) fr

Cette liste est loin d’être exhaustive et il y a beaucoup de déclinaisons possibles.

Est-ce que l’un d’entre vous a déjà été confronté à ce problème et a trouvé/écrit une regex magique qui bypass ces protections, et qu’il veut bien partager ici ?

Sinon, je pense à traiter en amont le rendu html de la page en supprimant les caractères spéciaux type [ ] ( ) et les espaces … mais ça s’annonce plus chronophage.

Quelqu’un a une piste ? Merci d’avance ! :v:

edit : je viens de voir cette API de PhantomBuster, je vais l’essayer pour voir ce que ça donne … mais je préfèrerais avoir un dev maison fonctionnel

1 « J'aime »

Hello,
De mémoire, cela m’avait pris plusieurs jours…
Un seul conseil, écris la par toi même en te basant sur tous les cas que tu as rencontré, elle sera certainement plus exhaustive que celle de n’importe qui d’autre :slight_smile:

1 « J'aime »

Tiens une 1ère piste, à améliorer mais ça fait déja un bon job :slight_smile:

const extractEmail = string => {
	const emailRegex = /([a-z0-9_\.-]+\s?[\(\[]?\s?(?:@|at)\s?[\)\]]?\s?[a-z0-9_-]+\s?[\(\[]?\s?\.\s?[\)\]]?\s?[a-z]{2,5})/i
	return emailRegex.test(string)
		? string.match(emailRegex)[1].replace(/\s?[\(\[]?\s?(?:@|at)\s?[\)\]]?\s?/i, "@").replace(/\s?[\(\[]?\s?\.\s?[\)\]]?\s?/i, ".")
		: ""
};

Résultats des tests:

3 « J'aime »

Merci beaucoup @ScrapingExpert ! :heart_eyes:

Sachant que j’utilise rarement des regex et que je dois réapprendre à les écrire à chaque fois dès que ça se complique un peu, je vais pouvoir partir de ce que tu as fais ! Merci merci !

Pour la suite je vais essayer deux méthodes :

  • Avancer sur ta regex pour en avoir une très solide.
  • Essayer de remplacer les caractères spéciaux en leur équivalent mail, par exemple [ at ] devient @ avant d’appliquer une regex plus classique.

Je ferai un retour sur ce postes avec la meilleure méthode :slight_smile:

C’est ce que ce bout de code fait déja à lui seul :slight_smile:

string.replace(/\s?[\(\[]?\s?(?:@|at)\s?[\)\]]?\s?/i, "@").replace(/\s?[\(\[]?\s?\.\s?[\)\]]?\s?/i, ".")

Oh. Bien vu, j’ai répondu rapidement sans regarder le détail, merci beaucoup !

il est incroyable ce @ScrapingExpert !

1 « J'aime »