Получить HTML страницу с javascript элементами в bash скрипте - PullRequest
4 голосов
/ 06 января 2020

Я пытаюсь получить сайт с некоторой статистикой трафика c в сценарии bash. Фактические значения на этой странице html записываются с javascript. Таким образом, при просмотре веб-страницы с помощью браузера, я вижу фактические значения. Но при просмотре кода html, например, с помощью curl, позиция значения выглядит следующим образом:

<div>
    <div class="agile_float">
        <script type="text/javascript">
            dw(IDS_statistics_aglie_month_volume_used);
            dw(common_colon);
        </script>
    </div>
    <div id="month_used_value" class="agile_td_ltr"></div>
</div>

Интересующее значение будет стоять в пустом теперь div с идентификатором "month_used_value". Я уже нашел некоторые подсказки, чтобы использовать Phantom JS, но я не уверен, действительно ли это путь к go ?! Есть ли простой способ собрать значения тезисов из скрипта bash?

Ответы [ 3 ]

0 голосов
/ 07 января 2020

То, что вы делаете, называется Web Scraping - на Inte rnet есть много информации и инструментов, как это сделать. Позвольте мне поделиться своим путем:

1. Первое, что вам нужно сделать, как указал Ху go, это прочитать DOM с веб-сайта.

Для этого вам определенно нужен безголовый браузер. Хорошо, что многие браузеры поддерживают также режим без головы. Например, если у вас установлен Google Chrome, вы можете запустить его из командной строки и в режиме без заголовка, чтобы получить весь (динамический c) контент отображаемой страницы. например, на Ма c:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --headless --dump-dom --disable-gpu "https://www.google.com"

2. Как только вы получите обработанный html контент, вам необходимо надежно его обработать.

Синтаксический анализ HTML (как и любой вложенный формат данных) с помощью линейно-ориентированных инструментов, таких как sed / awk / et c подвержен ошибкам, поэтому вам нужно найти утилиту, способную анализировать (извлекать) данные из HTML, которая * html -ware.

Я использую jtm (разработано мной). Это без потерь конвертер из HTML/XML в JSON (и обратно). Причина преобразования HTML в JSON проста - JSON - (наиболее) широко используемая модель данных, и в наши дни доступно множество JSON синтаксических анализаторов.

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

Например, следующее извлекает передний список вопросов из stackoverflow:

bash $ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --headless --dump-dom --disable-gpu "https://stackoverflow.com/questions" 2>/dev/null | jtm | jtc -w'[class]:<question-hyperlink>:[-3]><P:'
"Component LoginContainerComponent is not part of any NgModule or the module has not been imported into your module"
"Removing an object with attributes from a list?"
"Is there a Predicate for operator instanceof?"
"How to use multiple document processor in vespa.ai in separate search chain?"
"How do I load an external JS library in Svelte/Sapper?"
"Why do gcc and clang place custom-sectioned const-funcptr symbols into writable sections when compiling with -fpic?"
"How does one solve “ 'CMySQLCursor' object has no attribute 'keys'”?"
"css video iframe good practice wordpress"
"auto complete address and navigate to that place"
"How do I trace an exact or find a specific value in a matplotlib graph?"
"Swift 5 How to get JSON multilayer data to append?"
"Excel wrong data format"
"Converting React function component to class component in React-JS"
"Can't Move PTZ Camera using ONVIF Protocol -Python Client"
"Can a TypeScript HttpClient accept a string that is not explicitly formatted as JSON?"
bash $ 

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

0 голосов
/ 11 января 2020

Спасибо за ваш ответ. К сожалению, у меня ничего не получалось ... Я на Raspberry без gui и пробовал с хромом и firefox. Кажется, что firefox даже не имеет функции DOM-dump. И хром продолжает падать или, по крайней мере, не делает что-то, что может помочь, например:

$ chromium-browser --headless --dump-dom --disable-gpu --print-to-pdf "http://192.168.8.1/html/statistic.html"
[0110/214637.782914:ERROR:browser_main_loop.cc(596)] Failed to put Xlib into threaded mode.
[0110/214640.321288:FATAL:gpu_data_manager_impl_private.cc(897)] The display compositor is frequently crashing. Goodbye.
Trace/Breakpoint ausgelöst

или

$ DISPLAY=:0 chromium-browser --headless --dump-dom --disable-gpu "http://192.168.8.1/html/statistic.html"
X Error:  BadDrawable
  Request Major code 55 ()
  ResourceID 0x0
  Error Serial #144
  Current Serial #146
X Error:  BadDrawable
  Request Major code 55 ()
  ResourceID 0x0
  Error Serial #144
  Current Serial #146
X Error:  BadDrawable
  Request Major code 55 ()
  ResourceID 0x0
  Error Serial #144
  Current Serial #146
[0110/214716.189128:FATAL:gpu_data_manager_impl_private.cc(897)] The display compositor is frequently crashing. Goodbye.
[0110/214716.198871:ERROR:broker_posix.cc(40)] Recvmsg error: Die Verbindung wurde vom Kommunikationspartner zurückgesetzt (104)
Trace/Breakpoint ausgelöst

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

И я действительно нашел что-то, что выглядит для меня очень хорошо. Я пытаюсь зачитать некоторую статистику трафика c LTE-флешки (Huawei E3531). Я нашел много значений, доступных через API в виде xml -файлов. Тезисы можно найти по этим URL-адресам (192.168.8.1 - это IP-адрес сетевого интерфейса, предоставленного флешкой LTE)

http://192.168.8.1/api/monitoring/month_statistics
http://192.168.8.1/api/monitoring/traffic-statistics
http://192.168.8.1/api/monitoring/status
http://192.168.8.1/api/device/basic_information
http://192.168.8.1/api/online-update/configuration
http://192.168.8.1/api/monitoring/converged-status
http://192.168.8.1/api/pin/status
http://192.168.8.1/api/monitoring/start_date

Страница month_statistics выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<CurrentMonthDownload>166033238</CurrentMonthDownload>
<CurrentMonthUpload>9679896</CurrentMonthUpload>
<MonthDuration>26391</MonthDuration>
<MonthLastClearTime>2019-12-30</MonthLastClearTime>
</response>

Так что я бы предположил, что CurrentMonthDownload -значение является используемым объемом этого месяца. На самом сайте он показывает 167,57 МБ. Я все еще не уверен на 100%, как это рассчитывается, но оно должно быть достаточно точным для меня.

0 голосов
/ 07 января 2020

Вы можете попытаться выяснить, что делает функция dw, и скопировать ее из вашего скрипта. Например, если эта функция извлекает некоторую JSON, содержащую нужную вам статистику, и печатает в HTML, вы можете попробовать и cURL сразу же сказать JSON.

Но если вам действительно нужно прочитать результат выполнения веб-страницы, вам не обойтись, вам нужен браузер. Вероятно, как вы уже указали, браузер без головы, такой как Phanthom JS. Вот список альтернатив - https://github.com/dhamaniasad/HeadlessBrowsers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...