Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl

Ответить
Настройки темы
PowerShell - вытянуть информацию из html полученного через curl

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: Griboed0ff
Дата: 17-09-2021
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.

Отправлено: 08:26, 16-04-2020

 

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Батник: »
я использовал такое решение, нагуглил
Код: Выделить весь код
@echo off
SetLocal EnableExtensions

set "ps=" & for %%X in (powerShell.exe) do set "ps=%%~$PATH:X"
if not defined ps set "ps=%systemRoot%\syswow64\windowsPowerShell\v1.0\powerShell.exe"

For /F "UseBackQ delims=" %%a in (`"cmd /c "
  "%ps%" -ExecutionPolicy ByPass -NoProfile -command "D:\1.ps1"
""`) do (
  echo %%a
)
pause
объяснение было такое что по умолчанию винда может и не знать через что запускать скрипт

Отправлено: 18:31, 20-04-2020 | #71



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
я использовал такое решение »
это почти то же самое, только с дополнительной проверкой переменной среды окружения PATH, на наличие пути к исполняемому файлу powershell.exe
Но, имхо, это излишне, если, конечно, эта переменная не подвергалась ручным изменениям...

-------
scio me nihil scire. Ѫ


Отправлено: 21:42, 20-04-2020 | #72


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Интересно есть ли ограничение по объему входных данных. Я скормил ему файлик с 700 подсетями, уже скоро как сутки чем то занят, не прерываю вдруг закончит все же.

Отправлено: 09:30, 21-04-2020 | #73


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
Интересно есть ли ограничение по объему входных данных. »
Не должно быть, но можно последить за потреблением памяти...
Цитата Griboed0ff:
уже скоро как сутки чем то занят »
а я предупреждал, что получился великий тормоз
Можно, конечно, было бы и прогрессбар прикрутить, но это только добавит "тормозов"
Чтобы проще было наблюдать, можно организовать вывод каждого IP в отдельный файл...

-------
scio me nihil scire. Ѫ


Отправлено: 10:09, 21-04-2020 | #74


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
а я предупреждал, что получился великий тормоз »
Это не страшно, просто первый раз запустил скрипт с большим объемом обрабатываемой информации и не понимал работает или нет. Реально только потребление памяти немного меняется. Так массово запускать буду редко, в основном сбор инфы только с одной подсетью.
Цитата YuS_2:
Можно, конечно, было бы и прогрессбар прикрутить, но это только добавит "тормозов" »
это да лишнее, работает не трогай

YuS_2, помогите пожалуйста собрать теперь этого Франкенштейна

Отправлено: 11:24, 21-04-2020 | #75


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
скормил ему файлик с 700 подсетями, уже скоро как сутки чем то занят »
Когда возникают такие ситуации, это значит, что задача решается не теми методами.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:47, 21-04-2020 | #76


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Когда возникают такие ситуации, это значит, что задача решается не теми методами. »
согласен, но других инструментов нет и не предвидится, поэтому лучше такой скрипт, чем собирать эти данные руками.

Отправлено: 13:23, 21-04-2020 | #77


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


Про GLPI слышали или вообще про инвентаризационный софт?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:10, 21-04-2020 | #78


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
согласен, но других инструментов нет и не предвидится »
Ну почему нет... я вот упоминал про PowerHTML
Вот, скрипт на его основе:
script.ps1
Код: Выделить весь код
param (
	#[parameter(Mandatory=$true)]
	[string]$outfile = 'table_phtml.csv',
	$encode = 65001,
	[int[]]$SelectTable = 1
)

#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля PowerHTML, для независимого парсинга HTML
# Может потребоваться ручное подтверждение установки. 
if (!(get-module -list powerhtml)) {
	write-verbose "Installing PowerHTML module for the current user..."
	install-module powerhtml #-scope currentuser
}
#-----------------------------------------------------------------------------------------

