예제 #1
0
def direct_order():
    """
    task_num:
        номер задания передается строкой типа '0001-0646'
        номера задач передается списком типа ['0001-0646-0001','0001-0646-0002','0001-0646-0003']
    :return:

    """
    task_num = '0001-0661'
    # task_num = ['0001-0661-0036', '0001-0661-0035']
    for_connect = 'DRIVER={SQL Server};SERVER=10.199.13.57;DATABASE=rway;UID=vdorofeev;PWD=VD12345#'  #Настройки подключения к базе RWAY, будет использовано для подключения в синхронной и асинхронной функциях
    # prepare_data  - Получение списка задач в задании с некоторыми предварительными хар-ками, или по списку задач получения предварительных хар-к
    prepare_data = pasing_verification_char.task_list_prepare(
        task_num=task_num, for_connect=for_connect)
    # pasing_verification_char.excluding_task  - Из предварительного списка задач отфильровываются задачи запущенные несколько раз
    # (задачи запущенные по одному и тому же источнику, берутся задачи с максимальным количество спарсенных предложений)
    # Там же выводится небольшая статистика по ззадачам и записывается в фал  небольшой лог (в котором указывается  сколько задач и с каким статусом на данный момент в данном задании)
    #pasing_verification_char.main -  Запуск основной асинхронной функции парсинга
    filtered_prepare_data = pasing_verification_char.excluding_task(
        prepare_data)
    pasing_verification_char.main(filtered_prepare_data, for_connect)
    cprint('Файл с результатами парсинга:', 'yellow', end=' '), print(
        pasing_verification_char.file_path_of_result_data[0])

    try:
        with open(pasing_verification_char.file_path_of_result_data[0],
                  'r',
                  encoding='utf-8') as fp:
            for_print = json.load(fp)
    except Exception as e:
        cprint(f'Ошибка открытия файла с результатами парсинга: {e}', 'red')
    try:
        pasing_print.main(for_print)
    except Exception as e:
        cprint(f'Ошибка в модуле pasing_print: {e}', 'red')
예제 #2
0
async def gobaby(task_list_prepare_data, for_connect):
    '''
    Основная асинхронная  функиця создания и запуска других  асинхронных функций получения данных по задачам (в формате async).
    Пришлось создать эту задачу, а не осуществлять данный код в функции main потому, что в main присутствует
    вызов обычной (синхронной) функции task_list_prepare для предварительного получения списка задач. В таком случае main
    не может быть асинхронной а как следствие не может создать и запустить другие асинхронные функции.
    Либо необходимо единственныю синхронную функцию тоже делать условно асинхронной (что, как бы не нужно по сути,
    она должна выполнится первой и выполняется достаточно быстро)

    :param task_list_prepare_data:  Список всех задач парсинга (Иначе они называются задачи ИМПОРТА)
    :param for_connect: Настройки для подключения к базе данных
    :return:   Ничего не возвращает
    '''
    begin = time.time()  #условное время начала запуска скрипта
    futures = [
        task_full_info(args, for_connect) for args in task_list_prepare_data
    ]  #созадниае списка фьючерсов (функций, которые будут выполнены в асинхронном режиме)
    #Это и есть те финкии, которые будут получать данные о  качестве заполняемости по каждой задаче
    #В качестве аргументов передается параметры одной задачи из списка задач и свойства подключения в базе данных

    done, _ = await asyncio.wait(futures)  #Запуск всех ФУТУР !!!
    for_output = [
    ]  #Список в котором будут собираться результаты, формат - СПИСОК СЛОВАРЕЙ
    for future in done:  #Если футура выполнена
        try:
            for_output.append(
                future.result()
            )  #В результирующий список добавляются результат выполнения футуры
        except Exception as e:
            cprint(('Ошибка вот такая', e), 'red')
    cprint(
        (f'Общее время выполнения всех задач  = {(time.time() - begin):.1f}' +
         ' сек'), 'green')

    #Запись всех результатов полученных выше в файл json  и указанием даты и времени в имени файла
    time_now = (datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S"))
    with open(
            r'C:\Users\user1\AppData\Roaming\JetBrains\PyCharmCE2020.1\scratches\parse_resilt_items\async_items_({}).json'
            .format(time_now),
            'w',
            encoding='utf-8') as fp:
        json.dump(for_output, fp, ensure_ascii=False, indent=4)
        print(
            r'Файл записан в C:\Users\user1\.PyCharmCE2019.3\config\scratches\async_items_({}).json'
            .format(time_now))
    try:
        pasing_print.main(for_output)
    except Exception as e:
        cprint(f'Ошибка в модуле pasing_print вот такая {e}', 'red')
예제 #3
0
def direct_order():
    """
    Оснавная функция упорядочивания получения статистических данных.
    TASK_NUM - номер задания. берется из файла конфига или из командной строки если этот файл запускался так
    (python parsing_manage.py 0001-0771). Оба варианта работа востребованы (из скрипта parse_monitor).
    1)prepare_data  - Получение списка задач в задании с некоторыми предварительными хар-ками, или по списку задач получения предварительных хар-к
    2)filtered_prepare_data - Из предварительного списка задач отфильровываются задачи запущенные несколько раз,
        (задачи запущенные по одному и тому же источнику, берутся задачи с максимальным количество спарсенных предложений)
    3)pasing_verification_char.main -  Запуск основной асинхронной функции парсинга статистических данных
    Результат формирования статистических данных записывается в файл в папке "parse_result", имя файла это номер
    задачи (формат JSON).
    4) Печать статистических данных в консоль через модуль pasing_print

    номер задания передается строкой типа '0001-0646'
    номера задач передается списком типа ['0001-0646-0001','0001-0646-0002','0001-0646-0003']
    :return: ничего не возвращает, но формирует файл
    """
    try:
        task_from_cmd = sys.argv[
            1]  # Нати переданнные в командной строке аргументы при запуске (номер задания)
    except:
        task_from_cmd = False  # Если  В командной строке  номер задания не передавался
    TASK_NUM = task_from_cmd if task_from_cmd else CONFIG.TASK_NUM  # Если номер задания передан в командной строке,  иначе из конфига
    prepare_data = pasing_verification_char.task_list_prepare(
        task_num=TASK_NUM, for_connect=CONFIG.FOR_CONNECT)
    filtered_prepare_data = pasing_verification_char.excluding_task(
        prepare_data)
    pasing_verification_char.main(filtered_prepare_data, CONFIG.FOR_CONNECT)
    cprint('Файл с результатами парсинга:', 'yellow', end=' ')

    if CONFIG.PRINT_ALLTASK_STATISTIC:  #Печать статистических данных в консоль через модуль pasing_print
        try:
            print(pasing_verification_char.file_path_of_result_data[0])
            with open(pasing_verification_char.file_path_of_result_data[0],
                      'r',
                      encoding='utf-8') as fp:
                for_print = json.load(fp)  #Считывание файла
        except Exception as e:
            cprint(f'Ошибка открытия файла с результатами парсинга: {e}',
                   'red')
        pasing_print.main(for_print)  #печать через модуль
예제 #4
0
    loop.close()                                                #закрытия планировщика задач после выполнения

    #Запись файла с результатами парсинга
    file_path=r'C:\Users\user1\Desktop\pasing_verification_RWAY\add_manage\parse_result\{}.json'.format(file_path_of_result_data.pop())
    with open(file_path, 'w', encoding='utf-8') as fp:
        json.dump(for_output, fp, ensure_ascii=False, indent=4)
    file_path_of_result_data.append(file_path)    #Путь к результирующему файлу для печати



if __name__ == "__main__":

    #Для отладки
    task_num = '0001-0661'
    # task_num = ['0001-0649-0014']
    # for_connect = 'DRIVER={SQL Server};SERVER=10.199.13.60;DATABASE=rway;UID=vdorofeev;PWD=Sql01'  #Настройки подключения к базе RWAY, будет использовано для подключения в синхронной и асинхронной функциях
    for_connect = 'DRIVER={SQL Server};SERVER=10.199.13.57;DATABASE=rway;UID=vdorofeev;PWD=VD12345#'  # Настройки подключения к базе RWAY, будет использовано для подключения в синхронной и асинхронной функциях
    """ Нельзя передавать одно подключение в потоки (aioodbc.connect(dsn=for_connect) или pyodbc.connect(for_connect)), первый поток выполнится а другие скажут что соединение занято
        Нельзя передавать в потоки один курсор (conn.cursor()), первый поток выполнится а другие сойдут с ума т.к. курсор переместится в первом потоке
        Но можно передать простую строку настроек которая будет использована  при каждом подключении к серверу SQL
    """
    prepare_data = task_list_prepare(task_num= task_num ,for_connect = for_connect)  # получение перечня всех задач входящих в задание (в синхронном формате, потому что быстро)
    main(prepare_data,for_connect)

    import pasing_print
    with open(file_path_of_result_data[0], 'r', encoding='utf-8') as fp:
        for_print=json.load(fp)
    try:
        pasing_print.main(for_print)
    except Exception as e:
        cprint(f'Ошибка в модуле pasing_print вот такая {e}','red')