-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathxakepdown.py
More file actions
147 lines (116 loc) · 4.42 KB
/
xakepdown.py
File metadata and controls
147 lines (116 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# -*- coding: utf-8 -*-
"""
Редактор Spyder
Это временный скриптовый файл.
"""
from xkhtml import xakep
from xksql import tsqlite
from os import getcwd
from time import sleep, time
import sys
import threading
DMPFILE = r'{}\xakepissues.txt'.format(getcwd()) # файл для сохранения данных по умолчанию
THREAD_CHUNK = 20
threads = []
ALL_ISSUES = []
def worker_parse_to_file(n_start, n_end, auth=None, dumpfile=None, update_array=False):
"""
"""
global ALL_ISSUES
xkparser = None
start_time = time()
try:
xkparser = xakep(auth)
except Exception as err:
print(err)
return
if not xkparser: return
lsdata = xkparser.get_issues(n_start, n_end, True)
with threading.Lock():
if dumpfile:
xkparser.dump_issues_to_file(lsdata, dumpfile, False)
if update_array:
for dres in lsdata:
ALL_ISSUES.append(dres)
time_taken = time() - start_time
print('СКАЧАНЫ ДАННЫЕ ПО ВЫПУСКАМ {:d} - {:d}\t\t\t\t[{:d} активных потоков] - [выполнено за {:.2f} с.]'.format(n_start, n_end, len(threading.enumerate()), time_taken))
def update_dumpfile(auth, dumpfile, fill_global_list=False):
"""
"""
global threads
xkparser = None
try:
xkparser = xakep(auth)
except Exception as err:
print(err)
return
if not xkparser: return
n_end = xkparser.getlastissue_number()
thr_cnt = n_end // THREAD_CHUNK
cur_threads = len(threading.enumerate())
for n_thread in range(0, thr_cnt + 1):
st = n_thread * THREAD_CHUNK + 1
en = (n_thread + 1) * THREAD_CHUNK
if en > n_end: en = n_end
next_thread = threading.Thread(target=worker_parse_to_file, args=(st, en, auth, dumpfile, fill_global_list))
threads.append(next_thread)
next_thread.start()
try:
while len(threading.enumerate()) > cur_threads:
sleep(0.5)
except KeyboardInterrupt:
print('!!! Waiting for running threads to finish ...')
for next_thread in threads:
next_thread.join()
print('!!! STOPPED ALL THREADS.')
raise
def on_before_insert_issue(xkdb_object, dres):
"""
"""
print('>>> INSERTING iss. {:d}...\t\t\t\t'.format(dres['number']), end='')
def on_insert_issue(xkdb_object, dres):
"""
"""
print('done iss. {:d}.'.format(dres['number']))
def on_error_insert_issue(xkdb_object, dres, err_message):
"""
"""
print('!!! ERROR iss. {:d}: "{:s}"'.format(dres['number'], err_message))
def update_db(auth=None, clear_db=False):
"""
"""
xkparser = None
try:
xkparser = xakep(auth)
except Exception as err:
print(err)
return
if not xkparser: return
xkdb = tsqlite(r'{}\xakepdb.db'.format(getcwd()), True, clear_db)
if not xkdb:
print('Ошибка открытия / создания БД!')
return
else:
print('*** Подключение к СУБД установлено. {:s}***'.format('БД очищена! ' if clear_db else ''))
last_iss = 1
if not clear_db:
last_iss = xkdb.get_last_issue_number()
print('*** Последний выпуск в БД = {}'.format(last_iss))
d_issues = xkparser.get_issues(n_issue_start=1 if clear_db else last_iss + 1)
if isinstance(d_issues, dict) and 'Error' in d_issues:
print(d_issues['Error'])
return
print('*** Скачаны с сайта данные по {} выпускам'.format(len(d_issues)))
xkdb.insert_issue_records(d_issues, commit=True, on_before_insert=on_before_insert_issue, on_insert=on_insert_issue, on_error=on_error_insert_issue)
print('*** СУБД обновлена! БД содержит {:d} выпусков. ***'.format(xkdb.get_issue_count()))
def main():
"""
Главная функция.
"""
if len(sys.argv) != 1 and len(sys.argv) != 3:
print('ИСПОЛЬЗОВАНИЕ:\n{} [{} {}]'.format(sys.argv[0], 'ЛОГИН (опционально)', 'ПАРОЛЬ (опционально)'))
return
auth = (sys.argv[1], sys.argv[2]) if len(sys.argv) == 3 else None
update_db(auth)
if __name__ == '__main__':
main()