Node.js を使用する場合
私はあなたを愛しています. Этот бот имеет такую фичу: поздравляет с каким-нибудь праздником на этот день.私たちは、あなたが私たちのことを知っていることを知っています.今日は、あなたが私たちの人生を楽しんでいるということです.あなたは私たちのことをよく知っています.
Итак алгоритм этой работы будет таким:
1 日 1 日 31 日 (29 日 29 日)
Сформировать список ссылок для первых COUNT_REQUEST 日 日付 COUNT_REQUEST 日付 Запомнить праздники Подождать DELAY_REQUEST секунд (ведь у меня цель не задосить сайт, а парсить)
Счётчик цикла увеличить на COUNT_REQUEST
JSON.
JS を使用してください.
node-fetch と node-html-parser .
次のバージョンは、nodejs AbortController の 16 番目のバージョンです.また、setTimeout を使用することをお勧めします.
Результат собирается в массив
Использую @stanislavkarol/delay
Всё вместе, в рабочем виде, на гитхаб .
Итак алгоритм этой работы будет таким:
JS を使用してください.
パーセンテージと詳細:
const COUNT_REQUEST = 2;
const DELAY_REQUEST = 20000;
/**
* Прибавить в дате countDays дней
* @param {Date} date
* @param {number} countDays
* @returns {Date}
*/
export function addDay(date, countDays = 1) {
const newDate = new Date(date);
return new Date(newDate.setDate(newDate.getDate() + countDays));
}
const startDate = new Date("2020-01-01");
const endDate = new Date("2020-12-31");
let loop = new Date(startDate);
while (loop <= endDate) {
loop = addDay(loop, COUNT_REQUEST);
await delay(DELAY_REQUEST);
}
2. Сформировать список ссылок для первых COUNT_REQUEST 日
/**
* @typedef {Object} UrlData
* @property {Date} date - Запрашиваемый день
* @property {string} url - Ссылка
*/
/**
* Получить массив ссылок для countDays дней
* @param {Date} startDate С какой даты начинать делать ссылки
* @param {number} countDays Сколько ссылок спрашивать
* @param {Date} endDate За какую дату не заходить
* @returns {UrlData}
*/
export function getUrls(startDate, countDays, endDate) {
//--- Текст функции
return urls;
}
3. 日付を指定して COUNT_REQUEST 日付を指定する
node-fetch と node-html-parser .
次のバージョンは、nodejs AbortController の 16 番目のバージョンです.また、setTimeout を使用することをお勧めします.
import fetch from "node-fetch";
import { parse } from "node-html-parser";
/**
* Запрос списка праздников
* @param {string} url
* @param {Date} date
* @returns {String[]}
*/
export async function getHolydays(url, date) {
// Для отмены фетча
const cancelFetch = new AbortController();
// Промис запроса к сайту
const promise = fetch(url, {
timeout: REQUEST_TIMEOUT,
signal: cancelFetch.signal,
});
// Время ожидания
const timeout = setTimeout(() => {
cancelFetch.abort();
}, WAIT_REQUEST_TIMEOUT);
try {
const response = await promise;
// Получить текст HTML
const htmlContent = await response.text();
// Получить структуру DOM
const root = parse(htmlContent);
// Массив праздников: DOM-элементы
const source = root.querySelectorAll(".holydays >span");
// Массив праздников: текст
const holidays = source.map((element) => element.textContent);
return { holidays, day: date.getDate(), month: 1 + date.getMonth() };
} catch (e) {
console.log("FetchError :>> ", date);
return null;
} finally {
clearTimeout(timeout);
}
}
// Получить список праздников из массива ссылок
const promisesOfHolidays = await Promise.all(
urlsData.map(async (ud) => await getHolydays(ud.url, ud.date))
);
4. Запомнить праздники
Результат собирается в массив
let holidayData = [];
///
const promisesOfHolidays = await Promise.all(
urlsData.map(async (ud) => await getHolydays(ud.url, ud.date))
);
holidayData = [
...holidayData,
...promisesOfHolidays.filter((r) => r !== null),
];
5. DELAY_REQUEST を確認する
Использую @stanislavkarol/delay
7. JSON を使用することをお勧めします。
import fs from "fs";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
if (!fs.existsSync(`${__dirname}/../json`)) {
fs.mkdirSync(`${__dirname}/../json`);
}
fs.writeFile(
`${__dirname}/../json/holidays.json`,
JSON.stringify(holidayData),
(err) => {
if (err) throw err;
console.log("Data written to file");
}
);
Всё вместе, в рабочем виде, на гитхаб .
Reference
この問題について(Node.js を使用する場合), 我々は、より多くの情報をここで見つけました https://dev.to/slkarol/napisal-parsier-saita-27chテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol