Быстрый старт
npm install -g typescript
- Подготовка среды разработки
Рекомендуется использовать IDEA. Необходимо загрузить версию Ultimate, иначе некоторые функции будут недоступны.
Конфигурирование Node.js и JavaScript в IDEA:
-
Конфигурация Node.js:
-
Установите Git и настройте путь к исполняемому файлу Git в IDEA.
-
Клонируйте проект ppspider_example из GitHub.
-
Конфигурация JavaScript:
-
Откройте окно настроек.
-
Перейдите в раздел «Languages & Frameworks».
-
Выберите JavaScript.
-
Настройте параметры компилятора, библиотеки и проверки кода.
- Скачивание и запуск ppspider_example
Скачайте проект ppspider_example с GitHub по адресу https://github.com/xiyuan-fengyu/ppspider_example.
- В IDEA откройте терминал.
- Введите команду для установки зависимостей npm:
Во время установки puppeteer автоматически загрузит Chromium. Пользователи из Китая могут столкнуться с проблемами при загрузке. Если загрузка не удалась, удалите папку node_modules/puppeteer и измените адрес зеркала Chromium:
Для Windows:
set PUPPETEER_DOWNLOAD_HOST=https://npm.taobao.org/mirrors/
Для Unix:
export PUPPETEER_DOWNLOAD_HOST=https://npm.taobao.org/mirrors/
Затем снова установите зависимости npm.
- Запустите tsc. Это инструмент для компиляции TypeScript. Он будет следить за изменениями в файлах TypeScript и автоматически компилировать изменённые файлы.
Запустить tsc можно двумя способами:
— Щёлкните правой кнопкой мыши на package.json, выберите Show npm Scripts и дважды щёлкните auto build.
— Откройте терминал в IDEA и введите команду tsc.
- Запустите программу.
Щелкните правой кнопкой мыши файл lib/quickstart/App.js и выберите Run. Затем перейдите по адресу http://localhost:9000 в браузере, чтобы отслеживать работу программы в реальном времени.
Использование Docker для развёртывания проекта
В этом разделе описывается использование Docker для развёртывания проекта.
Пример
Приведён пример использования проекта.
Система
Описываются различные аспекты системы, такие как декораторы, инструменты PuppeteerUtil, NetworkTracing, базы данных, журналы и т. д.
Отладка
Обсуждаются вопросы отладки.
Связанные знания
Перечислены связанные технологии, такие как jQuery, puppeteer, nedb, MongoDB, Angular, G2, Bootstrap.
Контрольный интерфейс
Рассматривается контрольный интерфейс.
Вопросы
Предоставляются ответы на часто задаваемые вопросы.
Обновление журнала
Приводятся обновления журнала. docker 部署项目
-
ppspider-webMonitor: мониторинг веб-сайта, визуализация результатов в реальном времени, просмотр всех запросов при открытии веб-страницы.
-
DynamicParallelApp: динамическое задание параллельного числа задач с помощью выражения cron.
-
QueueWaitToRunApp: ожидание выполнения очереди после достижения определённых условий.
-
ScreenshotApp: захват скриншотов веб-страниц, включая длинные страницы.
-
BilibiliApp: сбор информации и комментариев с B站.
-
Page Proxy: настройка прокси для отдельных страниц.
-
QQ Music: сбор информации о музыке и комментариях на QQ Music.
-
CheerioApp: пример использования request и cheerio для сбора данных со статических веб-сайтов.
-
TwitterApp: сбор тем и комментариев в Twitter.
-
DepthFirstSearchApp: пример поиска в глубину (обычно используется DefaultQueue для поиска в ширину).
-
QuotesToScrapeApp: использование request и cheerio для сбора цитат со статического веб-сайта.
-
Music163App: загрузка музыки с Music163.
-
ProxyPool: пул прокси.
-
Bandcamp Music download: скачивание музыки с Bandcamp.
-
SetMaxTryApp: установка максимального количества попыток для задания.
-
PuppeteerEvalAsyncApp: выполнение async function с использованием Page.evaluate.
-
AddToRegexQueue: использование регулярных выражений для создания групп очередей.
-
PuppeteerUtil.dragJigsaw: проверка кода с помощью ползунка.
-
HandlBadRequestOnHeadlessApp: обработка некорректных ответов в безголовом режиме.
Система: введение
Декораторы — это функции, которые могут изменять поведение классов или методов. В ppspider многие функции реализованы с помощью декораторов.
@Launcher: запуск системы. Принимает параметры, такие как каталог работы, кэш очереди, конфигурация базы данных, задачи, пользовательские интерфейсы данных и фабрики рабочих процессов.
@OnStart: объявляет задачу, которая выполняется один раз при запуске системы. Может быть повторно запущена из интерфейса управления. Определение класса
В системе встроен класс DbHelperUi. После внедрения DataUi в систему, на пользовательском интерфейсе (UI) можно добавить вкладку «Db Helper», которая помогает запрашивать данные из базы данных.
Пример 1: демонстрация основных функций DataUi
example 1 DataUi 基本功能演示

Пример 2: демонстрация добавления задач в UI динамически
example 2 演示UI界面动态添加任务的例子

Пример 3: инструмент для создания скриншотов веб-страниц
example 3 网页截图工具
Поддерживает создание скриншотов очень длинных веб-страниц.

Класс инструментов PuppeteerUtil
Методы класса PuppeteerUtil:
-
PuppeteerUtil.defaultViewPort: устанавливает разрешение окна страницы равным 1920 * 1080.
-
PuppeteerUtil.addJquery: внедряет jquery в страницу. Однако после обновления или перехода страницы этот метод становится неэффективным, поэтому его следует вызывать после загрузки страницы.
-
PuppeteerUtil.jsonp: используется для анализа данных jsonp.
-
PuppeteerUtil.setImgLoad: позволяет отключить или включить загрузку изображений.
-
PuppeteerUtil.onResponse: отслеживает результаты вызовов API и позволяет настроить количество отслеживаемых вызовов.
-
PuppeteerUtil.onceResponse: отслеживает результат одного вызова API.
-
PuppeteerUtil.downloadImg: скачивает изображение.
-
PuppeteurUtil.links: получает ссылки с веб-страницы.
-
PuppeteerUtil.count: подсчитывает количество элементов, соответствующих селектору. Не поддерживает jQuery.
-
PuppeteerUtil.specifyIdByJquery: использует jQuery(selector) для поиска узла и присваивает случайный идентификатор узлам без идентификатора. Возвращает массив всех идентификаторов узлов. Используется, когда document.querySelector / document.querySelectorAll не поддерживают сложные селекторы jQuery.
-
PuppeteerUtil.scrollToBottom: прокручивает страницу до конца.
-
PuppeteerUtil.parseCookies: преобразует строку cookie в массив SetCookie, который затем можно использовать для установки cookie с помощью page.setCookie(...cookieArr).
-
PuppeteerUtil.useProxy: устанавливает динамический прокси для отдельной страницы.
Примеры использования PuppeteerUtil:
PuppeteerUtil example
Пример использования прокси
NetworkTracing
Используется для отслеживания запросов при открытии страницы.
NetworkTracing example
База данных
Предоставляется поддержка nedb и mongodb через NedbDao и MongodbDao соответственно. Настройка соединения с базой данных осуществляется через параметр dbUrl в @Launcher. Доступ к базе данных можно получить через appInfo.db.
Nedb — это база данных без сервера, не требующая дополнительной установки серверной части. Данные сохраняются локально. Формат URL: nedb://nedbDirectoryPath. Подходит для приложений с небольшим объёмом данных.
MongoDB требует дополнительной установки сервера MongoDB. Формат URL: mongodb://username:password@host:port/dbName. Подходит для больших объёмов данных.
После запуска приложения автоматически создаётся коллекция job для хранения записей о выполняемых задачах.
Журналы
Для вывода журналов используются методы logger.debug, logger.info, logger.warn и logger.error, определённые в src/common/util/logger.ts. В журналах содержится информация о времени, уровне журнала и местоположении исходного файла.
logger.debugValid && logger.debug("test debug");
logger.info("test info");
logger.warn("test warn");
logger.error("test error");
Отладка
Код, выполняемый через Page.evaluate, Page.evaluateOnNewDocument и Page.evaluateHandle, фактически выполняется через chrome devtools protocol в chromium. Этот код нельзя отладить непосредственно в IDEA. Можно отлаживать только код, который выполняется напрямую Nodejs.
Чтобы отладить код, выполните следующие шаги:
- При создании PuppeteerWorkerFactory установите параметры headless = false и devtools = true.
- Когда chromium достигает точки останова, он автоматически останавливается. ```
Затем перед кодом, который нужно отладить, добавьте строку debugger;
import {Job, OnStart, PuppeteerWorkerFactory} from "ppspider";
import {Page} from "puppeteer";
export class TestTask {
@OnStart({
urls: "http://www.baidu.com",
workerFactory: PuppeteerWorkerFactory
})
async index(page: Page, job: Job) {
await page.goto(job.url());
const title = await page.evaluate(() => {
debugger;
const title = document.title;
console.log(title);
return title;
});
console.log(title);
}
}
Кроме того, при разработке DataUi разработчики также отлаживают интерфейсную часть в браузере

Связанные знания
jQuery
http://www.runoob.com/jquery/jquery-syntax.html
После внедрения jQuery с помощью PuppeteerUtil.addJquery можно с удовольствием использовать jQuery для получения нужной информации со страницы
puppeteer
https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md
Обёртка над chrome devtools protocol
При извлечении страниц в основном приходится работать с Page, поэтому необходимо внимательно изучить API, связанные с Page
nedb
https://github.com/louischatriot/nedb
Лёгкая база данных без сервера на основе памяти и журнала, похожая на Mongodb по способу запроса
src/common/db/NedbDao.ts дополнительно упаковывает загрузку, сжатие данных и базовые запросы, что упрощает наследование и использование пользователями
mongodb
https://docs.mongodb.com/manual/reference/method/js-collection/
Angular
https://angular.io/
DataUi работает на основе динамически компилируемого компонента angular во время выполнения. Если вы хотите написать сложный DataUi, вам необходимо понимать Angular
G2
https://antv.alipay.com/zh-cn/g2/3.x/demo/index.html
В веб-интерфейсе интегрирован G2, что удобно для реализации визуализации данных в DataUi
bootstrap
https://v3.bootcss.com/css/
В веб-интерфейс интегрированы bootstrap и jquery, что позволяет напрямую использовать bootstrap и jquery для написания интерфейса ui
Интерфейс управления
Откройте http://localhost:9000 в браузере.
Панель Queue позволяет просматривать и управлять состоянием выполнения всех дочерних задач в системе

Панель Job позволяет искать все экземпляры дочерних задач и просматривать подробную информацию о задачах

Проблемы
- При использовании режима отладки в idea после некоторого времени работы кода он может остановиться на определённой строке, как будто на точке останова. Это связано с нехваткой памяти, которую можно решить, добавив параметр узла --max-old-space-size=8192
Эта проблема часто возникала в предыдущих версиях, особенно в процессе хранения и извлечения данных nedb, из-за неправильного выполнения сериализации и десериализации. В новой версии (v2.1.2) была проведена оптимизация
- При использовании версии v2.2.0+ @OnStart, @OnTime, @FromQueue удалили атрибут workerFactory. Если вам нужно использовать страницу puppeteer для извлечения веб-страницы, вы можете импортировать класс Page через
import {Page} from "ppspider";
Затем объявите параметр page: Page в списке параметров функции обратного вызова. Если импортировать через
import {Page} из "puppeteer", то импортированная страница будет только интерфейсом, и невозможно определить тип параметра через reflect-metadata, что приведёт к невозможности нормальной инъекции параметра page, и эта ошибка будет проверена при запуске.
Журнал обновлений
2020-04-07 v2.2.3
- Решена проблема, когда в случае междоменного доступа page.frames не может найти iframe
- Оптимизирована реализация PuppeteerUtil.dragJigsaw для повышения точности
2019-09-04 v2.2.3-preview.1578363288631
- Исправлена ошибка, из-за которой задача прерывалась и больше не повторялась
2019-09-04 v2.2.3-preview.1577332807380
- Исправлено: после прерывания задачи пользовательским интерфейсом задача больше не повторяется
- Задача и очередь конфигурации добавляют параметр maxTry, поддерживают значение меньше 0, чтобы всегда пытаться
- Задача и конфигурация очереди добавляют defaultDatas в качестве предустановленного значения job.datas
- Пользовательский интерфейс добавляет операцию переключения состояния выполнения очереди
- Пользовательский интерфейс добавляет функцию изменения конфигурации timeout/maxTry/defaultDatas
2019-09-04 v2.2.3-preview.1574909694087
- Для задач OnStart можно настроить использование BloonFilter (по умолчанию, состояние сохранения после перезапуска не повторяется) или NoFilter (состояние сохранения после перезапуска повторяется)
- Исправлена ошибка в запросе подкачки db
- Добавлен аннотированный метод OnEvent, используемый для прослушивания системных событий, в настоящее время существует только одно практическое применение Пример использования OnEvent
2019-09-04 v2.2.3-preview.1569208986875
- Исправлена проблема с нулевым указателем в методе remove в src/common/db/MongodbDao.ts
- Метод обратного вызова JobOverride добавляет параметр для передачи родительского задания
- Сериализация процесса игнорирует классы, которые не были отмечены @Serializable
- Исправлены проблемы с регулярными выражениями в PuppeteerUtil
- RequestUtil добавляет SocksProxyAgent
2019-07-31 v2.2.2
- Исправлены ошибки @Bean @Autowired, поддержка автоматического определения типов @Autowired
- RequestUtil добавляет метод многострочного анализа заголовков строк, простой метод добавляет атрибут headerLines для удобства передачи многострочных заголовков, простой метод добавляет необязательный параметр обработчика для удобства прослушивания результатов запроса
- Агент прокси-сервера автоматически добавляет файлы cookie при использовании PuppeteerUtil.useProxy для запросов прокси
- Page.evaluate, evaluateOnNewDocument, evaluateHandle, $eval, $$eval поддерживают параметры async function
- Исправлен способ введения страницы
- Предоставлен класс инструментов UserAgents для случайного получения user-agent
- AddToQueue FromQueue name поддерживает регулярные выражения(пример)
- По умолчанию разрешение страницы установлено на 1920 * 1080, по умолчанию navigator.webdriver=false
- Добавлен метод PuppeteerUtil.drag для имитации перетаскивания ползунка
- Добавлен метод PuppeteerUtil.triggerAndWaitRequest для запуска и прослушивания запроса
- Добавлен метод PuppeteerUtil.triggerAndWaitResponse для запуска и ожидания ответа на запрос
- Предложены два метода взлома проверочных кодов ползунков Перевод текста:
PuppeteerUtil.dragBar
Необходимо перетащить ползунок для проверки соответствия мозаики.
PuppeteerUtil.dragJigsaw.
2019-06-22 v2.2.1
-
С помощью механизмов рефлексии, предоставляемых typescript и reflect-metadata, переписаны методы внедрения worker-экземпляров в обратные вызовы @OnStart, @OnTime, @FromQueue;
параметр workerFactory в обратных вызовах @OnStart, @OnTime и @FromQueue был удалён. Теперь фреймворк определяет необходимость передачи job-параметра и worker-экземпляра (если необходимо, то какого именно) по типу параметра обратного вызова. Порядок и количество параметров больше не фиксированы. Однако есть ограничения: в списке параметров может быть максимум один параметр типа Job и один с определённым типом Worker (на данный момент предоставляется только класс Page из пакета ppspider, а не интерфейс Page из @types/puppeteer).
В связи с этим изменением требуется обновить некоторые части кода: удалить атрибут workerFactory из параметров @OnStart, @OnTime и @FromQueue, а также удалить все параметры, кроме page: Page, если в обратном вызове используется import {Page} from "puppeteer", заменив его на import {Page} из "ppspider".
Порядок и имена параметров можно определять произвольно. Если обратный вызов не использует job: Job, этот параметр можно удалить.
-
Исправлена ошибка, из-за которой @AddToQueue переставал работать при совместном использовании с @OnStart / @OnTime / @FromQueue.
-
Добавлена опция развёртывания с использованием docker.
2019-06-13 v2.1.11
- Исправлен некорректный код реализации once listener в PuppeteerWorkerFactory.overrideMultiRequestListenersLogic.
- В параметре content метода FileUtil.write добавлен тип Buffer.
- При загрузке очереди в QueueManager.loadFromCache устанавливается значение lastExeTime.
- Изменены некоторые зависимости в пользовательском интерфейсе: bootstrap (3.4.1), g2 (@antv/g2, @antv/data-set).
- В пользовательском интерфейсе добавлено определение __awaiter в окне, что позволяет использовать async и await в DataUi.
- В пользовательском интерфейсе определено loadScript в окне для удобной загрузки сторонних js.
- Поддержка асинхронных обратных вызовов в JobOverride; изменение времени вызова обратных методов в JobOverride.
2019-06-06 v2.1.10
- Переписан процесс добавления, удаления и запроса request listener для страницы, чтобы гарантировать наличие только одного request listener (theOnlyRequestListener). Пользовательские request listener будут вызываться через theOnlyRequestListener. Больше не нужно беспокоиться о необходимости вызова request.continue() в пользовательских request listener.
- Переписан метод AddToQueue для возврата результата добавления в очередь, что обеспечивает поддержку асинхронной проверки Filter.
- Процесс проксирования в RequestUtil.simple был перенесён из PuppeteerUtil.useProxy.
- На пользовательском интерфейсе добавлены пояснения к состояниям fail и failed. Отображается количество попыток и общее количество неудачных задач после максимального количества попыток.
2019-06-03 v2.1.9
- Исправлено падение приложения из-за ошибки в PuppeteerUtil.useProxy после сбоя проксирования.
2019-06-02 v2.1.8
- Добавлен новый метод PuppeteerUtil.useProxy для настройки динамического проксирования страниц.
- Обновлена версия puppeteer до 1.17.0.
2019-05-28 v2.1.6
- Исправлена ошибка в модуле URL в MongodbDao.
- Исправлена ошибка в PuppeteerUtil.parseCookie при разборе даты.
2019-05-24 v2.1.3
- В пользовательском интерфейсе для панели Job время создания указано в виде текстового поля с точностью до миллисекунд.
- Ошибка при удалении job исправлена.
- Настройка параллелизма с помощью cron динамически изменена так, чтобы приложение устанавливало параллелизм сразу после запуска.
2019-05-21 v2.1.2
- Сериализация и десериализация были переписаны для решения проблемы с неудачной сериализацией больших объектов.
- Удалён DefaultJob, интерфейс Job заменён классом Job. Методы интерфейса стали полями класса. Это изменение привело к несовместимости исторических данных QueueCache.
- Переписана поддержка nedb для работы с большими объёмами данных.
- Переписан NedbDao, добавлена новая поддержка mongodb: MongodbDao. Оба поддерживают чтение и запись данных. Пользователи могут напрямую использовать @Launcher dbUrl для настройки базы данных и appInfo.db для управления базой данных.
2019-05-09 v2.0.5
- Позже -> cron.
- Изменена логика вычисления следующего выполнения OnTime Job.
2019-05-08 v2.0.4
- Обновление puppeteer до версии 1.15.0.
- Сериализация и десериализация переписаны для устранения проблем с сериализацией больших объектов.
Поскольку это изменение требует использования старого queueCache.json для сохранения состояния выполнения, рекомендуется выполнить следующие шаги:
- Добавить UpgradeQueueCacheTask в @Launcher tasks.
- Переименовать старый queueCache.json в queueCache_old.json и поместить его в каталог рабочей области.
- Запустить приложение, которое создаст queueCache.txt в каталоге рабочей области.
- Удалить UpgradeQueueCacheTask из @Launcher tasks.
2019-04-29 v2.0.3
- При переключении между вкладками пользовательского интерфейса предыдущие вкладки не уничтожаются.
- Исправлена ошибка: при передаче Regex в PuppeteerUtil.links ссылки не извлекались.
- Исправлена ошибка: в nedb при сжатии данных использовался метод конкатенации строк для построения нового содержимого данных, что приводило к переполнению памяти при работе с большими данными.
2019-04-29 v2.0.2
- Вывод цветных журналов с использованием ansi-colors.
2019-04-22 v2.0.1
- RequestUtil для упаковки request в стиле promise.
- Объявление NedbHelperUi.defaultSearchExp изменено, чтобы избежать ошибок компиляции ts.
2019-04-04 v2.0.0
- Несколько задач в одной очереди больше не используют один и тот же интервал ожидания.
- ОчередьManager может принудительно прервать выполнение задачи во время её выполнения (пользовательский интерфейс Job панели предоставляет кнопку взаимодействия).
Код:
appInfo.eventBus.emit(Events.QueueManager_InterruptJob, JOB_ID, "your interrupt reason");
- Возможность сохранения состояния выполнения во время работы.
- Добавлены декораторы @Bean @Autowired для обеспечения внедрения зависимостей.
- Добавлены декораторы @DataUi @DataUiRequest для предоставления пользовательских функций UI tab страниц, позволяющих пользователям настраивать данные и инструменты визуализации.
2019-01-28 v0.1.22
- Автоматическое удаление помеченных как filtered записей о заданиях.
- На панели заданий пользовательского интерфейса можно искать задачи, а затем нажимать кнопки после состояния успеха или неудачи, чтобы повторно добавить задание в очередь.
2018-12-24 v0.1.21
- Задание имеет настраиваемый тайм-аут, по умолчанию 300000 мс.
- Запись журнала во время выполнения задачи для анализа времени выполнения и причин неудач.
2018-12-10 v0.1.20
- Исправлена ошибка повторного создания экземпляров пользовательских задач.
2018-11-19 v0.1.19
-
Исправлена проблема с журналом, который всегда показывал {} для Error. UI界面搜索添加条件时, если это выбор типа, то используется checkbox, который можно отметить галочкой для нескольких вариантов.
-
Обновить версию puppeteer.
2018-09-19 v0.1.18
- В коде изменить адрес ссылки на экспорт класса в index.ts на исходный путь, чтобы пользователь мог легче определить местоположение исходного кода в редакторе.
- При возникновении ошибки задачи выводить конкретную информацию о задаче.
- Считать только количество повторных попыток после неудачной попытки при подсчёте количества неудачных задач.
- Изменить параметры списка параметров нескольких методов logger на список параметров с неопределённым числом элементов, больше не принимать параметр format (можно установить только один формат), использовать список сообщений в качестве разделителя строк;
при печати журнала с помощью logger, автоматически преобразовывать obj в строку с использованием JSON.stringify(obj, null, 4), если тип параметра — object.
- Добавить необязательный атрибут exeIntervalJitter для параметров конфигурации трёх типов задач: OnStart, OnTime, FromQueue. Тип — число, единица измерения — миллисекунды. Позволяет случайным образом изменять интервал выполнения задачи в диапазоне от (exeInterval - exeIntervalJitter, exeInterval + exeIntervalJitter). По умолчанию exeIntervalJitter = exeInterval * 0,25.
- Добавить атрибут running в конфигурацию для управления приостановкой работы очереди для трёх типов задач. Значение по умолчанию — true. Можно изменить состояние работы нескольких очередей с помощью mainMessager.emit(MainMessagerEvent.QueueManager_QueueToggle_queueName_running, queueNameRegex: string, running: boolean).
- Переписать код, связанный с JobManager и nedb, используя NedbDao.
- Добавить декоратор @RequestMapping для объявления интерфейсов HTTP rest и предоставления возможности удалённого динамического добавления задач. Возврат результатов захвата требует самостоятельной реализации (например, асинхронный обратный вызов URL).
2018-08-24 v0.1.17
- Добавить функцию рекурсивного запроса родительских задач во всплывающем окне с подробной информацией о задачах UI. Все соединения изменены на target="_blank".
- Изменён способ отправки информации в реальном времени в системе с периодической отправки на управляемую событиями отложенную отправку кэша.
- Обновите версию puppeteer до 1.7.0.
- Добавить NoneWorkerFactory, который не требует явной ручной инициализации, для обработки задач, которые не требуют использования puppeteer.
- Отформатировать время в журнале SSS с добавлением нулей.
- Можно создать задачу с пустым URL.
2018-07-31 v0.1.16
- Исправлена ошибка невозможности установки maxParallelConfig=0.
- Обновили версию puppeteer до 1.6.1-next.1533003082302, временно исправили ошибку потери ответа в puppeteer 1.6.1.
2018-07-30 v0.1.15
- Исправили ошибку в методе PuppeteerUtil.addJquery. Изменили способ внедрения jQuery, поскольку некоторые веб-сайты не позволяют внедрить его через page.addScriptTag из соображений безопасности.
- Исправили ошибку в PuppeteerWorkerFactory.exPage, связанную с вычислением местоположения выполнения ошибки js.
- Исправили ошибку CronUtil.next: после выполнения последней задачи OnTime (обозначенной как A) и немедленного добавления новой задачи OnTime, время выполнения первого задания может совпадать со временем выполнения A.
2018-07-27 v0.1.14
- Добавлена оценка уровня журнала в журнал. Добавлен метод изменения конфигурации. Добавлены комментарии к журналу в @Launcher.
- Метод datas в DefaultJob теперь имеет необязательные параметры.
- В PuppeteerWorkerFactory добавлены методы get для создания экземпляров Page, таких как $eval, $$eval, evaluate, evaluateOnNewDocument, evaluateHandle. Методы были улучшены с помощью аспектов, и когда внедряемый js вызывает исключение, они могут распечатать конкретное местоположение.
- Изменена реализация сериализации.
- Добавлены китайские комментарии в исходный код (английские будут добавлены позже).
- Обновлена версия Puppeteer.
2018-07-24 v0.1.13
- Добавлен класс инструментов logger, внедрён source-map-support для правильного вывода местоположения исходного файла ts при выводе ошибок и журналов.
2018-07-23 v0.1.12
- Реализован декоратор полей @Transient, используемый для игнорирования поля при сериализации.
Опубликовать ( 0 )