어두운 proxyscrape 로고

파이썬을 사용한 이메일 주소 스크래핑 - 궁극의 가이드 2024

Python, 스크래핑, 12월-02-20225분 읽기
이메일 잠재 고객 목록을 보유하면 마케팅 담당자가 비즈니스를 확장하는 데 도움이 될 수 있습니다. Python 스크립트를 사용하여 이메일 주소를 스크랩함으로써 비즈니스 담당자는 잠재 고객에게 더 효과적으로 다가갈 수 있습니다. 
MailButler.io에 따르면 전 세계 이메일 사용자는43억 명에 달하며 2025년에는 46억 명에 이를 것으로 예상됩니다. 이 통계에 따르면 사람들은 대부분 이메일 플랫폼을 공식적인 커뮤니케이션 수단으로 사용하고 있습니다. 이 글에서는 파이썬 언어를 사용하여 이메일 주소를 스크래핑하는 과정을 안내합니다. 

목차

파이썬을 사용하여 이메일 주소 스크래핑하기

좋은 고객을 확보하는 가장 쉬운 방법 중 하나는 가능한 한 많은 비즈니스 이메일 주소를 확보하고 서비스 세부 정보를 반복해서 보내는 것입니다. 인터넷에는 이러한 서비스를 무료로 제공하는 스크래핑 도구가 많이 있지만, 인출 데이터 한도가 있습니다. 또한 무제한 데이터 추출 한도를 제공하지만 유료입니다. 직접 만들 수 있는데 왜 돈을 지불해야 할까요? Python을 사용해 양질의 스크래핑 도구를 구축하는 단계에 대해 설명해 드리겠습니다. 

관련 기사

이메일 주소를 스크랩하는 단계

초보자에게는 매우 간단한 예시이지만, 특히 웹 스크래핑을 처음 접하는 분들에게는 학습 경험이 될 것입니다. 이 튜토리얼은 제한 없이 이메일 주소를 얻는 데 도움이 되는 단계별 튜토리얼이 될 것입니다. 지능형 웹 스크래퍼의 구축 과정부터 시작하겠습니다.

1단계: 모듈 가져오기

프로젝트에 다음 6가지 모듈을 사용할 것입니다.

import re
요청가져오기 
urllib.parse에서 urlsplit 가져오기 
컬렉션에서 deque를 가져옵니다.
bs4에서 BeautifulSoup를 가져옵니다.
팬더를 pd로가져 오기
google.colab에서 파일 가져오기

가져온 모듈에 대한 자세한 내용은 다음과 같습니다:

  1. re는 정규식 일치를 위한 것입니다.
  2. HTTP 요청을 보내기 위한 요청입니다.
  3. URL을 컴포넌트 부분으로 나누기 위해 URLSPLIT을 사용합니다.
  4. deque는 양쪽 끝에 추가 및 팝업을 위해 사용되는 목록 형식의 컨테이너입니다.
  5. 다양한 웹 페이지의 HTML 파일에서 데이터를 가져오기 위한 BeautifulSoup.
  6. 판다를 사용하여 데이터프레임으로 이메일 서식을 지정하고 추가 작업을 수행할 수 있습니다.

2단계: 변수 초기화

이 단계에서는 스크랩한 URL, 스크랩하지 않은 URL, 웹사이트에서 성공적으로 스크랩한 저장 이메일 집합을 저장하는 데크를 초기화합니다.

# 입력에서 URL 읽기
original_url = 입력("웹사이트 URL 입력: ") 
 
# 스크랩할 URL을 저장하려면
unscraped = deque([original_url])
 
# 스크랩된 URL을 저장하려면
scraped = set()
 
# 가져온 이메일 저장
emails = set()  

한 세트에 중복되는 요소는 허용되지 않으므로 모두 고유해야 합니다.

3단계: 스크래핑 프로세스 시작

  1. 첫 번째 단계는 스크랩한 URL과 스크랩하지 않은 URL을 구분하는 것입니다. 이를 수행하는 방법은 URL을 스크랩되지 않은 상태에서 스크랩된 상태로 이동하는 것입니다.
동안 len(unscraped):
    # unsraped_url을 scraped_urls로 옮기다 set
    url = unscraped.popleft() # popleft(): 덱의 왼쪽에서 요소를 제거하고 반환합니다.
    scraped.add(url)
  1. 다음 단계는 URL의 다른 부분에서 데이터를 추출하는 것입니다. 이를 위해 URLSPLIT을 사용합니다.
parts = urlsplit(url)

urlsplit()은 5-튜플:(주소 지정 체계, 네트워크 위치, 경로, 쿼리, 조각, 식별자)을 반환합니다.

기밀 사항으로 인해 urlsplit()의 샘플 입력 및 출력은 보여드릴 수 없지만, 일단 시도해 보면 코드에서 일부 값(웹사이트 주소)을 입력하라는 메시지가 표시됩니다. 출력에는 SplitResult()가 표시되며 SplitResult() 내부에는 5개의 어트리뷰트가 있습니다.

이렇게 하면 웹사이트 URL의 기본 및 경로 부분을 가져올 수 있습니다.

base_url = "{0.scheme}://{0.netloc}".format(parts)
    if '/' in parts.path:
      path = url[:url.rfind('/')+1]
    else:
      path = url
  1. 이제 웹사이트로 HTTP GET 요청을 전송할 때입니다.
try:
        response = requests.get(url)
    예외 (요청.예외.MissingSchema, 요청.예외.ConnectionError):
        # 오류가 있는 페이지를 무시하고 다음 URL로 계속 진행합니다.
       계속
  1. 이메일 주소를 추출하기 위해 일반 실험을 사용한 다음 이메일 세트에 추가합니다.
