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")