Рубрики
Без рубрики

Сохранение веб-страниц с Vue и узел через Newbaper3k

В то время как под облаком есть расширение для Google Chrome, который позволяет нам сохранить выбор текста F F … Помечено с Python, Node, Vue, учебником.

Хотя под облаком есть расширение для Google Chrome, которая позволяет нам сохранить выбор текста с веб-страницы, что не хватает, является вариант для автоматизации сохранения всей страницы. Очевидно, хотя это, сохранение веб-страницы не является тривиальной задачей, и это то, что я был 7 частям, готовясь, 2 частей, избегая, а 1 часть страшного в возрасте!

Тем не менее, здесь мы – наконец-то – и под облаком теперь поддерживает сохранение веб-страниц через Newsaper3k , универсальный пакет, написанный в Python. Я растягиваю определение сейчас Поскольку я все еще бегающих тесты в промежуточной среде, но это почти завершено и должно быть на производстве в течение недели.

Документация для газеты является разреженным, а образцы кода были (есть) несколько и далеко между. Хуже, я понятия не имел, как я бы сделал Python Talk с узлом – API является очевидным выбором здесь, но у меня не было понимания Python, типы данных, которые он поддерживал, или о том, как я получил это данные из него.

Я пишу это с точки зрения кого-то на другой стороне кривой обучения, проехав по длинному маршруту, чтобы добраться сюда, но – учитывая временные ограничения, против – предпочтительнее путь менее загроможден с препятствиями. Таким образом, эта статья из представления мне за внимание прошлого мной.

Альтернативы в газеты3k.

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

NewsPaper3k против BeautifulSoup

Я представляю, что некоторые задаются вопросом, почему я выбрал NewsPater3K вместо BeautifulSoup:

  1. Газета, кажется, сосредоточена на сосредоточении страницы общего назначения;
  2. Хотя Beautifulsoup – со своим богатством вариантов для разбора DOM – горется больше к науке о данных.

Вам нужно знать конкретные части веб-страницы, чтобы получить максимум из красивой группы. Я мог ошибаться, поэтому я с нетерпением жду кого-то наступления с большей информацией!

Scraping веб-страницы с NewsPaper3k

Я собираюсь сделать несколько предположений:

  • У вас есть понимание как Vue и Node;
  • И не нужно, чтобы я прошел весь процесс установки и настройки;
  • или создать новый проект;
  • У вас установлен Python, наряду с пакетом NewsPaper3K;
  • Я буду предоставлять краткие примеры кода, а не полные версии.

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

Питон

Хотя в JavaScript (или Ecmascript, как сейчас известно), первое, что мне нужно было сделать, было выучить немного Python создать скрипт, который будет действовать как мост между бэкэндом, написанным в узле и газетах, написанных в Python:

import os
import sys
import json
from datetime import datetime

from newspaper import Article

# Here, the `url` value should be something like: https://www.bbc.co.uk/sport/football/53944598
url = sys.argv[1]

template_for_exceptions = "An exception of type {0} occurred. Arguments:\n{1!r}"

def get_web_page(url):

  try:

    if url and len(url) > 0:

      article = Article(url, keep_article_html = True)
      article.download()
      article.parse()

      dataForBookmarkAsJSON = json.dumps({
        'publicationDate': article.publish_date if article.publish_date is None else article.publish_date.strftime("%Y-%m-%d %H:%M:%S"),
        'title': article.title,
        'note': article.article_html,
        'authors': article.authors
      })

      try:

        sys.stdout.write(dataForBookmarkAsJSON)
        sys.stdout.flush()
        os._exit(0)

      except Exception as ex:

        message_for_exception = template_for_exceptions.format(type(ex).__name__, ex.args)
        print(message_for_exception)
        sys.exit(1)

  except Exception as ex:

    message_for_exception = template_for_exceptions.format(type(ex).__name__, ex.args)
    print(message_for_exception)
    sys.exit(1)

if __name__ == '__main__':
  get_web_page(url)

