logotipo proxyscrape oscuro

Scraping Direcciones de Correo Electrónico Usando Python - Guía Definitiva 2024

Python, Scraping, Dic-02-20225 minutos de lectura
Disponer de una lista de direcciones de correo electrónico puede ayudar a los profesionales del marketing a ampliar sus negocios. Mediante el scraping de direcciones de correo electrónico con scripts de Python, los empresarios pueden llegar mejor a su público. 
MailButler.io afirma que hay casi 4.300 millones de usuarios de correo electrónico en todo el mundo, y se calcula que alcanzarán los 4.600 millones en 2025. Estas estadísticas dicen que la gente en su mayoría dependen de la plataforma de correo electrónico para su modo oficial de comunicación. Este artículo le guiará a través del proceso de raspado de direcciones de correo electrónico utilizando el lenguaje python. 

Índice

Raspado de direcciones de correo electrónico con Python

Una de las formas más sencillas de tener una buena clientela es disponer del mayor número posible de direcciones de correo electrónico de empresas y enviarles una y otra vez los detalles de tus servicios. Hay muchas herramientas de scraping presentes en Internet que ofrecen estos servicios de forma gratuita, pero tienen límites de extracción de datos. También ofrecen límites ilimitados de extracción de datos, pero son de pago. ¿Por qué pagarles cuando puedes construir una con tus propias manos? Vamos a discutir los pasos para construir una herramienta de scraping de calidad utilizando Python. 

Artículos relacionados

Pasos para raspar direcciones de correo electrónico

Aunque será un ejemplo muy simple para los principiantes, será una experiencia de aprendizaje, especialmente para aquellos que son nuevos en el web scraping. Este será un tutorial paso a paso que le ayudará a obtener direcciones de correo electrónico sin límites. Comencemos con el proceso de construcción de nuestro raspador web inteligente.

Paso 1: Importación de módulos

Para nuestro proyecto utilizaremos los seis módulos siguientes.

importar re
import requests
from urllib.parse import urlsplit
from collections import deque
from bs4 import BeautifulSoup
import pandas como pd
from google.colab import ficheros

A continuación se detallan los módulos importados:

  1. re es para la concordancia de expresiones regulares.
  2. para enviar peticiones HTTP.
  3. urlsplit para dividir las URL en partes componentes.
  4. deque es un contenedor en forma de lista que se utiliza para agregar y quitar en ambos extremos.
  5. BeautifulSoup para extraer datos de archivos HTML de diferentes páginas web.
  6. pandas para formatear el correo electrónico en DataFrame y para otras operaciones.

Paso 2: Inicialización de variables

En este paso, inicializaremos un deque que guardará las URL raspadas, las URL no raspadas y un conjunto de correos electrónicos de guardado raspados con éxito de los sitios web.

# leer url desde input
original_url = input("Introduzca la url del sitio web: ") 
 
# guardar urls a raspar
unscraped = deque([url_original])
 
# para guardar las urls raspadas
scraped = set()
 
# para guardar los correos obtenidos
emails = set()  

No se permiten elementos duplicados en un conjunto, por lo que todos son únicos.

Paso 3: Iniciar el proceso de raspado

  1. El primer paso consiste en distinguir entre las URL raspadas y las no raspadas. La forma de hacerlo es pasar una URL de no raspada a raspada.
while len(unscraped):
    # mover unsraped_url a scraped_urls set
    url = unscraped.popleft() # popleft(): Elimina y devuelve un elemento del lado izquierdo del deque
    scraped.add(url)
  1. El siguiente paso es extraer datos de diferentes partes de la URL. Para ello, utilizaremos urlsplit.
partes = urlsplit(url)

urlsplit() devuelve una 5-tupla: (esquema de direccionamiento, ubicación de red, ruta, consulta, fragmento, identificador).

No puedo mostrar ejemplos de entradas y salidas para urlsplit() debido a razones confidenciales, pero una vez que lo intente, el código le pedirá que introduzca algún valor (dirección de sitio web). La salida mostrará el SplitResult(), y dentro del SplitResult() habría cinco atributos.

Esto nos permitirá obtener la base y la parte de la ruta para la URL del sitio web.

base_url = "{0.scheme}://{0.netloc}".format(parts)
    if '/' in parts.path:
      path = url[:url.rfind('/')+1]
    else:
      path = url
  1. Este es el momento de enviar la solicitud HTTP GET al sitio web.
intentar:
        response = requests.get(url)
    except (requests.exceptions.MissingSchema, requests.exceptions.ConnectionError):
        # ignora las páginas con errores y continúa con la siguiente url
       continuar
  1. Para extraer las direcciones de correo electrónico utilizaremos la expresión regular y luego las añadiremos al conjunto de direcciones de correo electrónico.
# Puede editar la expresión regular según sus necesidades
    new_emails = set(re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.com", 
                  response.text, re.I)) # re.I: (ignorar mayúsculas y minúsculas)
    emails.update(correos_nuevos)
Las expresiones regulares son de enorme ayuda cuando quieres extraer la información que desees. Si no te sientes cómodo con ellas, puedes echar un vistazo a Python RegEx para más detalles.
  1. El siguiente paso es encontrar todas las URL vinculadas al sitio web.
# crear una sopa beutiful para el documento html
   soup = BeautifulSoup(response.text, 'lxml')

The <a href=””> tag indicates a hyperlink that can be used to find all the linked URLs in the document.

