Хотя под облаком есть расширение для Google Chrome, которая позволяет нам сохранить выбор текста с веб-страницы, что не хватает, является вариант для автоматизации сохранения всей страницы. Очевидно, хотя это, сохранение веб-страницы не является тривиальной задачей, и это то, что я был 7 частям, готовясь, 2 частей, избегая, а 1 часть страшного в возрасте!
Тем не менее, здесь мы – наконец-то – и под облаком теперь поддерживает сохранение веб-страниц через Newsaper3k , универсальный пакет, написанный в Python. Я растягиваю определение сейчас Поскольку я все еще бегающих тесты в промежуточной среде, но это почти завершено и должно быть на производстве в течение недели.
Документация для газеты является разреженным, а образцы кода были (есть) несколько и далеко между. Хуже, я понятия не имел, как я бы сделал Python Talk с узлом – API является очевидным выбором здесь, но у меня не было понимания Python, типы данных, которые он поддерживал, или о том, как я получил это данные из него.
Я пишу это с точки зрения кого-то на другой стороне кривой обучения, проехав по длинному маршруту, чтобы добраться сюда, но – учитывая временные ограничения, против – предпочтительнее путь менее загроможден с препятствиями. Таким образом, эта статья из представления мне за внимание прошлого мной.
Альтернативы в газеты3k.
Там есть мощные услуги, такие как Diffbot , но это затрат на этот этап в жизни под облаком, и – быть честным, и, несмотря на то, что я сказал несколько абзацев назад – я бы предпочел понять эти вещи, прежде чем делегировать их Поэтому я, по крайней мере, у меня хорошее техническое понимание того, что происходит. Тем не менее, есть несколько альтернатив с открытым исходным кодом, такие как Beautifulsoup Отказ
NewsPaper3k против BeautifulSoup
Я представляю, что некоторые задаются вопросом, почему я выбрал NewsPater3K вместо BeautifulSoup:
- Газета, кажется, сосредоточена на сосредоточении страницы общего назначения;
- Хотя 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”