-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmainParser.py
More file actions
executable file
·109 lines (79 loc) · 3.45 KB
/
mainParser.py
File metadata and controls
executable file
·109 lines (79 loc) · 3.45 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
# coding: utf-8
import cPickle as pickle
from parser import Parser
import sys
import signal
counter = 0 # Счетчик регистрационных номеров
serializedObject = {} # Объект сериализации
p = None # Класс для парсинга и записи в базу
def signalToSerialization(signal = None, frame = None, serializationFile = 'ser.pickle'):
# Сериализация
if counter == 0:
sys.exit(0)
print u'\nПоследний обработанный регистрационный номер - %d' % (counter - 1)
serializedObject['counter'] = counter
with open(serializationFile, 'wb') as f:
pickle.dump(serializedObject, f)
sys.exit(0)
def deserialization(serializationFile = 'ser.pickle'):
count = 0
try:
with open(serializationFile, 'rb') as f:
serializedObject = pickle.load(f)
# Проверка счетчика на соотвествие формату регистрационного номера
count = serializedObject['counter']
if count < 100000000 or count > 999999999 or (int(str(count)[1]) > 0 and int(str(count)[1]) < 9):
print u'Неверный формат счетчика в ' + serializationFile
count = 100000000
except(IOError):
count = 100000000
finally:
return count
# Нажатие ctrl-c запускает сериализацию, а затем завершает работу программы
signal.signal(signal.SIGINT, signalToSerialization)
# Разбор параметров командной строки
if len(sys.argv) == 2 and sys.argv[1] == '-help':
print u'\nИнструкция по эксплуатации:'
print u'Первый аргумент – имя базы данных в PSQL\nВторой аргумент – имя пользователя БД\nТретий аргумент – IP адрес хоста БД'
print u'Четвертый аргумент – пароль пользователя БД\nПятый аргумент – имя таблицы в базе данных\n'
print u'При необходимости, завершить работу программы можно комбинацией клавиш ctrl + C\n'
sys.exit(0)
elif len(sys.argv) == 6:
p = Parser(
dataBaseName = sys.argv[1],
dbUsername = sys.argv[2],
hostname = sys.argv[3],
userPass = sys.argv[4],
tableName = sys.argv[5], )
else:
print u'Неверный формат параметров запуска. Запустите скрипт с параметром -help для вывода инструкции'
sys.exit(0)
# Десериализация
counter = deserialization()
try:
# Код парсинга и добавления в БД
firstDigit = int(str(counter)[0])
secondDigit = int(str(counter)[1])
for fd in range(firstDigit, 10):
if secondDigit == 0:
topLimit = fd * (10 ** 8) + (10 ** 7)
while counter < topLimit:
# Загрузка страницы
p.loadPage(counter)
# Парсинг и запись в БД
counter = p.parseAndPush()
counter = fd * (10 ** 8) + (9 * (10 ** 8))
secondDigit = 9
if secondDigit == 9:
topLimit = (fd + 1) * (10 ** 8)
while counter < topLimit:
# Загрузка страницы
p.loadPage(counter)
# Парсинг и запись в БД
counter = p.parseAndPush()
secondDigit = 0
except (KeyboardInterrupt):
signalToSerialization()
except (RuntimeError, ValueError) as error:
signalToSerialization()
raise error