2013. 9. 22. 15:45

바람도 살랑 살랑 불고...

머리는 계속 썩어가고 ㅋㅋ

오늘한 학습들 끄적거리기

#!/usr/bin/env python

#-*- coding:utf-8 -*-

'''

    목  적 : Python 정규식 및 sqlite DB 연습

    버  전 : Python 2.7.5

    연습일 : 2013.09.22

    동  작 :

    나눔로또 페이지의 당첨번호 확인 페이지를 기반으로

    모든 회차의 당첨정보를 수집하여 DB파일에 저장한다.

'''


import sqlite3

import os

import re

import urllib2

import sys


class Encode:

    def __init__(self, stdout, enc):

        self.stdout = stdout

        self.encoding = enc

    def write(self, s):

        self.stdout.write(s.encode(self.encoding))


sys.stdout = Encode(sys.stdout, 'utf-8')


def GetHtmlSrc(as_url, as_decode):

    return urllib2.urlopen(as_url).read().decode(as_decode, 'ignore')


def CreateDB(as_dbfilenm):

    if os.path.exists(as_dbfilenm):

        os.remove(as_dbfilenm)


    ls_ddc = u''' CREATE TABLE LOTTO (seq int primary key not null,

                                    num1 int not null,

                                    num2 int not null,

                                    num3 int not null,

                                    num4 int not null,

                                    num5 int not null,

                                    num6 int not null,

                                    winner_cnt int null,

                                    winnings_amt int null,

                                    autowin int null,

                                    manualwin int null,

                                    url_broad varchar(255) null,

                                    url_winning_store varchar(255) null,

                                    regdate datetime default current_timestamp null,

                                    regemp varchar(10) null);  '''

    ret_val = ExecuteSql(as_dbfilenm, u'C', ls_ddc)

    if type(ret_val) == int and ret_val < 0:

        print u'DB 생성에 실패하였습니다!!'

        return -1

    return ret_val


def ExecuteSql(as_dbfilenm, as_sqltype, as_sqlquery):


    if as_sqltype <> u'C' and not os.path.exists(as_dbfilenm):

        print as_dbfilenm + u' 파일이 존재하지 않습니다.'

        return -1


    if as_sqltype == u'C' and os.path.exists(as_dbfilenm):

        print as_dbfilenm + u' 파일이 이미 존재합니다.'

        return 0


    try:

        conn = sqlite3.connect(as_dbfilenm)

        cur = conn.cursor()


        if as_sqltype <> u'S':

            conn.execute(as_sqlquery)

            conn.commit()

            return 0

        else:

            cur.execute(as_sqlquery)

            return cur.fetchall()

    except sqlite3.Error, e:

        print u'Error %s:' % e.args[0]

        if conn:

            conn.rollback()

        return -1

    finally:

        if conn:

            conn.close()


