Эта регулярная программа горячего поиска Weibo, реализованная nodejs, пожалуйста, проверьте ее!

Node.js
Эта регулярная программа горячего поиска Weibo, реализованная nodejs, пожалуйста, проверьте ее!

The summer is coming

"

Я знаю, что те лета, как молодость, не могут вернуться. - Сон Дон Йе

Молодость не возвращается, но пора готовиться к третьему лету в Сиане.

ерунда

Я обнаружил, что вызываю кодирование из敲代码изменить на写代码.

эммм.... набираю код, чувствуя, что привык к использованиюconstЯ видел, как другие используют определение константvarОпределенные константы.

Да, элегантно!

写代码Эти три слова кажутся более изящными, больше похожими на создание и полировку тонкой работы.

быть адаптированы из掘金站长Предложение:

"

Ребенок не обезьяна, и радость кодирования тоже безопасна.

Польза от прочтения этой статьи

  • ctrl + c
  • ctrl + v
  • Искатель Nodejs начального уровня

Зачем писать статьи о поисковых роботах

недавно посетилАйте.нетКогда я обнаружил, что запрос был немного медленным.

Позже, после некоторой проверки, было обнаружено, что горячие точки поиска на главной странице должны каждый раз сканировать данные горячего поиска Baidu и возвращать их на внешний интерфейс в качестве интерфейса.Поскольку это рендеринг на стороне сервера, интерфейс заблокирован. и доступ медленный.

Просто думаю о рефакторинге этого интерфейса.

решение

  • Настройка задач на время, каждый1分钟/3分钟/5分钟Сканирование горячего поиска Sina Weibo в режиме реального времени (коэффициент кликов по горячему поиску Sina Weibo выше)
  • После обхода данных не возвращайте их напрямую во внешний интерфейс, сначала напишите.jsonФормат файла.
  • Запрос фонового интерфейса, отображаемый сервером, и возврат во внешний интерфейсjsonсодержимое файла

После того, как потребности ясны, можно начинать.

Создать проект

инициализация

Во-первых, вам нужно найти целевой сайт следующим образом: (горячий поиск Weibo в режиме реального времени)

Да. Weibo.com/top/summary…

Создать папку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Элементы анализируются в одной волне.202051225827правильноjQueryБолее знакомый младший брат, см. Картинку ниже, настолько прост и понятенDOMструктуру, есть ли N способов извлечь ее каждыйtrданные в иpushКArrayметод в нем?202051224321правильно! Наша конечная цель - пройтиjQueryсинтаксис, перебирая каждыйtr, и присвоить каждому его热搜地址,热搜内容,热度值,序号,表情Дополнительная информацияpushв пустой массив
пройти через этоnodejsизfsмодуль, напишитеjsonв файле.202051224844

jQuery проходит для извлечения данных

использоватьjQueryизeachметод, даtbodyкаждый изtrTraverse, первый параметр в параметре обратного вызова является индексом обхода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 так много горячих запросов, но мы не можем откладывать ни на секунду. Сначала мы ожидали, как часто定时执行爬取работать. Дыня не может остановиться!

202052144841Далее делаем код小部分改造.

Инкапсуляция запроса данных

из-за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......

Код github с открытым исходным кодом (нажмите старт):

GitHub.com/Где я/Twitter-…

Смотрите все здесь, это здорово!点个赞Поехали.2020521522
Навигационная станция программиста:iiter.cn

Вот наш общедоступный номер前端糖果屋 202052154453