'Python'에 해당되는 글 2건

  1. 2007.03.20 BeautifulSoup
  2. 2007.03.19 SH 공사 임대게시판 모니터링 프로그램

BeautifulSoup

IT 2007. 3. 20. 10:17

바로 아래 있는 놈을 만들기 위해 사용한 Python Library. HTML/XML 파서로 작은 사이즈/설치 필요없음/성능 좋음 등등의 이유로 꽤 잘 알려져 있다. 거지같은 문서, 이를테면 태그를 열어놓고 닫지는 않는다든가 하는 경우에도 잘 작동해서 부담없이 사용할 수 있

...어야 겠지만, 원체 거지같기 짝이 없는 우리나라 사이트에서는 좀 쓰기 곤란한 경우도 종종 있다. SH공사 페이지 열어보고 완전 기겁했음..게다가 사이트를 Flash로 발라버리면 말짱 황이라서.

인스톨할 필요도 없이 코드 있는데 던져놓고 import하면 됨. 자세한 설명은 문서 참조하시라.
http://www.crummy.com/software/BeautifulSoup/

:

SH 공사 임대게시판 모니터링 프로그램

IT 2007. 3. 19. 14:36

함께 SH공사 임대아파트에 도전하신 모님의 요청에 따라 이틀만에 후닥닥 만든 프로그램.
Python script이고, 게시판에 새 글이 올라오면 ini파일을 갱신하고 지정한 사용자에게 메일을 보내 알려주도록 했다. BeautifulSoup와 간단한 last.ini,Python만 있으면 동작.

#!/usr/bin/env python
# -*- coding: euc-kr -*-
from BeautifulSoup import BeautifulSoup
import urllib2
from datetime import *
import smtplib

#send Gmail
def sendGmail(loginid,passwd,to,content):
    smtp = smtplib.SMTP("smtp.gmail.com")
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.login(loginid,passwd)
    smtp.sendmail("none@none.com",to,content)
    smtp.close()

#File open/read value
def ReadiniValue():
    Value = open('last.ini')
    LastNum = int(Value.readline())
    LastYear = int(Value.readline())
    LastMon = int(Value.readline())
    LastDay = int(Value.readline())
    Value.close()
    return {'LastNum':LastNum, 'LastYear':LastYear, 'LastMon':LastMon, 'LastDay':LastDay}

#open page/check value
def GetPageValue():
    SHpage = urllib2.urlopen("http://i-sh.co.kr/gonggo/noti.jsp?gubun=2")
    SoupPage = BeautifulSoup(SHpage)
    CurNum = int(SoupPage.find('td',{"align":"CENTER","class":"date"}).contents[0])
    CurDate = str(SoupPage.find('td',{"align":"CENTER","class":"date"}).nextSibling.nextSibling.nextSibling.nextSibling.contents[0])
    CurTitle = SoupPage.find('td',{"align":"CENTER","class":"date"}).nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.next.contents[0].__str__('euc_kr')
    CurYear = int(CurDate[0:4])
    CurMon = int(CurDate[5:7])
    CurDay = int(CurDate[8:10])
    return {'CurNum':CurNum,'CurYear':CurYear,'CurMon':CurMon,'CurDay':CurDay},CurTitle
#Check status
def CheckStat(LastValue,CurValue):
    if (LastValue['LastNum'] == CurValue['CurNum']) and (LastValue['LastYear'] == CurValue['CurYear']) and (LastValue['LastMon'] == CurValue['CurMon']) and (LastValue['LastDay'] == CurValue['CurDay']):
        return False #no changes
    else:
        return True #means there's changes
   
#write value if any changes
def WriteValue(CurValue):
    Value = open('last.ini','w')
    Value.write (str(CurValue['CurNum'])+'\n')
    Value.write (str(CurValue['CurYear'])+'\n')
    Value.write (str(CurValue['CurMon'])+'\n')
    Value.write (str(CurValue['CurDay'])+'\n')
    Value.close()
    return 0

LastValue = ReadiniValue()
CurValue,CurTitle = GetPageValue()

TextTosend = "From: SH <none@none.com>\n" + \
"To:" + """
Subject: SH공사 임대게시판 새 글 등록 알림

게시판에 새 글이 등록되었습니다.\n"""+\
"http://i-sh.co.kr/gonggo/noti.jsp?gubun=2\n" + \
CurTitle   

if (CheckStat(LastValue,CurValue) == True):
    sendGmail("ID","Pass","Mail address to receive",TextTosend)
    WriteValue(CurValue)
    print LastValue,CurValue
else:
    print CurValue

+) 몰랐는데 ActivePython에는 ssl 모듈이 없더라.. 사용할때 주의해야 할 듯.
+) 동작 자체에만 신경을 쓰고 에러처리, 코드 정리, 사용상의 편의 등등에는 저언혀 신경을 안쓰고 발로 만들어낸 물건이므로.. 근데 생각해보니 이거 필요할 사람이 없구나.


: