juuuding

Chapter 04 자동화 프로그램 만들기 #13 본문

Python/파이썬과 40개의 작품들

Chapter 04 자동화 프로그램 만들기 #13

jiuuu 2023. 2. 14. 02:05

 #13 이메일을 수집하여 엑셀에 기록하기

 

1. 이메일 형식을 추출하기

#정규식 표현 사용
import re

#테스트용으로 사용할 문자열 생성. 문자열 여러개 입력하기 위해 """ 사용
test_string = """
aaa@bbb.com
123@abc.co.kr
test@hello.kr
ok@ok.co.kr
ok@ok.co.kr
no.co.kr
no.kr
"""

#문자열에서 이메일 형식 찾아 리스트 형태로 결과 반환
result = re.findall(r'[\w\.-]+@[\w\.-]+',test_string)

print(result)

 

 


 

※ 정규 표현식

 

 (1) .(점) : 하나의 문자와 일치

 (2) [] : []안의 문자열은 순서와 상관없이 포함된 문자와 일치

 (3) [^ ] : []안에 포함되지 않은 문자 중 하나를 의미

 (4) ^ : 문자열의 시작 위치를 나타냄. 여러 줄에서 처리하는 때에는 각 줄의 시작을 나타냄

 (5) $ : 문자열의 마지막 위치 또는 개행 문자의 바로 앞 위치를 나타냄

 (6) () : 괄호 안의 일치되는 부분을 묶어서 사용 가능

 (7) \1 : 1~9까지의 숫자 표현

 (8) \w : 영어 소문자, 언더바, 영어 대문자, 숫자를 표현

 (9) * : 바로 앞의 패턴이 0번 이상 일치

 (10) {1,2} : 바로 앞의 패턴이 최소 1번 최대 2번 일치

 (11) ? : 바로 앞의 패턴이 0번 또는 1번 일치

 (12) + : 바로 앞의 패턴이 1번 이상 일치

 (13) | : 앞의 패턴 또는 뒤의 패턴 중 하나와 일치

 

 ex)

 

  [\w\.-]+@[\w\.-]+

 [영어 소문자, 언더바, 영어 대문자, 숫자, \, - ]에서 순서와 상관없이 포함된 문자의 패턴이 1번 이상 일치하고, 뒤에 @가 있고 또 그 뒤에 1번 이상 [영어 소문자, 언더바, 영어 대문자, 숫자, \, - ]에서 순서와 상관없이 포함된 문자의 패턴이 있어야 한다.

 


 

2. 리스트에서 중복 내용 제거하기

#정규식 표현 사용
import re

#테스트용으로 사용할 문자열 생성. 문자열 여러개 입력하기 위해 """ 사용
test_string = """
aaa@bbb.com
123@abc.co.kr
test@hello.kr
ok@ok.co.kr
ok@ok.co.kr
no.co.kr
no.kr
"""

#문자열에서 이메일 형식 찾아 리스트 형태로 결과 반환
results = re.findall(r'[\w\.-]+@[\w\.-]+',test_string)

#set을 사용하여 중복 제거
results = list(set(results))

print(results)

 

 

3. 사이트에서 이메일 수집하기

#사이트에 접속하기 위한 모듈
import requests
import re

url = 'https://n.news.naver.com/article/127/0000033674?cds=news_media_pc&type=editn'

#헤더 정보 입력. 하지 않을 시 로봇이 접속한 것으로 판단하여 응답하지 않는 사이트 많음
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Content-Type': 'text/html; charset=utf-8'
}

#url로 접속
response = requests.get(url, headers=headers)

#이메일 찾기
results = re.findall(r'[\w\.-]+@[\w\.-]+', response.text)

results = list(set(results))

print(results)

 

4. 수집한 이메일 주소를 엑셀에 저장하기

  * AttributeError: 'property' object has no attribute 'append'  이라는 오류가 난다.

#사이트에 접속하기 위한 모듈
import requests
import re
from openpyxl import load_workbook
from openpyxl import Workbook

url = 'https://n.news.naver.com/article/127/0000033674?cds=news_media_pc&type=editn'

#헤더 정보 입력. 하지 않을 시 로봇이 접속한 것으로 판단하여 응답하지 않는 사이트 많음
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Content-Type': 'text/html; charset=utf-8'
}

#url로 접속
response = requests.get(url, headers=headers)

#이메일 찾기
results = re.findall(r'[\w\.-]+@[\w\.-]+', response.text)

results = list(set(results))

print(results)

#email.xlsx 파일이 있어 읽어올 수 있다면 파일 읽기
try:
    wb = load_workbook(r"13. Recording to Excel\email.xlsx", data_only=True)
    sheet = wb.active

#email.xlsx 파일이 없다면 새로운 엑셀 생성
except:
    wb = Workbook
    sheet = wb.active


#이메일을 수집한 수 만큼 반복
for result in results:
    sheet.append([result])

wb.save(r"13. Recording to Excel\email.xlsx")