PDA

Показать полную графическую версию : вытянуть информацию из html полученного через curl


Страниц : 1 2 3 4 5 6 7 [8]

Griboed0ff
10-05-2020, 21:49
А в логе ошибок: »я просто экспериментировал, сейчас поставил снова 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
} Память не забита, проц занят подсчетами, но не критично, сетевая активность высокая, файл заполняется быстро, получается вот она безостановочная работа с большим списком.

Griboed0ff
14-05-2020, 15:55
Доброго всем времени суток. Прошлый скрипт работает отлично и уже собрал ~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 по умолчанию, интернет урезан и модуль не установить командой, только если его копировать и ставить как-то командами, вписать это в скрипт. Кто что думает как возможно решить задачу?

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

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

Griboed0ff
14-05-2020, 16:44
ставил пару модулей простым копирование, вроде работают без проблем. » Пробовал и как раз проблема, что политикой не дает не подписанный модуль запустить. Буду пока искать инфу на счет настройки ie через cmd, почему то думаю, что поставить галочку "использовать рекомендуемые настройки" командой возможно...

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

Griboed0ff
14-05-2020, 17:00
модуль локально... » все же попробую на нескольких машинах, политики для разных аушек могут быть разными.

Griboed0ff
06-06-2020, 19:58
модуль локально... »получилось ставить локально, но как всегда есть проблемки, а именно: 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.




© OSzone.net 2001-2012