The summer is coming
"Я знаю, что те лета, как молодость, не могут вернуться. - Сон Дон Йе
Молодость не возвращается, но пора готовиться к третьему лету в Сиане.
ерунда
Я обнаружил, что вызываю кодирование из敲代码
изменить на写代码
.
эммм.... набираю код, чувствуя, что привык к использованиюconst
Я видел, как другие используют определение константvar
Определенные константы.
Да, элегантно!
写代码
Эти три слова кажутся более изящными, больше похожими на создание и полировку тонкой работы.
быть адаптированы из掘金站长
Предложение:
"Ребенок не обезьяна, и радость кодирования тоже безопасна.
Польза от прочтения этой статьи
- ctrl + c
- ctrl + v
- Искатель Nodejs начального уровня
Зачем писать статьи о поисковых роботах
недавно посетилАйте.нетКогда я обнаружил, что запрос был немного медленным.
Позже, после некоторой проверки, было обнаружено, что горячие точки поиска на главной странице должны каждый раз сканировать данные горячего поиска Baidu и возвращать их на внешний интерфейс в качестве интерфейса.Поскольку это рендеринг на стороне сервера, интерфейс заблокирован. и доступ медленный.
Просто думаю о рефакторинге этого интерфейса.
решение
- Настройка задач на время, каждый
1分钟/3分钟/5分钟
Сканирование горячего поиска Sina Weibo в режиме реального времени (коэффициент кликов по горячему поиску Sina Weibo выше) - После обхода данных не возвращайте их напрямую во внешний интерфейс, сначала напишите
.json
Формат файла. - Запрос фонового интерфейса, отображаемый сервером, и возврат во внешний интерфейс
json
содержимое файла
После того, как потребности ясны, можно начинать.
Создать проект
инициализация
Во-первых, вам нужно найти целевой сайт следующим образом: (горячий поиск Weibo в режиме реального времени)
Создать папкуweibo
Перейдите в корневой каталог папки
использоватьnpm init -y
Быстро инициализировать проект
Установить зависимости
Создайтеapp.js
документ
Установите следующие зависимости
npm i cheerio superagent -D
оsuperagent
а такжеcheerio
введение
"superagent — это легкая и прогрессивная библиотека запросов, которая внутренне опирается на собственный API запросов nodejs и подходит для среды nodejs.
"cheerio — это модуль сканирования страниц для nodejs.Это быстрая, гибкая и реализованная реализация ядра jQuery, специально настроенная для сервера. Подходит для всех видов поисковых роботов. jQuery для node.js.
написание кода
Открытьapp.js
, начать выполнять основную функцию
Первый импорт вверхуcheerio
,superagent
и в нодджсfs
модуль
const cheerio = require("cheerio");
const superagent = require("superagent");
const fs = require("fs");
Объявить горячие поиски по переменнымurl
, Для последующего复用
const weiboURL = "https://s.weibo.com";
const hotSearchURL = weiboURL + "/top/summary?cate=realtimehot";
superagent
использоватьsuperagent
Отправитьget
проситьsuperagent
изget
Метод принимает два параметра. Первый запрашиваетсяurl
Адрес, второй - функция обратного вызова после успешного запроса.
Функция обратного вызова имеет два параметра, первый параметрerror
, если запрос выполнен успешно, вернутьnull
, иначе выдается ошибка. Второй параметр после успешного выполнения запроса响应体
superagent.get(hotSearchURL, (err, res) => {
if (err) console.error(err);
});
Анализ элементов веб-страницы
Откройте целевой сайт на веб-страницеDOM
Элементы анализируются в одной волне.правильноjQuery
Более знакомый младший брат, см. Картинку ниже, настолько прост и понятенDOM
структуру, есть ли N способов извлечь ее каждыйtr
данные в иpush
КArray
метод в нем?правильно! Наша конечная цель - пройтиjQuery
синтаксис, перебирая каждыйtr
, и присвоить каждому его热搜地址
,热搜内容
,热度值
,序号
,表情
Дополнительная информацияpush
в пустой массив
пройти через этоnodejs
изfs
модуль, напишитеjson
в файле.
jQuery проходит для извлечения данных
использоватьjQuery
изeach
метод, даtbody
каждый изtr
Traverse, первый параметр в параметре обратного вызова является индексом обходаindex
, второй параметр — это элемент, пройденный в данный момент, обычно$(this)
Указывает на пройденный в данный момент элемент.
let hotList = [];
$("#pl_top_realtimehot table tbody tr").each(function (index) {
if (index !== 0) {
const $td = $(this).children().eq(1);
const link = weiboURL + $td.find("a").attr("href");
const text = $td.find("a").text();
const hotValue = $td.find("span").text();
const icon = $td.find("img").attr("src")
? "https:" + $td.find("img").attr("src")
: "";
hotList.push({
index,
link,
text,
hotValue,
icon,
});
}
});
Cheerio оборачивает тело ответа после запроса
существуетnodejs
, если вы хотите написать счастливо, как указано вышеjQuery
синтаксис и тело ответа, возвращаемое после успешного выполнения запроса, используйтеcheerio
изload
способ завернуть.
const $ = cheerio.load(res.text);
написать JSON-файл
затем используйтеnodejs
изfs
модуль, который преобразует созданный массив вjson字符串
, и, наконец, записать в текущий каталог файловhotSearch.json
файл (он будет создан автоматически без этого файла).
fs.writeFileSync(
`${__dirname}/hotSearch.json`,
JSON.stringify(hotList),
"utf-8"
);
Полный код выглядит следующим образом:
const cheerio = require("cheerio");
const superagent = require("superagent");
const fs = require("fs");
const weiboURL = "https://s.weibo.com";
const hotSearchURL = weiboURL + "/top/summary?cate=realtimehot";
superagent.get(hotSearchURL, (err, res) => {
if (err) console.error(err);
const $ = cheerio.load(res.text);
let hotList = [];
$("#pl_top_realtimehot table tbody tr").each(function (index) {
if (index !== 0) {
const $td = $(this).children().eq(1);
const link = weiboURL + $td.find("a").attr("href");
const text = $td.find("a").text();
const hotValue = $td.find("span").text();
const icon = $td.find("img").attr("src")
? "https:" + $td.find("img").attr("src")
: "";
hotList.push({
index,
link,
text,
hotValue,
icon,
});
}
});
fs.writeFileSync(
`${__dirname}/hotSearch.json`,
JSON.stringify(hotList),
"utf-8"
);
});
Откройте терминал и введитеnode app
, вы можете видеть, что есть большеhotSearch.json
документ.
Регулярное сканирование
Хотя код можно запускать, данные также можно сканировать и сохранять в файле json.
Однако его необходимо запускать вручную каждый раз, чтобы сканировать данные горячего поиска за текущий период времени.不人性化!
В последнее время на Weibo так много горячих запросов, но мы не можем откладывать ни на секунду. Сначала мы ожидали, как часто定时执行爬取
работать. Дыня не может остановиться!
Далее делаем код小部分改造
.
Инкапсуляция запроса данных
из-заsuperagent
Запрос является асинхронным методом, мы можем использовать весь метод запроса сPromise
упаковано, то每隔指定时间
Просто вызовите этот метод.
function getHotSearchList() {
return new Promise((resolve, reject) => {
superagent.get(hotSearchURL, (err, res) => {
if (err) reject("request error");
const $ = cheerio.load(res.text);
let hotList = [];
$("#pl_top_realtimehot table tbody tr").each(function (index) {
if (index !== 0) {
const $td = $(this).children().eq(1);
const link = weiboURL + $td.find("a").attr("href");
const text = $td.find("a").text();
const hotValue = $td.find("span").text();
const icon = $td.find("img").attr("src")
? "https:" + $td.find("img").attr("src")
: "";
hotList.push({
index,
link,
text,
hotValue,
icon,
});
}
});
hotList.length ? resolve(hotList) : reject("errer");
});
});
}
Подробное объяснение расписания узлов
Для временных задач мы можем использоватьnode-schedule
этоnodejs库
Что нужно сделать.
GitHub.com/node-racing читать…
Установить первым
npm i node-schedule -D
введение главы
const nodeSchedule = require("node-schedule");
Использование (выполняется на 30-й секунде каждой минуты):
const rule = "30 * * * * *";
schedule.scheduleJob(rule, () => {
console.log(new Date());
});
Параметры правила:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
6 заполнителей обозначают слева направо: секунды, минуты, часы, день, месяц, день недели.*
Указывает подстановочный знак, соответствующий чему-либо. когда*
Когда это секунды, это означает, что он будет запущен в любую секунду и так далее.
увидеть один每小时的第20分钟20秒
Правила, которые необходимо выполнять регулярно:
20 20 * * * *
Больше правил, чтобы соответствовать самостоятельно.
Регулярное сканирование и запись в файлы
Используйте временные задачи для выполнения указанных выше операций запроса данных и записи файлов:
nodeSchedule.scheduleJob("30 * * * * *", async function () {
try {
const hotList = await getHotSearchList();
await fs.writeFileSync(
`${__dirname}/hotSearch.json`,
JSON.stringify(hotList),
"utf-8"
);
} catch (error) {
console.error(error);
}
});
О да, не забудь捕获异常
Вставьте полный код ниже (вы можете напрямую нажать ctrl c/v):
const cheerio = require("cheerio");
const superagent = require("superagent");
const fs = require("fs");
const nodeSchedule = require("node-schedule");
const weiboURL = "https://s.weibo.com";
const hotSearchURL = weiboURL + "/top/summary?cate=realtimehot";
function getHotSearchList() {
return new Promise((resolve, reject) => {
superagent.get(hotSearchURL, (err, res) => {
if (err) reject("request error");
const $ = cheerio.load(res.text);
let hotList = [];
$("#pl_top_realtimehot table tbody tr").each(function (index) {
if (index !== 0) {
const $td = $(this).children().eq(1);
const link = weiboURL + $td.find("a").attr("href");
const text = $td.find("a").text();
const hotValue = $td.find("span").text();
const icon = $td.find("img").attr("src")
? "https:" + $td.find("img").attr("src")
: "";
hotList.push({
index,
link,
text,
hotValue,
icon,
});
}
});
hotList.length ? resolve(hotList) : reject("errer");
});
});
}
nodeSchedule.scheduleJob("30 * * * * *", async function () {
try {
const hotList = await getHotSearchList();
await fs.writeFileSync(
`${__dirname}/hotSearch.json`,
JSON.stringify(hotList),
"utf-8"
);
} catch (error) {
console.error(error);
}
});
Различные способы игры
-
Этот код может быть напрямую интегрирован в существующие
express
koa
eggjs
Или в нативном проекте nodejs он возвращается во внешний интерфейс как интерфейс. -
Интегрируйте в Serverless и верните его во внешний интерфейс в качестве интерфейса.
-
Стыковка с публичной учетной записью WeChat, отправить
热搜
Ключевые слова могут получать горячие данные поиска в режиме реального времени. -
интегрирован вWeChat робот, отправлять данные горячего поиска Weibo себе/группам в назначенное время каждый день.
-
other......
Смотрите все здесь, это здорово!点个赞
Поехали.
Навигационная станция программиста:iiter.cn
Вот наш общедоступный номер前端糖果屋