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

Компьютерный форум 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:
А в логе ошибок: »
я просто экспериментировал, сейчас поставил снова 1000 и такой код:
Скрытый текст
Код: Выделить весь код
param (
	#[parameter(Mandatory=$true)]
	[string]$outfile = 'D:\PowerShell\готовые\phone_50.csv',
	$enc1 = 65001,
	$enc2 = 28591,
	[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 = 0
[array]$arr  = gc 'D:\PowerShell\готовые\ip2.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

if ([string]::isnullorempty($selecttable)){
	$number = 0
} else {$number = $selecttable}
$x = 0

for ($i =50; $i -le ($ips.count - 1); $i += 50)     # по 20 адресов
{
    $ips[$x..$i] | foreach -parallel {
	if (test-connection $_ -count 1 -q -timeout 1){
		try {
            $ip = $_
			$a = (iwr $_).content
			$content = if ($a -match [char]208){
				if ($a -match 'windows-1251'){
					$enc1,$enc2 = 1251,1252
					$a|convert $enc1 $enc2
				} else {$a|convert $using:enc1 $using:enc2}
			} else {$a}
			$html = [net.webutility]::htmldecode($content)|convertfrom-html
			[array]$tables = $html.selectnodes('//table')
			# Исключение вложенных таблиц:
			$tables = $tables|?{$_.selectnodes('.//table') -eq $null}
			$tbl = $tables[$using:number]|%{$n=0}{
				$tr = $_.selectnodes('.//tr')
				$headers = @()
				if ($headers = $_.selectnodes('.//th')){
					$headers = ($headers|select -exp innertext).trim()
				} else {
					$headers = 1..([linq.parallelenumerable]::max(
						[linq.parallelenumerable]::asparallel(
							($tr|%{$_.selectnodes('.//td').count})
						)
					))|%{"H$_"}
				}
				$rowind = ,1 * $headers.count
				$tr|?{$_.selectnodes('.//td') -ne $null}|%{
					$row = $_.selectnodes('.//td')|%{
						$attr = $_.attributes
						if ($attr){
							$rowspan = ($attr|? name -eq 'rowspan').value
							$colspan = ($attr|? name -eq 'colspan').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
				}
			}
			$parr1 = $tbl.h1
			if ($tbl.h2 -ne $null) {$parr2 = $tbl.h2} else {$parr2 = $tbl.h3}
			[pscustomobject]@{
				'IP'				= $_
				'MAC-адрес' 		= if ([array]::indexof($parr1,'MAC-адрес') -ne -1) {
										$parr2[([array]::indexof($parr1,'MAC-адрес'))]
									  } else {$parr2[([array]::indexof($parr1,'MAC Address'))]}
				'Номер телефона'	= if ([array]::indexof($parr1,'Номер телефона') -ne -1) {
										$parr2[([array]::indexof($parr1,'Номер телефона'))]
									  } elseif ([array]::indexof($parr1,'Номер телефона 1') -ne -1) {
									  	$parr2[([array]::indexof($parr1,'Номер телефона 1'))]
									  } else {
									  	$parr2[([array]::indexof($parr1,'Phone DN'))]
									  }
				'Серийный номер'	= if ([array]::indexof($parr1,'Серийный номер') -ne -1) {
										$parr2[([array]::indexof($parr1,'Серийный номер'))]
									  } else {$parr2[([array]::indexof($parr1,'Serial Number'))]}
				'Номер модели'		= if ([array]::indexof($parr1,'Номер модели') -ne -1) {
										$parr2[([array]::indexof($parr1,'Номер модели'))]
									  } else {$parr2[([array]::indexof($parr1,'Model Number'))]}
			}
		} catch {
			write-host Ошибка: $ip - $_ -for red
		}
	}
} -throttlelimit 1000 | export-csv $outfile -notype -enc utf-8 -d ';' -append
    $x = $i + 1
	}
Память не забита, проц занят подсчетами, но не критично, сетевая активность высокая, файл заполняется быстро, получается вот она безостановочная работа с большим списком.

Отправлено: 21:49, 10-05-2020 | #141



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

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


Старожил


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

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


Доброго всем времени суток. Прошлый скрипт работает отлично и уже собрал ~4000 аппаратов, его я запускаю со своего пк когда собираю инфу. Есть и другая версия скрипта, которая запускается на машинах локально.Столкнулся с проблемой парсера, а именно проблемы с ie, на тех пк, на которых ie никогда не открывались, не пройдена первоначальная настройка, естественно парсер говорит об этом. Если зайти в ie и согласится с настройками то скрипт отрабатывает корректно. Есть ли какая-нибудь команда, чтобы запустить парсер без первоначальной настройки?
скрипт
Код: Выделить весь код
param (
#[parameter(Mandatory=$true)]
$encode = 65001,
[string]$outfile = 'D:\distr\table.csv',
[int]$number = 1
)



Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' |
select @{n='Имя пк';e={$_.macaddress}}| convertto-csv -d ';' -notype|
out-file $outfile -enc utf8


$ofs = ''
gwmi wmimonitorid -Namespace root\wmi |
Select @{n='UserFriendlyName';e={
	([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)
}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} | convertto-csv -d ';' -notype|
out-file $outfile -enc utf8 -app


D:\distr\SnmpWalk\SnmpWalk.exe -v:2c -c:gkj[jt50cjj,otcndj -os:1.3.6.1.2.1.47.1.1.1.1.2.0 -op:1.3.6.1.2.1.47.1.1.1.1.2.1 -r:10.83.3.1 -csv|
out-file $outfile -enc utf8 -app


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'
$ips = 130..190 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|sort
$ips|%{
	if (test-connection $_ -count 1 -q){
		try{
			$html = iwr $_
			$tables = $html.parsedhtml.getelementsbytagname("table")
			$tbl = ($tables|?{($_.getelementsbytagname('table')|
			%{$_}).count -eq 0})[$number]|%{
				$headers = @();
				$tr = $_|%{$_.getelementsbytagname("tr")}
				if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
				%{$_.getelementsbytagname("th")}|select -exp innertext){
					if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
					$headers = $headers.trim()
			 	} else {
					$headers = 1..([linq.parallelenumerable]::max(
						[linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
					)+1)|%{"H$_"}
				}
				$rowind = ,1 * $headers.count
				$tr.where({$_.firstchild().tagname -eq 'td'})|%{
					$row = $_.getelementsbytagname("td") |? innertext -ne $null|
					select innertext,rowspan,colspan
					if($row.innertext -match [char]208){
						for($i=0;$i -lt $row.count;$i++){
							$row[$i].innertext = $row[$i].innertext|convert $encode 28591
						}
					}
					$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-адрес' 		= if ([array]::indexof($tbl.h1,'MAC-адрес') -ne -1){
				#						$tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
				#					  } else {$tbl[([array]::indexof($tbl.h1,'MAC Address'))].h2}
                'Номер модели'		= if ([array]::indexof($tbl.h1,'Номер модели') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
									  } else {$tbl[([array]::indexof($tbl.h1,'Model Number'))].h2}
				'Номер телефона'	= if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
									  } elseif ([array]::indexof($tbl.h1,'Номер телефона 1') -ne -1){
									  	$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
									  } else {
									  	$tbl[([array]::indexof($tbl.h1,'Phone DN'))].h2
									  }
				'Серийный номер'	= if ([array]::indexof($tbl.h1,'Серийный номер') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
									  } else {$tbl[([array]::indexof($tbl.h1,'Serial Number'))].h2}
				
			}
		} catch {
			write-host Ошибка: $_ -for red
		}
	}
} | convertto-csv -d ';' -notype|out-file $outfile -enc utf8 -app
запускается планировщиком и складывает инфу в файлик на диске. Естественно на компах никто никогда не заходил в ie от локального админа и поэтому настройка не завершена. Использовать срипт с парсером из powerhtml тоже нет возможности, этот модуль отсутствует на win10 по умолчанию, интернет урезан и модуль не установить командой, только если его копировать и ставить как-то командами, вписать это в скрипт. Кто что думает как возможно решить задачу?

Последний раз редактировалось Griboed0ff, 14-05-2020 в 16:38.


Отправлено: 15:55, 14-05-2020 | #142


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
Если зайти в ie и согласится с настройками то скрипт отрабатывает корректно. Есть ли какая-нибудь команда, чтобы запустить парсер без первоначальной настройки? »
Нет, этот парсер напрямую завязан на ie, без него работать не будет...

Цитата Griboed0ff:
Использовать срипт с парсером из powerhtml тоже нет возможности, этот модуль отсутствует на win10 по умолчанию, интернет урезан и модуль не установить командой, только если его копировать и ставить как-то командами, вписать это в скрипт. Кто что думает как возможно решить задачу? »
Поискать в нете инфу, как установить модуль локально... ставил пару модулей простым копирование, вроде работают без проблем.

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


Отправлено: 16:40, 14-05-2020 | #143


Старожил


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

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


Цитата YuS_2:
ставил пару модулей простым копирование, вроде работают без проблем. »
Пробовал и как раз проблема, что политикой не дает не подписанный модуль запустить. Буду пока искать инфу на счет настройки ie через cmd, почему то думаю, что поставить галочку "использовать рекомендуемые настройки" командой возможно...

скорее всего это будет подмена ветки реестра, пока все мысли на это указывают

Отправлено: 16:44, 14-05-2020 | #144


Старожил


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

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


Цитата YuS_2:
модуль локально... »
все же попробую на нескольких машинах, политики для разных аушек могут быть разными.

Отправлено: 17:00, 14-05-2020 | #145


Старожил


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

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


Цитата YuS_2:
модуль локально... »
получилось ставить локально, но как всегда есть проблемки, а именно:
Скрытый текст
Код: Выделить весь код
PS D:\local> D:\local\localphone.ps1
Ошибка: Невозможно выполнить анализ содержимого отклика, так как подсистема Internet Explorer недоступна или настройка
 при первом запуске Internet Explorer выполнена не полностью. Укажите параметр UseBasicParsing и попробуйте еще раз. 
Ошибка: Невозможно выполнить анализ содержимого отклика, так как подсистема Internet Explorer недоступна или настройка
 при первом запуске Internet Explorer выполнена не полностью. Укажите параметр UseBasicParsing и попробуйте еще раз. 
Ошибка: Невозможно выполнить анализ содержимого отклика, так как подсистема Internet Explorer недоступна или настройка
 при первом запуске Internet Explorer выполнена не полностью. Укажите параметр UseBasicParsing и попробуйте еще раз.
Получается запускается скрипт от пользователя, который никогда не заходил в IE. МБ запускать от пользака, который точно пользуется ie. Но проблема в том, первая часть скрипта требует админских прав, а парсеру на айпишки нужны настройки для ie. Была надежда, что при использовании powerhtml не нужен будет ie.

Отправлено: 19:58, 06-06-2020 | #146



Компьютерный форум 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




 
Переход