안녕 하 세요 . 대 자연 의 푸르름 이 # COVID 19 를 몰아내 길 바라 며 , 신록 의 계절 5 월 에 도 꾸준히 ( ? ) 코딩 읽 어 주 는 아재 깡 입니다 . ^^;; ( 대자연 의 거대 한 치유 능력 이 빨리 # 코로나 _ 바이러스 를 몰아내 고 우리 에게 소중 한 일상 을 되돌려 주 길 간절히 바 뤠봅니다 ~ ^^)​ 재미 로 주변 분 들 께 블로그 에서 개발 한 AI 로 또 명당 # 로또 번호 # 추첨 기 를 사용 해 보 시 라고 권해 드리 고 있 습니다 만 , 코딩 아재 가 여엉 ~ 못 미더운지 여전히 더 신빙 성 ( ? ) 있 는 # 로또 번호 _ 추천 을 요구 하 시 는 분 들 이 많 습니다 . 아마도 블로그 를 방문 하 시 는 여러분 들 도 비슷 한 생각 이 실 꺼 라고 생각 됩니다 . ( 뭐 저 도 로또 고수 가 당첨 번호 점지 ( ? ) 해 준다면 5 천 원 투자 할 의향 이 사알짝 ~ 있 거든요 . ^,^ ㅋ ) 이 문제 를 어떻 케 코딩 으로 해결 하 고 궁극 적 으로 블로그 모토 처럼 홍익인간 의 이념 을 실천 할 수 있 을 찌 고민 을 해 보 았 습니다 . ​ 좀 유치 하 다고 생각 하 실 찌 모르 겠 습니다 만 이런 내 능력 밖 의 문제 를 어떻게 풀 수 있 을까요 ? -.-? 뭐 답 없 음 , 내 알 바 아님 , GG 침 하 셔도 됩니다 만 . .. ( 이럼 무한 한 능력 의 슈퍼컴퓨터 급 우리 두뇌 를 올바르 게 사용 하 는 자세 는 아니 겠 찌요 ? -.- a ) 더 머리 를 굴려 보 자구요 . 돌 ~ 돌 ~ 돌 ~ ^^)​ ㅁ 우선 코딩 아재 개인 의 힘 으로 는 해결 이 힘드 니 집단지 성 ( ? ) 의 힘 을 이용 하 자 가 1 번 힌트 . ㅁ 우리나라 사람 들 만 주로 로또 를 하 니 1 등 # 검색 엔진 # 네이버 _ 검색창 을 이용 해 보자 가 2 번 힌트 . ㅁ 웹 에 코딩 아재 보다 뛰어난 누군가 가 추천 해 준 번호 를 활용 하 자 가 마지막 3 번 힌트 . 하 여 # 데이터 과학 에서 사용 하 는 # 웹 크롤링 ( # web _ crawling , # 웹 스 크 래핑 , # web _ scrapping ) 기법 을 사용 해서 해결책 을 찾아보 았 습니다 . ( 구현 에 는 서로 이웃 이 고 제 가 # 머신 러닝 관련 하 여서도 자주 방문 하 고 있 는 # 패턴 분석가 님 의 블로그 글 을 마니 참조 하 였 습니다 . 지면 을 빌 어 감사 말씀 드립니다 . ^^ https : / / blog . naver . com / jaehong 7719 ) ​ 근거 는 좀 빈약 ( ? ) 하 지만 네이버 블로거 들 중 에서 로또 고수 가 있 어 네이버 검색창 이 그 답 을 주기 를 간절히 ( ? ) 바라 며 # 파이썬 웹 크롤링 관련 모듈 을 활용 하 여 # 웹 데이터 _ 가져오 기 를 # 자동 화 해 보 았 습니다 . ( 네이버 검색 결과 를 활용 하 여 유용 한 정보 를 추출 해 보 고 싶 은 분 들 께 는 따라 해 보 기 예제 의 의미 도 있 을 듯 합니다 . ^^) ​ 작업 순서 는 아래 와 같 습니다 . 1 . 파이썬 웹 크롤링 모듈 들 import 2 . 네이버 검색 용 키워드 문자열 만들 기 ( 예제 로 " 로또 + 행운 의 숫자 " 사용 ) 3 . 키워드 를 사용 하 여 검색 해 주 는 함수 searchKeyword ( ) 를 호출 하 고 결과 를 titleList 리스트 에 담 기 3 . 1 . 키워드 를 포함 한 네이버 검색 식 만들 기 3 . 2 . # urllib . request . urlopen ( url ) . read ( ) 식 으로 검색 된 웹 페이지 가져오 기 3 . 3 . # BeautifulSoup 모듈 로 페이지 파싱 하 여 필요 한 blog 내용 글 추출 하 기 4 . 추출 된 titleList 검색 결과 문장 들 을 개별 단어 들 단위 로 나누 기 ( split ) 5 . 개별 단어 들 중 무 의미 한 결과 숫자 포함 문자열 삭제 ( ' 1 등 ', ' 4 번 ', . .. 의 1 , 4 , ...) 6 . # 정규식 모듈 을 이용 하 여 숫자 만 추출 한 후 1 ~ 45 숫자 만 뽑아내 면 끝 ​ 1 . 우선 네이버 검색 엔진 의 검색 결과 를 가져오 기 위해 파이썬 웹 크롤링 관련 모듈 들 을 초반 에 import 해 줍니다 . 한글 검색어 를 웹 브라우저 검색 주소 로 사용 하 여 웹 페이지 를 요청 하 기 위해 urllib 의 2 개 모듈 을 import 하 고 html 문서 를 # 문법 적 _ 가공 ( # parsing , # 파싱 ) 을 위해 BeautifulSoup 모듈 , 문자열 -> 숫자 추출 을 위한 # 정규식 모듈 # re ( # regular _ expression ) 도 import 해 줍니다 . 2 . 네이버 검색 에 사용 할 키워드 를 만들 어 줍니다 . 포함 될 단어 + 키워드 , 빠질 단어 - 키워드 로 여러 개 단어 를 조합 해 주 면 됩니다 . ​ 3 . 키워드 를 합쳐 ( join ( ) ) 준 후 키워드 로 네이버 검색창 에서 정보 를 추출 해 올 searchKeyword ( ) 함수 를 호출 합니다 . 이 함수 는 키워드 문자열 과 추출 한 전체 문장 들 을 담 아 올 titleList 리스트 를 인자 로 사용 합니다 . 3 . 1 . searchKeyword 함수 는 네이버 검색창 에 사용 할 주소 + 검색 조건식 문장 을 만들 어 주 고 for loop 를 돌 면서 10 개 페이지 단위 로 여러 번 문자열 을 받 아 와 titleList 에 추가 해 줍니다 . 날짜 ( date ) 검색 조건 의 시작 - 끝 일자 를 dFrom , dEnd 로 key 값 을 맞추 면 string . format ( ) 문 을 통해 값 이 대입 된 문자열 을 만들 어 줄 수 있 습니다 . 검색 페이지 도 1 , 11 , 21 번 하 는 숫자 가 넘버링 이 올라갈 때 { page } key 값 을 숫자 로 변환 해서 문자열 을 만들 어 주 고 있 습니다 . ( 숫자 가 바뀌 는 문자열 을 만들 때 매우 유용 한 테크닉 이 됩니다 . 알 아 두 세요 . ^^) 3 . 2 - 3 . 검색 조건 까지 넣 어 준 url 주소 줄 이 만들 어 지 면 그 값 을 넣 고 urllib . request . urlopen ( url ) 로 열 고 내용 을 읽 어 옵니다 . 그 내용물 을 BeuatifulSoup 모듈 로 가공 하 여 ( parsing ) 준 후 블로그 내용물 을 갖 는 문단 만 # find _ all ( ) 로 찾아내 어 그 문장 들 의 text 내용물 만 titleList 리스트 에 담 아 오 면 searchKeyword ( ) 함수 의 임무 는 끝납니다 . 실제 만들 어 진 url 주소 는 아래 처럼 되 며 1 - 10 개 까지 첫 페이지 , 11 - 20 까지 2 번 째 페이지 하 는 식 으로 여러 페이지 를 불러오 게 됩니다 . ​ 4 . 추출 된 titleList 내 문장 들 을 전체 글 로 합친 후 다시 공백 ( ' ') 단위 의 낱개 단어 들 로 나누 어 줍니다 . 위 실행 후 결과 가 아래 와 같 습니다 . 이번 주 블로그 에 올라온 글 들 에 대해 , 낱개 단어 들 로 나눠진 리스트 데이터 를 볼 수 있 습니다 . 잘 보 시 면 숫자 만 최종 추출 하 기 전 조금 의 가공 이 더 필요 하 다는 것 을 알 수 있 습니다 . 4 등 , 1 위 하 는 단어 들 에 4 , 1 같 은 숫자 가 있 어 로또 예상 행운 의 숫자 데이터 결과 를 # 오염 ( contaminate ) 시킬 수 있 습니다 . 5 . 이 를 제거 하 는 # 필터링 ( # filtering ) 을 한번 더 진행 해 줍니다 . 우선 단독 1 , 45 , 6 / 45 같 은 수 들 은 배제 하 고 또 1 위 , 1 등 , 4 개 , 2 명 , 10 억 , ... 등등 의 문자열 제거 를 위해 ' 위 ', ' 등 ', ' 개 ', ' 명 ' 같 은 글자 가 단어 에 포함 된 경우 배제 하 여 정제 한 ( ? ) wordFltSplit 리스트 를 만들 어 줍니다 . 완벽 하 진 않 치만 이 필터링 을 거치 고 나 면 아래 처럼 숫자 를 포함 한 단어 들 의 결과 가 조금 더 정제 되 어 로또 추천 수 들 로 숫자 들 이 더 추려 지 는 것 을 볼 수 있 습니다 . ( 물론 정교 하 게 완벽 하 지 않 아 한계 가 있 습니다 -.-;;) 그런데 여기 추천 수 들 이 점 ( dot ) 으로 붙 어 있 어 이 들 숫자 도 잘라 줄 ( split ) 필요 가 생깁니다 . 이 를 위해 점 ( dot ) 을 이용 하 여 split ( '.') 해 주 는 함수 를 호출 하 여 숫자 들 들 다 잘라 줍니다 . 실행 하 고 나 면 아래 처럼 ' 3 . 4 . 5 . 7 . 10 ' -> ' 3 ', ' 4 ', ' 5 ', ' 7 ', ' 10 ' 식 으로 낱 게 숫자 문자열 이 만들 어 집니다 . 다른 모든 한글 문자열 보다 위 숫자 가 귀하 디 귀한 로또 행운 의 추천 수 가 되 겠 쬬 . ( 귀하 게 모십시다 ~ ^^) 6 . 마지막 으로 정규식 모듈 re 를 이용 해 숫자 들 만 추출 한 뒤 1 ~ 45 까지 의 수 만 다시 필터링 해 주 면 최종 결과물 이 됩니다 . 1 번 에 re . findall ( 정규식 형태 , 문자열 ) 함수 를 이용 하 여 숫자 만 골라서 numStr 리스트 에 넣 어 준 후 ( 2 번 에서 ) 최종 적 으로 숫자 값 이 45 이 하인 값 만 다시 한 번 numStr 에 담 아 주 면 모든 과정 이 끝납니다 . 2 번 줄 의 형태 가 좀 생소 할 수 있 습니다 만 파이썬 의 간결 하 고 유연 한 연산 기능 을 잘 보여 주 는 문장 입니다 . 이해 를 위해 코딩 아재 가 [ ] 안쪽 을 총 3 개 파트 로 나누 어 두 었 습니다 . 가운데 for 문 처럼 numStr 에서 문자열 을 가져온 후 마지막 if 문 에 넣 어 45 이 하인 조건 을 만족 하 는 num 수 들 만 리스트 에 차곡차곡 담 는 식 을 단 한 줄 로 기술 한 것 입니다 . 좀 복잡 하 다고 생각 할 수 있 지만 파이썬 이 추구 하 는 간결 하 고 명료 한 기능 구현 이 자알 ~ 표현 된 식 입니다 . ( 좀 복잡 하 다 생각 하 실 수 있 으나 잘 이해 하 시 고 나중 에 꼭 써 보 시 길 요 ~ 코딩 아재 도 초반 엔 이해 를 잘 못 했었 어요 . -.-;;) 결과 적 으로 최종 아래 와 같이 숫자 만 뽑 은 리스트 와 이 로부터 1 ~ 45 숫자 만 다시 뽑 아 정렬 ( sort ) 하 여 나열 한 결과물 을 얻 을 수 있 습니다 . 아래 최종 숫자 중 같 은 번호 가 더 여러 번 나온 숫자 는 더 많이 추천 하 는 로또 예상 번호 일 수 도 있 고 아니 면 필터링 이 충분 치 않 아 오염 된 데이터 가 더 많이 나왔 을 수 도 있 습니다 . ( 특히 1 , 6 , 45 번 숫자 는 오염 될 확률 이 더 높 지요 . ) 그래도 결과물 에서 의미 를 찾아보 면 전혀 근거 없 는 이번 주 용 로또 예상 번호 가 아닌 로또 블로거 들 이 추천 하 는 나름 공신력 ( ? ) 있 는 추천 숫자 들 이 될 수 있 다는 것 이 죠 . ( 뭐 이 추천 수 를 받 을지 , 무시 할 찌 는 여전히 사용 자 본인 의 몫 이 긴 합 니당 . ^^) 오늘 도 여러분 들 께 최근 핫 ( ? ) 한 웹 크롤링 기법 을 이용 하 여 네이버 검색창 을 활용 하 여 로또 번호 추천 받 기 기능 을 구현 해 보 았 습니다 . 로또 번호 선택 시 , 코딩 아재 의 패턴 표 / 추천 프로그램 을 쓸 것 이 냐 ? 아니면 이런 웹 크롤링 기술 을 활용 하 여 블로거 들 의 집단지 성 ( ? ) 을 활용 할 것 이 냐 ? 여전히 어려운 문제 입니다 . 코딩 아재 보다 도 더 스마트 한 로또 번호 정하 기 규칙 도 댓글 달 아 주 시 면 좋 을 듯 합니다 . 이 만 마치 며 코딩 아재 표 유용 한 데이터 과학 모듈 배우 기 는 계속 됩니다 ~ 쭈욱 ~ 바이 ~ ^,^ 첨부 파일 Web _ crawling _ LottoNo . py 파일 다운로드 ​