Cómo recolectar correos electrónicos de una página web usando PHP

Es una necesidad bastante usual la de recoger información disponible en Internet.

Algunos sitios permiten hacerlo en forma amigable exponiendo algún tipo de API, que puede ser consumida conectándose a un webservice.

En otros casos, lo mejor que puede hacerse es algo de WebScrapping.

Claro que es una técnica muy poco fiable y bastante costosa en términos computacionales, pero… si no queda otra…

En este caso, de lo que se trata es de extraer las direcciones de correo electrónico presentes en una página cualquiera, por ejemplo:

Se trata de un proceso de dos pasos

Cómo obtener los contenidos de una página usando PHP

El primer paso es obtener el contenido de la página. En realidad, lo que nos interesa es el HTML de la página, las imágenes, hojas de estilo y demás no es necesario en este momento.

Una forma muy sencilla de conseguirlo es usar la función file_get_contents:

<?php

$html = file_get_contents('http://pagina-objetivo.com');

Cómo identificar correos electrónicos dentro de un texto

El segundo problema a resolver es, una vez que obtuvimos todo ese texto HTML… ¿cómo podemos determinar qué direcciones de correo electrónico hay dentro?

Un modo muy simple es utilizar una expresión regular.

Afortunadamente, las direcciones de correo electrónico siguen un patrón bastante estructurado: todas tienen una @ en el medio y, al menos, un . a la derecha.

Podríamos usar una expresión mucho más compleja, pero comencemos por esta.

Nuestro aliado en esta ocasión será la función preg_match_all:

<?php

$html = file_get_contents('http://pagina-objetivo.com');
preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $html, $matches);

Con esto nos quedamos con todos los candidatos a correos electrónicos.

Luego, para mayor seguridad podemos eliminar aquellos que no pasen la verificación propia de PHP:

<?php

$html = file_get_contents('http://pagina-objetivo.com');
preg_match_all('/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $html, $matches);

$emails = array_unique(array_filter($matches, function(string $str) { return filter_var($str, FILTER_VALIDATE_EMAIL);}));

Con esto obtendremos un arreglo que contiene todas las direcciones de correo presentes en una página.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

4 comentarios

    1. Hola. En principio te diría que sí.

      Depende de cómo esté la configuración de tu entorno… ¿Tienes algún problema en particular?

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.