Python/2.7 for fun.

pyqt를 이용한 나만의 웹툰 뷰어 만들기 1.

qkqhxla1 2015. 4. 13. 20:44

이 프로그램에서 더 개선됨 : http://qkqhxla1.tistory.com/347



웹툰을 좋아하는 나는 매번 네이버, 다음, 레진코믹스 각각 따로 들어가서

내가 좋아하는 웹툰을 골라서 보는 과정이 조금은 귀찮았다. (매번 클릭하고 찾는 그런 일련의 과정들이.)


그래서 나만의 웹툰 뷰어를 만들어보기로 했다. 실행시키는 즉시 오늘 요일의 모든 웹툰들 중에서, 내가 좋아하는 웹툰들 목록을 파싱해와서 그것들만 따로 뷰어로 보여주는것이다. 매 요일의 웹툰중에서 내가 가장 좋아하는 웹툰은 txt에 적어놓고, 이것만 참조해서 뷰어에 나온다. (원래는 소스코드안에 하드코딩했지만 자주 변경이 일어날것 같아서 txt파일로 변경나는 탭을 옮겨다니면서 웹툰을 감상하기만 하면 된다.


실행시키는 즉시 이렇게 뜬다. (참고로 오늘은 월요일.)



탭을 옮기면 다음과 같다.



여기서 웹툰을 눌러서 들어가서 볼 수 있다.




py2exe용 setup.py 는 맨 아래에 재정의.


소스 코드.(일부 수정. 개선점은 아래에 적음.)

# -*- encoding: cp949 -*-
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtWebKit import*
import sys
import urllib2
import re
import time
import operator

"""
my_webtoon = [u'신의 탑',u'낚시신공', #네이버 웹툰 목록. 줄마다 요일이 다름.
              u'마음의소리',u'하이브',u'하루 3컷',
              u'복학왕',u'하나(HANA)',
              u'전자오락수호대',u'제페토',
              u'갓 오브 하이스쿨',
              u'후레자식',u'아메리카노 엑소더스',
              u'무빙',u'왈퐈',u'귀신', #다음 웹툰 목록. 줄마다 요일이 다름.
              u'파인',u'에스탄시아 3',
              u'70',u'블랙 베히모스',
              u'시동',u'늑대처럼 울어라',u'브레이커2',u'체이서',
              u'무장',u'치삼만화',
              u'죽음이 본다',u'국민사형투표',u'꽃드림',u'마샬아츠',
              u'김철수씨 이야기',u'시계',u'미슐랭스타 시즌 3',#레진코믹스 웹툰 목록
              u'몽중저택',u'법칙과 순서의 세계',u'레바툰',
              ]
print my_webtoon,'\n'"""
my_webtoon = map(lambda x:unicode(x.replace('\n',''),'cp949'),open('webtoon_list.txt','r').read().split(','))

n_today_webtoon = {}
  
def get_today_webtoon():
    global n_today_webtoon
    #오늘차 네이버 웹툰 목록 얻기.
    days = ['mon','tue','wed','thu','fri','sat','sun'] 
    page = urllib2.urlopen('http://comic.naver.com/webtoon/weekday.nhn').read() 
    today = re.findall('<h4 class="(\D+)"><span>\D+</span></h4>',page.split('<div class="col col_selected">')[1])[0]
    page = page.split('<h4 class="'+today+'"')[1].split('<h4 class="'+days[days.index(today)+1]+'"')[0]
    href = re.findall("""<a href="(.*)" .*? class="title" title="(.*)">.*?</a>""",page)
    for d in href:
        if d[1].decode('utf-8') in my_webtoon:
            n_today_webtoon['http://comic.naver.com/'+d[0]] = d[1].decode('utf-8')
  
    #오늘차 다음 웹툰 목록 얻기.
    page = urllib2.urlopen('http://webtoon.daum.net/webtoon/').read().decode('utf-8')
    today = page.split('<ul class="list_timeline">')[1].split('</ul> <!-- //'+u'연재시간표'+' -->')[0]
    href = re.findall('<a class="thumb_timeline" href="(.*?)" title="(.*?)">',today)
    for d in href:
        if d[1] in my_webtoon:
            n_today_webtoon['http://webtoon.daum.net/'+d[0]] = d[1]
  
    #오늘차 레진코믹스 웹툰 목록 얻기.
    page = urllib2.urlopen('http://www.lezhin.com/').read()
    today = page.split('lc.Home.init')[1]
    toon = re.findall('{"comicId":(.*?),"seq":\d+}',today)
    for line in toon:
        try:
            page = re.findall('"(.*?)","title":"(.*?)".*?,"completed":0,.*?,"days":"(\d+)"',line.decode('utf-8'))[0]
            today = int(page[2])-1 if int(page[2])-1>=0 else 7 #날짜계산.
            if today==time.localtime().tm_wday and page[1] in my_webtoon:
                n_today_webtoon['http://www.lezhin.com/comic/'+page[0]] = page[1]
        except: pass
    n_today_webtoon = sorted(n_today_webtoon.iteritems(), key=operator.itemgetter(0))
def main():
    global n_today_webtoon
    get_today_webtoon()
  
    naver = u'네이버::'; daum = u'다음::'; lezhin = u'레진::'
    app     = QtGui.QApplication(sys.argv)
    tabs    = QtGui.QTabWidget()
   
    for link,name in n_today_webtoon: #웹툰 갯수만큼 탭을 만듬.
        web = QWebView()
        web.settings().setAttribute(QWebSettings.PluginsEnabled, True)
        web.load(QtCore.QUrl(link))
   
        vBoxlayout    = QtGui.QVBoxLayout()
        vBoxlayout.addWidget(web)
  
        tab1    = QtGui.QWidget()    
        tab1.setLayout(vBoxlayout) #레이아웃을 위에 만든 vBoxlayout으로.
        tabs.resize(1100, 700) #탭 하나당 크기 이정도가 적당함.
        tabs.move(100, 50) #탭을 표시할 위치. 별로 의미없는듯
        if link.find('naver') != -1:
            tabs.addTab(tab1,naver+name)
        elif link.find('daum') != -1:
            tabs.addTab(tab1,daum+name)
        elif link.find('lezhin') != -1:
            tabs.addTab(tab1,lezhin+name)
   
    tabs.setWindowTitle(u'만화 뷰어.')
    tabs.show()
      
    sys.exit(app.exec_())
   
if __name__ == '__main__':
    main()




아래는 내게 맞춰진 setup.py 파일.

#-*- coding: cp949 -*-
from distutils.core import setup
import py2exe, glob
 
setup(
     windows=['hello.py'], #console=['hello.py']가 아니라 앞을 windows로 주면 보기싫은 콘솔 창이 사라짐.
     data_files=[ ('C:\\Users\\Ko\\Desktop\\python exe\\imageformats',glob.glob('C:\\Python27\\Lib\\site-packages\\PyQt4\\plugins\\imageformats\\*.*')) ],
     options = {'py2exe': {
         'bundle_files':3,
         'dist_dir':'C:\\Users\\Ko\\Desktop\\python exe',
         'includes': ['sip','PyQt4.QtNetwork'], #그냥 py2exe로 만들었을때 이러한 모듈이 없다고 에러뜸. 이거 추가.
         "dll_excludes": ["MSVCP90.dll"] #이거 없다고 exe가 안만들어지는데 굳이 필요 없으므로 필요 없다고 표시해둠.
         }},
     zipfile = None
     )


5월 13일 개선.

1. 웹툰을 보다가 종료가 되거나 추가하고싶으면 다시 exe를 만들어야했다. 그래서 웹툰 부분을 주석처리하고 webtoon_list.txt파일에서 이름을 받아서 파싱하는걸로 변경. 


조금 큰 개선 : http://qkqhxla1.tistory.com/347