function convert ($from, $to){
	begin{
		$fenc = [text.encoding]::getencoding($from)
		$tenc = [text.encoding]::getencoding($to)
	}
	process{
		$a = $tenc.getbytes($_)
		$fenc.getstring($a)
	}
}
[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
[array]$arr =  gc 'list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

$ips|%{
	$a = (iwr $_).content
	$content = if ($a -match [char]208){
		$a|convert $encode 28591
	} else {$a}
	
	$html = [net.webutility]::htmldecode($content)|convertfrom-html
	[array]$tables = $html.selectnodes('//table')
	# Исключение вложенных таблиц:
	$tables = $tables|?{$_.innerhtml -notmatch 'table'}
	
	if ([string]::isnullorempty($selecttable)){
		$number = 0..($tables.count-1)
	} else {$number = $selecttable}
	
	$tbl = $tables[$number]|%{$n=0}{
		$tr = if($_.element('tbody')){
			$_.element('tbody').elements('tr')
		} else {$_.elements('tr')}
		$headers = @()
		if($headers = $tr|?{$_.element('th') -ne $null}|
		%{$_.elements('th')}|select -exp innertext){
			$headers=$headers.trim()
		} else {
			$headers = 1..(
				[linq.parallelenumerable]::max(
					[linq.parallelenumerable]::asparallel(($tr|
					%{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
				)
			)|%{"H$_"}
		}
		$rowind = ,1 * $headers.count
		$tr|?{$_.elements('td') -ne $null}|%{
			$row = $_.elements('td')|? innertext -ne ''|%{
				$attr = $_.attributes
				if ($attr){
					$rowspan = ($attr|? name -eq 'rowspan'|select value).value
					$colspan = ($attr|? name -eq 'colspan'|select value).value
				}
				[pscustomobject]@{
					'InnerText' = $_.innertext
					'RowSpan' = if($rowspan){[int]$rowspan} else {1}
					'ColSpan' = if($colspan){[int]$colspan} else {1}
				}
			}
			$str = [ordered]@{}
			$k=0
			foreach ($item in $row){
				if ($rowind[$k] -gt 1){
					while ($rowind[$k] -gt 1){
						$str[$headers[$k]] = $null
						$rowind[$k] -= 1
						$k++
					}
				}
				if (($colspan = $item.colspan) -gt 1) {
					$str[$headers[$k]] = if($item.innertext){
						$item.innertext.trim()
					} else {$null}
					if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
					$k++
					while ($colspan -gt 1){
						$str[$headers[$k]] = $null
						$colspan -=1
						if ($rowind[$k] -gt 1){$rowind[$k]-=1}
						$k++
					}
				} else {
					$str[$headers[$k]] = if($item.innertext){
						$item.innertext.trim()
					} else {$null}
					if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
					$k++
				}
			}
			[pscustomobject]$str
		}
	}
	[pscustomobject]@{
		'IP'				= $_
		'MAC-адрес' 		= $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
		'Номер телефона'	= if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
								$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
							  } else {
							  	$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
							  }
		'Серийный номер'	= $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
		'Номер модели'		= $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
	}
} |export-csv $outfile -notype -enc utf8 -d ';'


Плюсы:
Работает гораздо быстрее предыдущих вариантов парсинга через IE
Парсер не зависит от наличия IE в системе. Может работать на версиях Powershell Core, где встроенный парсер HTML, связанный с IE, был вырезан, т.е. работает на самых свежих версиях powershell Core...
Таблицу разбирает, также с учетом rowspan и colspan
Минусы:
Зависимость от dom-структуры, всё также, присутствует...

Возможно, что-то не учтено (собирал по-быстрому), но проверен на тех страницах, которые здесь были показаны...

-------
scio me nihil scire. Ѫ


Отправлено: 23:18, 21-04-2020 | #79


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Про GLPI слышали или вообще про инвентаризационный софт? »
слышал конечно, но за сторонний софт будет не хорошо, иб никогда не пропустит. Поэтому встроенные средства. Скрипт нормально работает в одной подсети, а снять данные со всех айпишек это разовая задача.

Отправлено: 07:23, 22-04-2020 | #80



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как получить информацию, не отображаемую в HTML-коде? Apock Вебмастеру 0 26-12-2015 22:11
Имитация браузера через cURL dmit.medv Вебмастеру 0 28-12-2012 18:02
[решено] Вывести информацию из файла через JS MultiMax Вебмастеру 1 31-05-2011 22:58
[решено] Вытянуть содержание HTML тега с помощью регулярных выражений aesir AutoIt 4 28-08-2009 21:22
Как передать в javascript данные массива, полученного из кода на php vagner_HATE Вебмастеру 1 18-06-2009 13:51




 
Переход