Несколько вещей, чтобы указать здесь, например article.publish_date Переменная, которая является либо строкой даты, которую я отформатирую, или является нулевым, что я обрабатываю при заполнении объекта JSON. Да, я мог бы сделать этот доход в узле, но я нашел момент, чтобы узнать несколько вещей о и в Питоне.

Вариант

На интерфейсе я использую компонент со следующим способом:

getWebPage () {
  this.$axios.get(`/newspaper`, {
    params: {
      // Params.
    }
  }).then(function(response) {
    // Handle the response.
    }
  }).catch(function(error) {
    // Handle the error.
  })
}

Узел

На бэкэнде у меня есть маршрут:

router.get('/newspaper', async (req, res) => {
  const getNewspaper = await controllerNewspaper.getWebPage(data)
  res.json(getNewspaper)
})

… а в контроллере у меня есть:

services.getWebPage = async (params) => {

  let { spawn } = require('child_process')
  let processForPython = spawn(process.env.PYTHON_VERSION, [
    `${process.env.PYTHON_PATH}/get_web_page.py`, 
    params.url
  ], {
    maxBuffer: 10240000
  })

  let dataForBookmarkStream = []

  return new Promise ((resolve, reject) => {
    processForPython.stdout.on('data', (response) => {
      dataForBookmarkStream.push(response)
    })

    processForPython.stderr.on('data', (error) => {
      reject({
        error: `An error occurred while attempting to parse the web page: ${error.toString()}`
      })
    })

    processForPython.on('exit', (code) => {
      switch (code) {
        case 0:
          if ( dataForBookmarkStream ) {
            if ( dataForBookmarkStream.length > 0 ) {
              try {
                try {
                  dataForBookmark = JSON.parse(dataForBookmarkStream.join().toString())
                } catch (exception) {
                  reject({
                    error: "JSON object supplied by Newspaper is invalid."
                  })
                }
                if (typeof dataForBookmark === 'object') {
                  const paramsForBookmark = new URLSearchParams()
                  paramsForBookmark.append('userID', params.userID)
                  // Additional parameters, using dataForBookmark...
                  instanceOfAxios.post('/assets', paramsForBookmark)
                  .then(function (response) {
                    resolve(response)
                  })
                  .catch(function (error) {
                    reject(error)
                  })
                }
              } catch (exception) {
                reject({
                  error: "An error occurred while attempting to save the web page."
                })
              }
            } else {
              reject()
            }
          } else {
            reject()
          }
          break
        case 1:
          reject({
            error: "Web page couldn't be saved."
          })
          break
      }
    })

  }).catch(error => {
    return {
      error: "Web page couldn't be saved."
    }
  })

}

Да, это много, чтобы принять, так что давайте посмотрим на некоторые особенности …

Во-первых, выяснить, какая версия Python имеет и создать эквивалентную переменную окружающей среды к Process.env. Python_version Отказ

Во-вторых, выясните, какой путь к Python является и создает эквивалентную переменную окружающую среду для Process.env. Python_path Отказ

Тогда не стесняйтесь настроить Maxbuffer подходить. Кроме того, я пытался версию кода, используя Maxbuffer Один, но некоторые веб-страницы были слишком большими, в какой момент объект JSON не удалось разобрать, а затем все пошло на дерьмо.

Как только сценарий Python вызывается, он начинает трансмировать объект JSON к ProcessForython.Stdout.on («Данные») , что я хватаю кусочками через dataforbookmarkstream Переменная.

Предполагая, что процесс был успешным, мы попали в блок коммутатора в ProcessForython.on («выход») и выход, когда код равен 0. Вот где мы преобразуем закодированные данные в dataforbookmarkstream во что-то полезное, используя:

dataforbookmark.carnse (dataforbookmarkstream.join (). ToString ())

… перед отправкой данных через API куда-то еще в приложении.

У нас есть узел, и люди Python встряхивают свои коллективные головы, носящие выражение аварийного подсказки с оттенком разочарования? Если это так, поделитесь и давайте узнаем, что может быть улучшено!

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

Оригинал: “https://dev.to/octaneinteractive/saving-web-pages-with-vue-and-node-via-newspaper3k-5ahn”