Skip to content

Commit f230ab9

Browse files
committed
Add experimental code
비동기 연구하여 속도 개선?
1 parent 4011cbc commit f230ab9

File tree

10 files changed

+603
-143
lines changed

10 files changed

+603
-143
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ venv/
55
output/
66
__pycache__
77
*.pyc
8+
module/__pycache__

async/async_article_parser.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ async def article_parse(self, keyword, s_type, page=1, search_pos=''):
6363
article_list = soup.select(".us-post") # 글 박스 전부 select
6464
for element in article_list:
6565
# 글 박스를 하나씩 반복하면서 정보 추출
66-
link = "https://gall.dcinside.com/" + element.select("a")[0]['href'].strip()
66+
link = "https://gall.dcinside.com/" + \
67+
element.select("a")[0]['href'].strip()
6768
num = element.select(".gall_num")[0].text
6869
img = element.select(".ub-word > a > em.icon_pic")
6970
if img:
@@ -72,9 +73,11 @@ async def article_parse(self, keyword, s_type, page=1, search_pos=''):
7273
img = False
7374

7475
title = element.select(".ub-word > a")[0].text
75-
reply = element.select(".ub-word > a.reply_numbox > .reply_num")
76+
reply = element.select(
77+
".ub-word > a.reply_numbox > .reply_num")
7678
if reply:
77-
reply = reply[0].text.replace("[", "").replace("]", "").split("/")[0]
79+
reply = reply[0].text.replace(
80+
"[", "").replace("]", "").split("/")[0]
7881
else:
7982
reply = 0
8083
nickname = element.select(".ub-writer")[0].text.strip()
@@ -118,7 +121,8 @@ async def page_explorer(self, keyword, s_type, search_pos=''):
118121

119122
if len(page_end_btn) == 2:
120123
page_end_btn = page_end_btn[0]
121-
final_page = int(page_end_btn['href'].split('&page=')[1].split("&")[0]) + 1
124+
final_page = int(page_end_btn['href'].split(
125+
'&page=')[1].split("&")[0]) + 1
122126
page['start'] = 1
123127
page['end'] = final_page
124128
else:
@@ -139,7 +143,8 @@ async def page_explorer(self, keyword, s_type, search_pos=''):
139143
# next_pos 구하기 (다음 페이지 검색 위치)
140144
next_pos = soup.select('a.search_next')
141145
if next_pos: # 다음 찾기가 존재하면
142-
next_pos = soup.select('a.search_next')[0]['href'].split('&search_pos=')[1].split("&")[0]
146+
next_pos = soup.select('a.search_next')[0]['href'].split(
147+
'&search_pos=')[1].split("&")[0]
143148
else: # 미존재시
144149
next_pos = 'last'
145150
page['next_pos'] = next_pos
@@ -182,7 +187,8 @@ def run():
182187
return
183188

184189
print(f'상태 : {idx}/{loop_count} 탐색중...')
185-
page_article = parser.article_parse(keyword, search_type["제목+내용"], page=i, search_pos=search_pos)
190+
page_article = parser.article_parse(
191+
keyword, search_type["제목+내용"], page=i, search_pos=search_pos)
186192
print(page_article)
187193

188194
idx += 1 # 페이지 글들을 하나 탐색하면 + 1

async/async_main.py

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from PyQt5.QtCore import *
1111
from PyQt5.QtGui import QIntValidator, QIcon
1212
from PyQt5.QtWidgets import QMessageBox, QTableWidgetItem, QAbstractItemView, QMainWindow
13-
from module.async_article_parser import DCArticleParser
13+
from async_article_parser import DCArticleParser
1414
from qasync import asyncSlot, QApplication
1515

1616
from module.headers import search_type
@@ -76,7 +76,8 @@ def closeEvent(self, QCloseEvent):
7676
keyword = self.txt_keyword.text()
7777
comboBox = self.comboBox.currentText()
7878

79-
data = {'repeat': repeat, 'gallary_id': gallary_id, 'keyword': keyword, 'search_type': comboBox}
79+
data = {'repeat': repeat, 'gallary_id': gallary_id,
80+
'keyword': keyword, 'search_type': comboBox}
8081
self.save_data(data, '../user_save.dat')
8182

8283
self.deleteLater()
@@ -104,15 +105,16 @@ def set_only_int(self):
104105
self.txt_repeat.setValidator(self.onlyInt)
105106