def GetLottoData(al_max_seq, as_dbfilenm):

    ll_page = 1

    while 1:

        list_result = u''

        ls_url = u'http://www.645lotto.net/Confirm/win_all.asp?sGameNo=&amp;eGameNo=&amp;sltPeriod=&amp;sltPeriod2=&page=' + str(ll_page).decode('utf-8', 'ignore')

        print u'URL : ' + ls_url

        html_src = GetHtmlSrc(ls_url, 'euc-kr')

        pattern = u'<tr>\s*?<td class=\"a\"><a href=\"/Confirm/number.asp\?sltSeq=[0-9]+?\">([0-9]+?)</a></td>\s*?<td>([0-9, ]+?)</td>\s*?<td>([0-9]*?)</td>\s*?<td class=\"right\">([0-9,]+?)</td>\s*?<td>([0-9]+?)</td>\s*?<td>([0-9]+?)</td>\s*?<td><a href=\"(.*?)\">[<img src=\"/images/Confirm/movie.jpg\" alt=\"\" style=\"cursor:pointer;\">|\s]*?</a>\s*?</td>\s*?<td class=\"a\"><a href=\"(.*?)\">바로가기</a></td>'

        re_comp_obj = re.compile(pattern)

        list_result = re_comp_obj.findall(html_src, re.DOTALL)


        for i in range(len(list_result)):

            list_result[i] = list(list_result[i])

            list_result[i][0] = int(list_result[i][0])                          #회차

            list_result[i][1] = list_result[i][1].split(u', ')                 #당첨번호

            list_result[i][2] = int(list_result[i][2])                          #일등당첨자수

            list_result[i][3] = int(list_result[i][3].replace(u',',u''))       #당첨금

            list_result[i][4] = int(list_result[i][4])                          #자동

            list_result[i][5] = int(list_result[i][5])                          #수동

            list_result[i][6] = u'http://www.645lotto.net/' + list_result[i][6].replace(u'../', u'') #당첨방송다시보기 주소

            list_result[i][7] = u'http://www.645lotto.net' + list_result[i][7] #일등판매점

            for j in range(len(list_result[i][1])):

                list_result[i][1][j] = int(list_result[i][1][j])

            print list_result[i]


            if list_result[i][0] == al_max_seq:

                print u'모든페이지 탐색 및 데이터 수집 완료!!', u'프로그램을 종료합니다.'

                exit(0)


            ls_insert_query = u'INSERT INTO LOTTO (seq, num1, num2, num3, num4, num5, num6, winner_cnt, winnings_amt, autowin, manualwin, url_broad, url_winning_store, regemp) VALUES ( '


            ls_insert_value = u''

            ls_insert_value = ls_insert_value + unicode(list_result[i][0]) + u', '

            for j in range(len(list_result[i][1])):

                ls_insert_value = ls_insert_value + unicode(list_result[i][1][j]) + u', '

            ls_insert_value = ls_insert_value + unicode(list_result[i][2]) + u', '

            ls_insert_value = ls_insert_value + unicode(list_result[i][3]) + u', '

            ls_insert_value = ls_insert_value + unicode(list_result[i][4]) + u', '

            ls_insert_value = ls_insert_value + unicode(list_result[i][5]) + u', '

            ls_insert_value = ls_insert_value + u'\'' + unicode(list_result[i][6]) + u'\', '

            ls_insert_value = ls_insert_value + u'\'' + unicode(list_result[i][7]) + u'\', '

            ls_insert_value = ls_insert_value + u'\'AUTO\'' + u' '


            ls_insert_query = ls_insert_query + ls_insert_value + u' ); '


            print u'INSERT QUERY : ' + ls_insert_query


            ret_val = ExecuteSql(as_dbfilenm, u'I', ls_insert_query)

            if ret_val <> 0:

                print u'DB Insert 실패!!'

                return -1


            if list_result[i][0] == al_max_seq:

                print u'모든페이지 탐색 및 데이터 수집 완료!!', u'프로그램을 종료합니다.'

                exit(0)

        ll_page = int(ll_page) + 1

        print str(ll_page).decode('utf-8','ignore')


def main():

    ls_dbfilenm = u'test.db'

    ls_sql = u'select max(seq) from LOTTO'

    ret_cur = ExecuteSql(ls_dbfilenm, u'S', ls_sql)

    if type(ret_cur) == int and ret_cur < 0:

        print u'DB 조회에 실패 하였습니다!'

        print u'DB 데이터를 재생성합니다!'

        ret_val = CreateDB(ls_dbfilenm)

        if ret_val <> 0:

            print u'DB 생성에 실패 하였습니다', u'프로그램을 종료합니다!!'

        ret_val = GetLottoData(1, ls_dbfilenm)


    if type(ret_cur) == list and u'None' in unicode(ret_cur[0][0]):

        print u'데이터가 없습니다!', u'데이터를 재수집합니다.'

        ret_val = GetLottoData(1, ls_dbfilenm)


    print unicode(ret_cur[0][0]) + u'회차 이후의 데이터를 수집합니다.'

    ret_val = GetLottoData(ret_cur[0][0], ls_dbfilenm)


    print u'종료!!'


if __name__ == '__main__':

    main()



'Study > python' 카테고리의 다른 글

[연습중]MK RSS 파싱  (0) 2013.09.23
[연습]손바닥삼국지 오토  (0) 2013.09.22
[펌]Unicode In Python, Completely Demystified  (0) 2013.09.18
python ODBC 연결시~  (0) 2013.01.26
Encoding type table  (0) 2012.12.27
Posted by 땡보