# 요구 사항에 따라 정규식을 편집할 수 있습니다.
    new_emails = set(re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.com", 
                  response.text, re.I)) # re.I: (대소문자 무시)
    emails.update(new_emails)
정규식은 원하는 정보를 추출하고자 할 때 큰 도움이 됩니다. 정규식에 익숙하지 않다면 Python RegEx에서 자세한 내용을 살펴볼 수 있습니다.
  1. 다음 단계는 웹사이트에 연결된 모든 URL을 찾는 것입니다.
# 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.

앵커의 경우 soup.find_all("a"): 
        
       # 앵커에서 링크된 URL 추출
       앵커의 "href "가 anchor.attrs:
          link = anchor.attrs["href"]
        else:
          link = ''
        
       # 상대 링크(/로 시작)를 해결합니다.
        if link.startswith('/'):
            link = base_url + link
            
        link.startswith('http')가 아닌 경우:
            link = 경로 + 링크

그런 다음 새 URL을 찾아서 스크랩된 대기열이나 스크랩되지 않은 대기열에 없는 경우 스크랩되지 않은 대기열에 추가합니다.

직접 코드를 시도해 보면 모든 링크를 스크랩할 수 있는 것은 아니므로 제외해야 한다는 것을 알 수 있습니다,

link.endswith(".gz" ):
         링크가 스크랩되지 않고 스크랩된 링크가 아닌 경우:
              unscraped.append(link)

4단계: 이메일을 CSV 파일로 내보내기

더 나은 방법으로 결과를 분석하기 위해 이메일을 CSV 파일로 내보냅니다.

df = pd.DataFrame(emails, columns=["Email"]) # 원하는  이름으로 바꾸기 
df.to_csv('email.csv', index=False)

Google Colab을 사용하는 경우 다음 방법으로 로컬 컴퓨터에 파일을 다운로드할 수 있습니다.

google.colab에서 파일가져오기
files.download("email.csv")

이미 설명했듯이 기밀성 문제로 인해 삭제된 이메일 주소는 보여드릴 수 없습니다. 

[고지 사항! 일부 웹사이트는 웹 스크래핑을 허용하지 않으며 매우 지능적인 봇이 사용자의 IP를 영구적으로 차단할 수 있으므로 스크래핑은 사용자의 책임 하에 진행하세요.]

코드 완성

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

이메일 주소 스크래핑의 프록시

기업에서는 연락처 목록을 작성하기 위해 수많은 이메일 주소가 필요하므로 여러 출처에서 데이터를 수집해야 합니다. 수동 데이터 수집 프로세스는 지루하고 시간이 많이 소요될 수 있습니다. 이 경우 스크래퍼는 일반적으로 프로세스 속도를 높이고 제한 사항을 우회하기 위해 프록시를 사용합니다. Proxyscrape 는 무제한 데이터를 스크래핑할 수 있고 연중무휴로 작동하는 고대역폭 프록시를 제공하여 중단 없는 기능을 보장합니다. 프록시 익명성 수준은 스크레이퍼의 신원을 숨길 수 있을 만큼 충분히 높습니다. 

자주 묻는 질문

1. 이메일 주소를 스크랩해야 하는 이유는 무엇인가요?

자격을 갖춘 이메일 주소로 잠재 연락처 목록을 만들면 타겟 고객에게 쉽게 다가갈 수 있습니다. 대부분의 사람들이 이메일을 커뮤니케이션 매체로 사용하기 때문에 이메일 주소를 통해 연락하는 것이 훨씬 더 쉽습니다. 

2. 이메일 주소 스크래핑을 위해 프록시가 필요한가요?

여러 소스에서 이메일 주소를 스크래핑하는 동안 스크래퍼는 IP 차단이나 지리적 장벽과 같은 몇 가지 문제에 직면할 수 있습니다. 이 경우 프록시는 프록시 주소로 사용자의 주소를 숨기고 차단된 웹사이트에 액세스할 때 차단을 제거합니다. 

3. 이메일 주소를 스크랩하는 것이 합법인가요? 

공개적으로 사용 가능한 데이터를 수집하는 것은 항상 합법입니다. 따라서 스크래퍼는 수집하는 데이터가 공개 도메인에서 사용 가능한 데이터인지 확인해야 합니다. 그렇지 않은 경우 스크래핑의 적법성을 유지하기 위해 사전 허가를 받아 데이터를 수집할 수 있습니다. 

마무리

이 글에서는 이메일 주소 스크래핑의 실제 예시를 보여줌으로써 웹 스크래핑의 또 하나의 놀라운 점을 살펴보았습니다. 가장 지능적인 접근 방식을 시도한 웹 크롤러를 Python으로 만들었으며, 가장 쉽고 강력한 라이브러리인 BeautfulSoup을 사용했습니다. 웹 스크래핑은 요구 사항을 올바르게 고려한다면 큰 도움이 될 수 있습니다. 이메일 주소를 스크래핑하는 매우 간단한 코드를 작성했지만 완전히 무료이며 다른 서비스에 의존할 필요도 없습니다. 코드를 최대한 단순화하기 위해 최선을 다했으며 사용자 정의의 여지를 추가하여 자신의 요구 사항에 따라 최적화 할 수 있도록했습니다. 

스크래핑 프로젝트에 사용할 프록시 서비스를 찾고 있다면 ProxyScrape 주거용 및 프리미엄 프록시를 살펴보세요.