106107
def setTableWidget(self):
107-
self.articleView.setEditTriggers(QAbstractItemView.NoEditTriggers) # TableWidget 읽기 전용 설정
108-
self.articleView.setColumnWidth(0, 60); # 글 번호
109-
self.articleView.setColumnWidth(1, 430); # 제목
110-
self.articleView.setColumnWidth(2, 50); # 댓글수
108+
self.articleView.setEditTriggers(
109+
QAbstractItemView.NoEditTriggers) # TableWidget 읽기 전용 설정
110+
self.articleView.setColumnWidth(0, 60) # 글 번호
111+
self.articleView.setColumnWidth(1, 430) # 제목
112+
self.articleView.setColumnWidth(2, 50) # 댓글수
111113

112-
self.articleView.setColumnWidth(3, 100); # 글쓴이
113-
self.articleView.setColumnWidth(4, 60); # 작성일
114-
self.articleView.setColumnWidth(5, 40); # 조회
115-
self.articleView.setColumnWidth(6, 40); # 추천
114+
self.articleView.setColumnWidth(3, 100) # 글쓴이
115+
self.articleView.setColumnWidth(4, 60) # 작성일
116+
self.articleView.setColumnWidth(5, 40) # 조회
117+
self.articleView.setColumnWidth(6, 40) # 추천
116118

117119
def setTableAutoSize(self):
118120
header = self.articleView.horizontalHeader()
@@ -141,7 +143,8 @@ async def search(self): # 글검색 버튼
141143
if self.txt_id.text() != '' and self.txt_keyword.text() != '' and self.txt_repeat.text() != '':
142144
task = asyncio.create_task(self.run())
143145
else:
144-
QMessageBox.information(self, '알림', '값을 전부 입력해주세요.', QMessageBox.Yes)
146+
QMessageBox.information(
147+
self, '알림', '값을 전부 입력해주세요.', QMessageBox.Yes)
145148

146149
async def run(self):
147150
global running, parser
@@ -195,7 +198,8 @@ async def run(self):
195198
if idx > loop_count or search_pos == 'last':
196199
break
197200

198-
await asyncio.sleep(0.1) # 디시 서버를 위한 딜레이 (비동기 Non-Blocking 을 위해 동기 time.sleep 을 사용하지 않는다.)
201+
# 디시 서버를 위한 딜레이 (비동기 Non-Blocking 을 위해 동기 time.sleep 을 사용하지 않는다.)
202+
await asyncio.sleep(0.1)
199203

200204
label.run(f'상태 : {idx}/{loop_count} 탐색중...')
201205
idx += 1 # 글을 못찾고 넘어가도 + 1
@@ -238,24 +242,31 @@ def QTableWidgetUpdate(self, article):
238242
self.articleView.insertRow(row_position)
239243

240244
item_num = QTableWidgetItem()
241-
item_num.setData(Qt.DisplayRole, int(data['num'])) # 숫자로 설정 (정렬을 위해)
245+
item_num.setData(Qt.DisplayRole, int(
246+
data['num'])) # 숫자로 설정 (정렬을 위해)
242247
self.articleView.setItem(row_position, 0, item_num)
243248

244-
self.articleView.setItem(row_position, 1, QTableWidgetItem(data['title']))
249+
self.articleView.setItem(
250+
row_position, 1, QTableWidgetItem(data['title']))
245251

246252
item_reply = QTableWidgetItem()
247-
item_reply.setData(Qt.DisplayRole, int(data['reply'])) # 숫자로 설정 (정렬을 위해)
253+
item_reply.setData(Qt.DisplayRole, int(
254+
data['reply'])) # 숫자로 설정 (정렬을 위해)
248255
self.articleView.setItem(row_position, 2, item_reply)
249256

250-
self.articleView.setItem(row_position, 3, QTableWidgetItem(data['nickname']))
251-
self.articleView.setItem(row_position, 4, QTableWidgetItem(data['timestamp']))
257+
self.articleView.setItem(
258+
row_position, 3, QTableWidgetItem(data['nickname']))
259+
self.articleView.setItem(
260+
row_position, 4, QTableWidgetItem(data['timestamp']))
252261

253262
item_refresh = QTableWidgetItem()
254-
item_refresh.setData(Qt.DisplayRole, int(data['refresh'])) # 숫자로 설정 (정렬을 위해)
263+
item_refresh.setData(Qt.DisplayRole, int(
264+
data['refresh'])) # 숫자로 설정 (정렬을 위해)
255265
self.articleView.setItem(row_position, 5, item_refresh)
256266

257267
item_recommend = QTableWidgetItem()
258-
item_recommend.setData(Qt.DisplayRole, int(data['recommend'])) # 숫자로 설정 (정렬을 위해)
268+
item_recommend.setData(Qt.DisplayRole, int(
269+
data['recommend'])) # 숫자로 설정 (정렬을 위해)
259270
self.articleView.setItem(row_position, 6, item_recommend)
260271

261272
@pyqtSlot(str)

0 commit comments

Comments
 (0)