생활 코딩 #1
:유치원 홈페이지에서 아이들 사진을 손쉽게 다운로드 하기
백승용 / seungyong.baek@gmail.com
생활 코딩:
가정 또는 업무의 반복적인 작업을 간단한 코딩으로 편안하게 하자.
2.
개선 필요 사항
▪매일 아이들의 수업 및 생활 사진이 유치원 홈페이지 게시 됨
▪ 와이프는 매일 아이들의 사진을 받아서 정리
(로그인 사진첩 일별 게시판 또는 방과 후 수업 게시판
사진을 우 클릭해서 다운로드)
▪ 홈페이지에서는 몇 달에 한 번씩 묶어서 받는 기능 제공
▪ 보통 5장 이상이고, 행사를 했을 때는 30장 이상
▪ 두 명의 딸이 같은 유치원에 다니고 있으며, 큰 아이는 방과 후
수업도 1~2개 받음
▪ 결론적으로, 아이들 사진을 거의 매일 받아 정리하기 위해
와이프는 매일 수 분 ~ 십 수분 이상을 소모
▪ 따라서, 사진을 보다 쉽고 빠르게 다운로드할 방법이 필요
연령별 반
방과 후 수업
3.
개선 목표
1
윈도우의 명령프롬프트(CMD)에, 아이의 이름과 날짜를
파라미터로 주어서 다운로드 스크립트 실행
2
1
2
바탕화면에 지정한 날짜의 폴더가 생성이 되고, 사진이
다운로드 됨
▪ 스크립트 위치: C:UsersSeungYong
▪ 스크립트 파일명: uber.py
4.
준비 사항
1. 윈도우용Python 설치
▪ https://www.python.org/downloads/
▪ Python 3.6.x 버전 설치
2. Python 라이브러리 설치
▪ 필요 표준 라이브러리: os, sys, re, urllib.request
▪ 추가 라이브러리: requests, beautifulsoup4
▪ 설치된 추가 라이브러리 목록 확인
• C:>pip list --format=columns
▪ 추가 라이브러리 설치
• C:>pip install beautifulsoup4
• C:>pip install requests
▪ 설치된 추가 라이브러리 목록 확인
▪ pip는 python 패키지 관리자로
python 설치시에 함께 설치됨
▪ 추가 라이브러리 설치
▪ 이미 설치된 경우에는 설치됨으로 나옴
5.
필요 라이브러리/모듈
Beautiful Soup
https://www.crummy.com/software/BeautifulSoup/
Requests
http://python-requests.org
라이브러리/모듈설명
os
This module provides a portable way of using
operating system dependent functionality.
sys
This module provides access to some variables
used or maintained by the interpreter and to
functions that interact strongly with the
interpreter.
re
This module provides regular expression
matching operations similar to those found in
Perl.
urllib.request
The urllib.request module defines functions and
classes which help in opening URLs (mostly
HTTP) in a complex world — basic and digest
authentication, redirections, cookies and more.
beautifulsoup4
Beautiful Soup is a Python library for pulling data
out of HTML and XML files.
requests
Requests is the only Non-GMO HTTP library for
Python, safe for human consumption.
• 설명은 공식 홈페이지의 설명 인용(www.python.org, Beautiful Soup, Requests)
• 실제 사용 방법은 코드에서 설명
6.
전체 코드
2
1
1
▪ download()함수
1. 아이의 이름과 다운로드 받을 날짜를 매개
변수로 받음
2. 홈페이지 로그인
3. 사진 다운로드를 수행
2
▪ 스크립트 시작점
1. 스크립트가 정상적으로 실행이 되었을 경우
2. 필요한 모듈을 임포트하고
3. download() 함수로 이름과 날짜를 매개 변수를
전달하고 다운로드를 실행
7.
코드 설명 #1
라인설명
42
▪ uber.py 라는 스크립트가 아래의 **와 같이 독립적으로 실
행될 때만 42번 라인 이후의 코드가 바로 실행됨
▪ 즉, 다른 스크립트에서 모듈로 임포트되는 경우에는 바로
실행되지 않음
** C:>uber.py seoyul 20171221
43~48
▪ 표준 및 추가 라이브러리 임포트
▪ BeautifulSoup은 “as”로 임포트 하였기 때문에, BS라는
별칭으로 사용됨
50~55
▪ uber.py 스크립트로 전달된 매개 변수의 개수가, 3개로 올
바르게 입력된 경우, 매개 변수를 변수로 할당하고
download()함수 호출
▪ 아래의 **와 같이 실행된 경우, len(sys.argv) == 3이 됨
• sys.argv[0]=uber.py
• sys.argv[1]=seoyul name으로 할당
• sys.argv[2]=20171221 input_date로 할당
▪ 즉, download(seoyul, 20171221)의 형태로 함수 호출
** C:>uber.py seoyul 20171221
56~59
▪ uber.py 스크립트로 전달된 매개 변수의 개수가 3개가 아
닌 경우에는 안내 메시지 출력
8.
코드 설명 #2
라인설명
4
▪ name과 input_date를 매개 변수로 받는 함수 정의
▪ name=seoyul, input_date=20171221
6
▪ 로그인 정보를 보낼 페이지 URL을 “LOGIN”으로 정의
▪ 사이트에 따라서 매우 동적이므로 “페이지 소스 보기” 또
는 “개발자 도구”등을 통해 확인 필수
• “코드 설명 #2 - 부가 설명 #1 또는 #2” 참고
7 ▪ 이름이 seoyul인 경우
8 ▪ requests 모듈을 사용하여 session 객체 생성
9 ▪ 로그인에 필요한 정보를 딕셔너리 형태로 생성
10 ▪ session 객체에 로그인 정보를 HTTP post 형태로 전달
11
▪ 알림 기록 페이지를 가져와서 my_page 객체로 생성
▪ 알림 기록(최근 2달 업로드 이력 보관)을 사용하는 이유:
• 게시판 ID 및 다운로드 파일명등의 관리 불필요
• “코드 설명 #2 - 부가 설명 #3과 #4” 참고
▪ 사이트마다 동적이므로, 대상 사이트의 분석 필수
12
▪ beautifulsoup를 사용하여 my_page의 html 소스를 파싱
하고 soup1 객체 생성
▪ soup1 객체를 통하여, html 페이지의 tag를 참조하고 검
색하여 사용할 수 있게 됨
13~18 ▪ 7~12 라인과 변수만 다르며 동일한 코드
19~22 ▪ 전달된 name이 올바르지 않을 경우 안내 메시지 출력
9.
코드 설명 #2- 부가 설명 #1(페이지 소스 보기)
▪ 브라우저의 "페이지 소스 보기"
▪ 페이지 소스에서 로그인에 필요한 정보들 확인
10.
코드 설명 #2- 부가 설명 #2(개발자 도구)
1. 크롬 설정 개발자 도구 활성화
2. “로그인”을 누르면 팝업창이 나옴
3. 실제로 로그인을 수행
4. 개발자 도구에서 송신/수신 데이터 확인 가능 5. login으로 검색
6. 실제의 로그인 URL 및 전달되는 헤더등을 확인
11.
코드 설명 #2- 부가 설명 #3(사이트 구성 분석)
▪ 특정 일자의 사진첩 URL
http://uberpc.kkmom.com/page_postingcontents.php?inputdatekey=20180104d&boardid=20861&mykidonly=on
▪ 특정 일자의 개별 사진 파일 URL
http://img79b.kkmom.com/go/school/uberpc/2018/01/04/04d/20180104d_001710.jpg
▪ 특정 일자의 사진첩 화면
▪ 특정 일자의 사진첩 페이지 소스
▪ 날짜 파라미터에 임의의 알파벳이 추가됨
▪ 연령별, 방과후 수업이 별도 게시판으로 관리됨
▪ mykidonly: 우리 아이 사진만 보기
▪ 사진첩 및 파일의 URL이 단순하지 않음 즉,
이러한 모든 요소를 코드화 하려면 복잡해짐
▪ 다행히 “부가설명 #4” 처럼, 알림 기록을
제공해주어서 훨씬 단순하게 작성 가능
12.
코드 설명 #2- 부가 설명 #4(사이트 구성 분석)
▪ 알림 기록 페이지 URL
http://uberpc.kkmom.com/schoolparentadmin/mypage/page_notify_list.php
▪ 마이페이지 알림 기록 페이지
• 학부모에게 모바일로 사진이 업로드 되었음을 알린 기록
• 최근 2달 이내에 업로드된 사진에 대한 알림 기록
• 게시판 구분이 없이 한번에 내용이 표시 됨
▪ 알림 기록 페이지의 소스
• 알림 기록 페이지의 html 소스가 soup1 객체로 생성이 됨
• soup1 객체를 통하여, html tag의 참조 및 검색이 가능
• 간단한 사용법은 BeautifulSoup QuickStart 참조
• https://www.crummy.com/software/BeautifulSoup/bs4/doc/#quick-start
13.
코드 설명 #3
라인설명
25
▪ soup1 객체의 모든 html “a” tag중에 “href” 속성이 “http://”
로 시작하는 tag만 link로 전달
26 ▪ link 에서 “href” 속성의 값(URL)만 link_url로 생성
27
▪ link_url에서 날짜 부분만 슬라이싱 하여 input_date와 비
교하고 같은 날짜만 수행
28
▪ input_date와 같은 날짜의 URL에 mykidonly 파라미터를
추가하여 date_photo 객체로 생성
29
▪ beautifulsoup를 사용하여 date_photo의 html 소스를 파
싱하고 soup2 객체 생성
▪ soup2 객체를 통하여, html 페이지의 tag를 참조하고 검
색하여 사용할 수 있게 됨
▪ soup2 객체는 “코드 설명 #2 - 부가설명 #3”의 “특정 일자
의 사진첩 페이지 소스”와 내용은 같음
30
▪ soup2 객체의 모든 html “img” tag중에 “id” 속성이 “photo”
로 시작하는 tag만 img_url로 전달
31 ▪ img_url 에서 “src” 속성의 값(URL)만 src_url로 생성
32 ▪ src_url을 “/”로 분리하여 file_name 만 추출
33 ▪ 바탕화면에 input_date로 save_dir 지정
34~39
▪ save_dir이 있을 경우에는 해당 폴더로 이동
▪ save_dir이 없을 경우에는 input_date 폴더 생성
▪ urllib.request.urlretrieve 함수와 src_url, save_dir,
file_name 변수로 사진 다운로드
• 각각의 변수에 대한 확인은 “코드 설명 #3 - 부가 설명 #1” 참조
• 25번, 30번 라인에서 re 모듈을 이용하여, 간단한 정규 표현식으로 tag 속성 검색
14.
코드 설명 #3- 부가 설명 #1(다운로드 함수 변수 값)
▪ 라인 25: link
<a href="http://uberpc.kkmom.com/page_postingcontents.php?boardid=20861&inputdatekey=20180108c" target=_blank>go</a>
<a href="http://uberpc.kkmom.com/page_postingcontents.php?boardid=20861&inputdatekey=20180105j" target=_blank>go</a>
………..
▪ 라인 26: link_url
http://uberpc.kkmom.com/page_postingcontents.php?boardid=20861&inputdatekey=20180108c
▪ 라인 28: data_photo.url
http://uberpc.kkmom.com/page_postingcontents.php?boardid=20861&inputdatekey=20171221e&mykidonly=on
▪ 라인 30: img_url
<img id="photo1" src="http://img79b.kkmom.com/go/school/uberpc/2017/12/21/21n/20171221n_001710.jpg" style="filter:alpha(opacity=100);margin:0px;"/>
▪ 라인 31: src_url
http://img79b.kkmom.com/go/school/uberpc/2017/12/21/21n/20171221n_001710.jpg
▪ 라인 32: file_name
20171221n_001710.jpg
▪ 라인 33: save_dir
C:UsersSeungYongDesktop20171221
▪ 라인 36, 39: 최종 저장 파일명
C:UsersSeungYongDesktop2017122120171221n_001710.jpg
15.
코드 스타일 점검
▪코드의 문법 및 스타일 점검을 위하여 pycodestyle 사용
▪ pycodestyle은 기존의 pep8의 이름이 변경된 것임
▪ 여러 항목의 코드 스타일에 대한 체크를 해 줌
▪ E501: 일반적으로 79 컬럼 내에 코드를 작성할 것을 권고하는 에러
• C:UsersSeungYong>pip install pycodestyle
• C:UsersSeungYong>pycodestyle uber.py
16.
고려 사항
1. 다양한경우의 예외 또는 에러에 대한 오류 처리 코드가 없음
2. 웹 사이트에 따라서 고려해야 할 요소가 많이 달라질 수 있음
3. 웹 페이지의 구조가 변경이 될 경우, 간단한 유지보수가 필요