escuro proxyscrape logótipo

Raspagem de endereços de e-mail usando Python - Guia definitivo 2024

Python, Raspagem, Dez-02-20225 minutos de leitura
Possuir uma lista de potenciais clientes de correio eletrónico pode ajudar os profissionais de marketing a expandir os seus negócios. Ao extrair endereços de correio eletrónico utilizando scripts Python, os profissionais de marketing podem alcançar melhor o seu público. 
O MailButler.io afirma que existem cerca de 4,3 mil milhões de utilizadores de correio eletrónico a nível mundial, estimando-se que atinjam os 4,6 mil milhões em 2025. Essas estatísticas dizem que as pessoas confiam principalmente na plataforma de e-mail para seu modo oficial de comunicação. Este artigo irá guiá-lo através do processo de raspagem de endereços de e-mail usando a linguagem python. 

Índice

Raspagem de endereços de e-mail usando Python

Uma das formas mais fáceis de obter uma boa clientela é ter o maior número possível de endereços de correio eletrónico de empresas e enviar-lhes repetidamente os detalhes do seu serviço. Existem muitas ferramentas de extração de dados na Internet que fornecem estes serviços gratuitamente, mas têm limites de extração de dados. Também oferecem limites ilimitados de extração de dados, mas são pagas. Porquê pagar-lhes quando pode construir uma com as suas próprias mãos? Vamos discutir os passos para construir uma ferramenta de raspagem de qualidade utilizando Python. 

Artigos relacionados

Passos para extrair endereços de e-mail

Embora seja um exemplo muito simples para principiantes, será uma experiência de aprendizagem, especialmente para aqueles que são novos na recolha de dados da Web. Este será um tutorial passo a passo que o ajudará a obter endereços de correio eletrónico sem quaisquer limites. Vamos começar com o processo de construção do nosso web scraper inteligente.

Passo 1: Importação de módulos

No nosso projeto, utilizaremos os seis módulos seguintes.

importar re
importar requests
from urllib.parse import urlsplit
from colecções import deque
from bs4 import BeautifulSoup
importar pandas as pd
from google.colab import files

Os pormenores dos módulos importados são apresentados a seguir:

  1. re é para correspondência de expressões regulares.
  2. para o envio de pedidos HTTP.
  3. urlsplit para dividir os URLs em partes componentes.
  4. O deque é um contentor que tem a forma de uma lista utilizada para acrescentar e retirar em ambas as extremidades.
  5. BeautifulSoup para obter dados de ficheiros HTML de diferentes páginas Web.
  6. pandas para a formatação do correio eletrónico em DataFrame e para outras operações.

Passo 2: Inicialização de variáveis

Nesta etapa, inicializaremos um deque que salvará URLs raspados, URLs não raspados e um conjunto de e-mails salvos raspados com êxito dos sites.

# ler o url da entrada
original_url = input("Introduza o url do sítio web: ") 
 
# guardar os urls para serem extraídos
unscraped = deque([original_url])
 
# para guardar os urls recolhidos
scraped = set()
 
# para guardar os emails recolhidos
emails = set()  

Não são permitidos elementos duplicados num conjunto, pelo que todos eles são únicos.

Passo 3: Iniciar o processo de raspagem

  1. O primeiro passo é distinguir entre os URLs raspados e os não raspados. A forma de o fazer é mover um URL de não raspado para raspado.
while len(unscraped):
    # move unsraped_url para scraped_urls set
    url = unscraped.popleft() # popleft(): Remove e devolve um elemento do lado esquerdo do deque
    scraped.add(url)
  1. O próximo passo é extrair dados de diferentes partes do URL. Para o efeito, utilizaremos o urlsplit.
partes = urlsplit(url)

urlsplit() devolve um tuplo de 5: (esquema de endereçamento, localização na rede, caminho, consulta, fragmento, identificador).

Não posso mostrar exemplos de entradas e saídas para urlsplit() devido a razões confidenciais, mas, se tentar, o código pedir-lhe-á que introduza um valor (endereço do sítio Web). A saída mostrará o SplitResult(), e dentro do SplitResult() haverá cinco atributos.

Isto permitir-nos-á obter a base e a parte do caminho para o URL do sítio Web.

base_url = "{0.scheme}://{0.netloc}".format(parts)
    if '/' in parts.path:
      path = url[:url.rfind('/')+1]
    else:
      path = url
  1. Este é o momento de enviar o pedido HTTP GET para o sítio Web.
tentar:
        response = requests.get(url)
    exceto (requests.exceptions.MissingSchema, requests.exceptions.ConnectionError):
        # ignora as páginas com erros e continua com o url seguinte 
       continuar
  1. Para extrair os endereços de correio eletrónico, utilizaremos a expressão regular e, em seguida, adicioná-los-emos ao conjunto de correio eletrónico.
# Pode editar a expressão regular de acordo com os seus requisitos
    new_emails = set(re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.com", 
                  response.text, re.I)) # re.I: (ignorar caso)
    emails.update(novos_emails)
As expressões regulares são de grande ajuda quando se pretende extrair a informação da sua própria escolha. Se não se sentir à vontade com elas, pode dar uma vista de olhos em Python RegEx para mais pormenores.
  1. O passo seguinte é encontrar todos os URLs ligados ao sítio Web.
# criar uma sopa bonita para o 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 anchor in soup.find_all("a"): 
        
       # extrair o URL ligado da âncora
        se "href" in anchor.attrs:
          link = anchor.attrs["href"]
        else:
          link = ''
        
       # resolver ligações relativas (começando por /)
        if link.startswith('/'):
            link = base_url + link
            
        elif not link.startswith('http'):
            link = path + link

Em seguida, encontraremos os novos URLs e adicioná-los-emos à fila não raspada se não estiverem na fila raspada nem na não raspada.

Quando experimenta o código, repara que nem todas as hiperligações podem ser extraídas, pelo que também temos de as excluir,

if not link.endswith(".gz" ):
         se não houver link em unscraped e não houver link em scraped:
              unscraped.append(link)

Passo 4: Exportar e-mails para um ficheiro CSV

Para analisar melhor os resultados, vamos exportar os emails para o ficheiro CSV.

df = pd.DataFrame(emails, columns=["Email"]) # substituir pelo nome da coluna que preferir
df.to_csv('email.csv', index=False)

Se estiver a utilizar o Google Colab, pode descarregar o ficheiro para o seu computador local

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

Tal como já foi explicado, não posso mostrar os endereços de correio eletrónico eliminados devido a questões de confidencialidade. 

[Aviso! Alguns sítios Web não permitem a recolha de dados e têm bots muito inteligentes que podem bloquear permanentemente o seu IP, pelo que a recolha de dados é feita por sua conta e risco].

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 na recolha de endereços de correio eletrónico

Como as empresas necessitam de numerosos endereços de correio eletrónico para construir a sua lista de contactos, é necessário recolher dados de várias fontes. Um processo manual de recolha de dados pode ser fastidioso e moroso. Neste caso, os scrapers recorrem normalmente a proxies para acelerar o processo e contornar as restrições que se lhes deparam. O Proxyscrape fornece proxies de grande largura de banda, capazes de recolher dados ilimitados e que funcionam 24 horas por dia, 7 dias por semana, para garantir uma funcionalidade ininterrupta. O nível de anonimato dos proxies é suficientemente elevado para esconder a identidade dos scrapers. 

Perguntas mais frequentes

1. Porque é que é necessário recolher endereços de correio eletrónico?

A criação de uma lista de contactos potenciais com endereços de correio eletrónico qualificados facilitará o processo de contacto com o público-alvo. Como a maioria das pessoas utiliza o correio eletrónico como meio de comunicação, é muito mais fácil contactá-las através de endereços de correio eletrónico. 

2. Precisamos de proxies para recolher endereços de correio eletrónico?

Ao extrair os endereços de correio eletrónico de várias fontes, os extractores podem enfrentar alguns desafios, como bloqueios de IP ou barreiras geográficas. Neste caso, os proxies ocultam os endereços dos utilizadores com o endereço proxy e eliminam os bloqueios no acesso a sítios Web bloqueados. 

3. É legal recolher endereços de correio eletrónico? 

É sempre legal recolher dados publicamente disponíveis. Assim, os scrapers devem certificar-se de que os dados que estão a recolher estão disponíveis no domínio público. Caso contrário, podem recolher dados com autorização prévia para manter a legalidade da recolha. 

Conclusão

Neste artigo, explorámos mais uma maravilha da recolha de dados da Web, mostrando um exemplo prático de recolha de endereços de correio eletrónico. Tentámos a abordagem mais inteligente, criando o nosso Web crawler utilizando Python e a biblioteca mais fácil e, no entanto, mais poderosa, chamada BeautfulSoup. A recolha de dados da Web pode ser de grande ajuda se for feita corretamente, tendo em conta as suas necessidades. Apesar de termos escrito um código muito simples para a recolha de endereços de correio eletrónico, é totalmente gratuito e, além disso, não precisa de recorrer a outros serviços para o fazer. Tentei o meu melhor para simplificar o código tanto quanto possível e também adicionei espaço para personalização para que o optimize de acordo com os seus próprios requisitos. 

Se estiver à procura de serviços de proxy para utilizar durante os seus projectos de scraping, não se esqueça de consultar ProxyScrape residential e premium proxies