for ancla in sopa.encontrar_todos("a"): 
        
       # extraer url enlazada del ancla
        if "href" in anchor.attrs:
          link = anchor.attrs["href"]
        else:
          link = ''
        
       # resolver enlaces relativos (que empiezan por /)
        if link.startswith('/'):
            link = base_url + link
            
        elif not link.startswith('http'):
            enlace = ruta + enlace

A continuación, encontraremos las nuevas URL y las añadiremos a la cola de no raspados si no están ni en el raspado ni en el no raspado.

Cuando pruebes el código por tu cuenta, te darás cuenta de que no todos los enlaces pueden ser raspados, por lo que también tenemos que excluirlos,

if not link.endswith(".gz" ):
         if not link in unscraped and not link in scraped:
              unscraped.append(link)

Paso 4: Exportar correos electrónicos a un archivo CSV

Para analizar mejor los resultados, exportaremos los correos electrónicos al archivo CSV.

df = pd.DataFrame(emails, columns=["Email"]) # sustitúyalo por el nombre de columna que prefiera
df.to_csv('email.csv', index=False)

Si utiliza Google Colab, puede descargar el archivo en su equipo local de la siguiente manera

from google.colab import archivos
files.download("email.csv")

Como ya he explicado, no puedo mostrar las direcciones de correo electrónico desechadas por cuestiones de confidencialidad. 

[Descargo de responsabilidad Algunos sitios web no permiten hacer web scraping y tienen bots muy inteligentes que pueden bloquear permanentemente tu IP, así que scrapea bajo tu propia responsabilidad].

Código completo

import re
import requests
from urllib.parse import urlsplit
from collections import deque
from bs4 import BeautifulSoup
import pandas as pd
from google.colab import files
 
# read url from input
original_url = input("Enter the website url: ") 
 
# to save urls to be scraped
unscraped = deque([original_url])
 
# to save scraped urls
scraped = set()
 
# to save fetched emails
emails = set()  
 
while len(unscraped):
    url = unscraped.popleft()  
    scraped.add(url)
 
    parts = urlsplit(url)
        
    base_url = "{0.scheme}://{0.netloc}".format(parts)
    if '/' in parts.path:
      path = url[:url.rfind('/')+1]
    else:
      path = url
 
    print("Crawling URL %s" % url)
    try:
        response = requests.get(url)
    except (requests.exceptions.MissingSchema, requests.exceptions.ConnectionError):
        continue
 
    new_emails = set(re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.com", response.text, re.I))
    emails.update(new_emails) 
 
    soup = BeautifulSoup(response.text, 'lxml')
 
    for anchor in soup.find_all("a"):
      if "href" in anchor.attrs:
        link = anchor.attrs["href"]
      else:
        link = ''
 
        if link.startswith('/'):
            link = base_url + link
        
        elif not link.startswith('http'):
            link = path + link

Proxies en el raspado de direcciones de correo electrónico

Dado que las empresas necesitan numerosas direcciones de correo electrónico para crear su lista de contactos, es necesario recopilar datos de múltiples fuentes. Un proceso manual de recopilación de datos puede resultar tedioso y llevar mucho tiempo. En este caso, los scrapers suelen recurrir a proxies para acelerar el proceso y eludir las restricciones que se les presentan. Proxyscrape proporciona proxies de gran ancho de banda que son capaces de scrapear datos ilimitados y funcionan las 24 horas del día, los 7 días de la semana, para garantizar un funcionamiento ininterrumpido. Su nivel de anonimato proxy es lo suficientemente alto como para ocultar la identidad de los raspadores. 

Preguntas frecuentes

1. ¿Por qué es necesario raspar las direcciones de correo electrónico?

Crear una lista de contactos potenciales con direcciones de correo electrónico cualificadas facilitará el proceso de llegar al público objetivo. Como la mayoría de la gente utiliza el correo electrónico como medio de comunicación, es bastante más fácil llegar a ellos a través de direcciones de correo electrónico. 

2. ¿Necesitamos proxies para rastrear direcciones de correo electrónico?

Al obtener las direcciones de correo electrónico de múltiples fuentes, los raspadores pueden enfrentarse a algunos problemas como bloqueos de IP o barreras geográficas. En este caso, los proxies ocultarán las direcciones de los usuarios con la dirección del proxy y eliminarán los bloqueos para acceder a sitios web bloqueados. 

3. ¿Es legal rastrear direcciones de correo electrónico? 

Siempre es legal recopilar datos de dominio público. Por lo tanto, los responsables del scraping deben asegurarse de que los datos que recopilan son de dominio público. Si no es así, pueden recopilar datos con permiso previo para mantener la legalidad en el scraping. 

Conclusión

En este artículo, hemos explorado una maravilla más de raspado web mostrando un ejemplo práctico de raspado de direcciones de correo electrónico. Hemos intentado el enfoque más inteligente al hacer nuestro rastreador web usando Python y es la biblioteca más fácil y sin embargo más potente llamada BeautfulSoup. Web Scraping puede ser de gran ayuda si se hace correctamente teniendo en cuenta sus necesidades. Aunque hemos escrito un código muy simple para el raspado de direcciones de correo electrónico, es totalmente libre de costo, y también, usted no necesita depender de otros servicios para esto. Hice mi mejor esfuerzo para simplificar el código tanto como sea posible y también añadió espacio para la personalización por lo que optimizar de acuerdo a sus propias necesidades. 

Si está buscando servicios proxy para utilizar durante sus proyectos de scraping, no olvide echar un vistazo a ProxyScrape proxies residenciales y premium