예전에는 파이썬에서 웹을 다룰 때 urllib, urllib2, beautifulsoup를 많이 사용했습니다.

알려진 웹 관련 라이브러리래봐야 저 정도가 전부였기도 하고...


요즘엔 requests라는 라이브러리를 많이 사용하고 실제로 써보니 확실히 많이 편하구요.

처음 requests를 사용한건 IP 조회 코드가 필요해서 쓰게 됬는데, 그 이후로 웹 관련 코드 작성할 때는 requests만 쓰고 있습니다.


다만 이 라이브러리에서의 문제는 간혹 한글이 깨져서 출력되는 경우가 있다는 것...

웹 페이지 인코딩 설정에 따라 다른 것 같은데 req.text로 결과값을 가져올 경우 한글이 깨지는 경우가 발생합니다.


문제 해결은 간단하게 해결했는데.. req.content로 결과값을 출력시켜주면 됩니다.

원인은 req.text는 값을 'unicode'형으로 가져옵니다.

반면, req.content는 'str'형으로 값을 가져오구요.



unicode로 값을 가져올 경우 코딩하다보면 아주 짜증나는 문자 체계덕에 좀 꼬이는 경우가 발생하는 것 같습니다.

unicode 처리할 때 종종 쓰는 codecs 라이브러리나 다른 .encode(), unicode() 등을 쓰지 않고도 requests 라이브러리 자체적으로 해결되니 진짜 잘 만들어진 라이브러리란 생각도 드네요.



참고 : http://stackoverflow.com/questions/11435331/python-requests-and-unicode

저작자 표시 비영리 변경 금지
신고

python send mail - 메일 전송 프로그램


이 프로그램이 필요하다고 생각된건 인터넷을 기가랜으로 바꾸기 전에는 집에 공인 IP 한 개만 들어와서 공유기가 꺼지지 않는 이상은 상관없었는데, 기가랜 모뎀이 생기면서 연결되는 PC, IPTV, VoIP, 무선공유기, Rasberry PI까지.. 모든 장치가 공인 IP를 받아온다.


문제는 PC나 Rasberry PI가 부팅 시마다 IP가 바뀌니 원격에서 붙기가 어려웠고, IP를 메일로 보내주는 프로그램을 생각했다.

다행히 윈도우 기반인 PC와 Linux 기반인 Rasberry PI 둘 다 Python이 먹히니 귀찮음은 덜었다.


우선, 메일을 보내기 위해서는 SMTP(Simple Mail Transfer Protocol) Server가 필요한데, 인터넷에서 간단한 SMTP 서버를 설치해도 괜찮고, 구글이나 네이버 등의 다른 SMTP를 써도 괜찮다. 다만, 이 프로그램 하나 돌리자고 SMTP Server까지 운영하면서 보안상 문제까지 떠안기는 싫어서보안 잘 하는 구글이나 네이버의 서버를 쓰기로 했다.


타 회사의 서버를 사용하기 위해서는 우선 본인 계정에서 smtp 사용 설정을 해줘야한다.

이후 작성할 python코드에 아래 정보를 입력해주면 된다.

smtp.naver.com / smtp.gmail.com

smtp 포트 : 465

ID/PW : 본인 네이버 계정


처음에는 간단히 smtplib와 email라이브러리를 이용해서 최소의 기능만 하는 프로그램을 작성했지만, 부팅 시간도 체크하기 위해 시간 관련 라이브러리를 추가해서 마무리했고 더 필요한 기능도 없어보인다.


메일 전송 결과 아래와 같이 정상적으로 전송되는 것을 확인 가능하다.



약간의 설명을 덧 붙이자면, sender에는 보내는 사람의 계정(smtp서버와 동일 계정), receiver에는 받을 계정이 들어가야하고

ID와 PW에는 보내는 사람 계정의 정보가 들어가야한다.


================

부팅 시 해당 프로그램이 실행되어야 하니 윈도우의 작업 스케줄러에 추가해주는 작업이 필요하다.

실행(Win+R) > taskschd.msc 혹은 제어판에서 작업 스케줄러를 실행한다.

좌측 메뉴 중 작업 스케줄러 라이브러리를 클릭 후 우측에서 작업 만들기로 새 작업을 만들어주면 된다.

트리거 탭에서 시작할 때 사용하는 옵션과, 동작 탭에서 실행될 프로그램만 지정해주면 간단히 끝난다.





저작자 표시 비영리 변경 금지
신고


python raw_input() 개행 없이 문자열 입력 받는 방법


python에서 raw_input()으로 입력을 받을 때 여러 줄을 복사, 붙여넣기 할 경우 아래와 같은 문제가 발생합니다.


string = raw_input()

=====

입력


string1

string2

string3


=====

출력

string1

입력은 여러 줄을 받았으나 string1 뒤의 \n으로 인해 변수에 한 줄만 입력되게 됩니다.

흔히 생각할 때는 string변수에 'string1\nstring2\nstring3\n'으로 입력될 것 같지만 

python에서 \n를 엔터로 입력받아버려 이런 문제가 발생합니다.


이를 해결하기 위해서는 2가지 방법이 있습니다.


1. import sys

2. 반복문을 사용한 raw_input()


1번의 경우 아래와 같은 코드로 입력받을 수 있습니다.

import sys


string = sys.stdin.readlines()

출력 결과

>>> 

string1

string2

string3




['string1\n', 'string2\n', 'string3\n', '\n', '\n', '\n']

sys 라이브러리를 썼을 경우 \n을 그대로 받아 변수에 저장이 가능하지만

입력을 종료하기 위해 엔터를 입력하는 것까지 \n으로 받아버리기 때문에 약간의 문제가 발생합니다.

이 경우 IDLE에서는 Ctrl+D로 종료가 가능하며, windows console에서는 Ctrl+Z로 입력 종료가 가능합니다.

둘 다 EOF(End of File)을 입력하는 방법이며, 키보드 인터럽트를 받아 공백을 입력 받았을 때 종료시키는 코드를 짜도 됩니다.



2번의 경우는 반복문을 사용하여 여러번의 raw_input()을 사용함과 동시에

append()를 사용하여 리스트 형식으로 문자열을 계속 더하는 방법입니다.

string = []

while True:

    input_data = raw_input()

    if input_data == '':

        break

    else:

        string.append(input_data)


for line in string:

    print line

출력 결과

>>> 

string1

string2

string3


string1

string2

string3

여러줄의 string1~3을 받고 엔터를 두 번 입력할 경우 결과가 출력됩니다.

1번의 경우보다 코드가 조금 더 길지만 문자열을 라인 단위로 리스트에 저장하기 때문에

좀 더 다루기가 편리한 방법입니다.

위 코드에서 print string[1]을 하면 string2가 출력되는 식입니다.


코드를 좀 더 살펴보면, while문을 통해 반복적으로 raw_input()으로 입력을 받으며,

공백이 아닌 입력된 문자열이 있을 경우 append()를 통해 string 리스트에 계속 더하게 됩니다.


입력받을 문자열에 따라 두 방법 중 편한 방법을 선택하여 사용하면 됩니다.

저작자 표시 비영리 변경 금지
신고

+ Recent posts

티스토리 툴바