def bolter(file, l_dir): try: get_xml_to_dict(file, l_dir) except Exception as exppars: logging.exception("Ошибка: ") parser_org_223.logging_parser('Не удалось пропарсить файл', exppars, file)
def extract_org(m, path_parse1): l = get_ar(m, path_parse1) if l: # print(l) r_ind = l.rindex('.') l_dir = l[:r_ind] os.mkdir(l_dir) try: z = zipfile.ZipFile(l, 'r') z.extractall(l_dir) z.close() except UnicodeDecodeError as ea: parser_org_223.logging_parser('Не удалось извлечь архив', ea, l) try: os.system('unzip %s -d %s' % (l, l_dir)) except Exception as ear: parser_org_223.logging_parser( 'Не удалось извлечь архив альтернативным методом', ear, l) return except Exception as e: logging.exception("Ошибка: ") parser_org_223.logging_parser('Не удалось извлечь архив', e, l) return try: file_list = os.listdir(l_dir) except Exception as ex: logging.exception("Ошибка: ") parser_org_223.logging_parser('Не удалось получить список файлов', ex, l_dir) else: for f in file_list: bolter(f, l_dir) os.remove(l) shutil.rmtree(l_dir, ignore_errors=True)
def get_xml_to_dict(filexml, dirxml): path_xml = dirxml + '/' + filexml # print(path_xml) with open(path_xml) as fd: try: s = fd.read() s = s.replace("ns2:", "") s = s.replace("oos:", "") doc = xmltodict.parse(s) parser_org_223.parser(doc, path_xml) except Exception as ex: logging.exception("Ошибка: ") parser_org_223.logging_parser('Ошибка конвертации в словарь', ex, path_xml)
def main(): with open(file_log, 'a') as flog: flog.write(f'Время начала работы парсера: {datetime.datetime.now()}\n') if len(sys.argv) == 1: print( 'Недостаточно параметров для запуска, используйте daily или last в качестве параметра' ) exit() shutil.rmtree(temp_dir, ignore_errors=True) os.mkdir(temp_dir) path_parse = '' try: if str(sys.argv[1]) == 'daily': path_parse = '/out/nsi/nsiOrganization/daily' arr_tenders = get_list_ftp_daily(path_parse) elif str(sys.argv[1]) == 'last': path_parse = '/out/nsi/nsiOrganization' arr_tenders = get_list_ftp_last(path_parse) else: print( 'Неверное имя параметра, используйте daily или last в качестве параметра' ) arr_tenders = [] exit() if not arr_tenders: parser_org_223.logging_parser('Получен пустой список архивов', path_parse) for j in arr_tenders: try: extract_org(j, path_parse) except Exception as exc: # print('Ошибка в экстракторе и парсере ' + str(exc) + ' ' + j) logging.exception("Ошибка в экстракторе и парсере: ") parser_org_223.logging_parser('Ошибка в экстракторе и парсере', exc, j) continue except Exception as ex: logging.exception("Ошибка: ") parser_org_223.logging_parser('Не удалось получить список архивов', ex, path_parse) with open(parser_org_223.file_log, 'a') as flog: flog.write( f'Добавлено заказчиков Organization223 {parser_org_223.Organization.log_insert} \n' ) flog.write( f'Обновлено заказчиков Organization223 {parser_org_223.Organization.log_update} \n' ) flog.write( f'Время окончания работы парсера: {datetime.datetime.now()}\n\n\n')
def get_ar(m, path_parse1): global temp_dir retry = True count = 0 while retry: try: lf = down_timeout(m, path_parse1) retry = False if count > 0: parser_org_223.logging_parser( 'Удалось скачать архив после попытки', count, m) return lf except Exception as ex: logging.exception("Ошибка: ") parser_org_223.logging_parser('Не удалось скачать архив', ex, m) if count > 100: parser_org_223.logging_parser( 'Не удалось скачать архив за 100 попыток', ex, m) return 0 count += 1 time.sleep(5)
for j in arr_tenders: try: extract_org(j, path_parse) except Exception as exc: # print('Ошибка в экстракторе и парсере ' + str(exc) + ' ' + j) logging.exception("Ошибка в экстракторе и парсере: ") parser_org_223.logging_parser('Ошибка в экстракторе и парсере', exc, j) continue except Exception as ex: logging.exception("Ошибка: ") parser_org_223.logging_parser('Не удалось получить список архивов', ex, path_parse) with open(parser_org_223.file_log, 'a') as flog: flog.write( f'Добавлено заказчиков Organization223 {parser_org_223.Organization.log_insert} \n' ) flog.write( f'Обновлено заказчиков Organization223 {parser_org_223.Organization.log_update} \n' ) flog.write( f'Время окончания работы парсера: {datetime.datetime.now()}\n\n\n') if __name__ == "__main__": try: main() except Exception as exm: parser_org_223.logging_parser('Ошибка в функции main', exm)