Войти

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


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

Foreigner
09-05-2020, 19:50
Видимо 7 пошик и ошибки пишет другие »

Попробуйте все-таки вернуть:

[net.servicepointmanager]::securityprotocol = 0


Значение 0 отрабатывает нормально, можете поэкспериментировать (https://docs.microsoft.com/ru-ru/dotnet/api/system.net.securityprotocoltype?view=netframework-4.8)

YuS_2
09-05-2020, 19:56
сохранял в utf-8. Что имеете ввиду "именовать"? »
} -throttlelimit 4 |export-csv $outfile -notype -enc utf8 -d ';' -append »

поставил 100, пошик занял всю память »
что естественно, ведь это ресурсоемкий вариант использования...

Griboed0ff
09-05-2020, 20:04
Попробуйте все-таки вернуть: »
поставил, работает, немного пишет все таки, но я так понимаю это неизбежно.Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.

} -throttlelimit 4 |export-csv $outfile -notype -enc utf8 -d ';' -append » » значит все условия выполнены. Думаю не критично, пару столбиков напишу руками :)

YuS_2
09-05-2020, 20:25
немного пишет все таки, но я так понимаю это неизбежно. »
Добавьте в начале цикла переменную $ip, здесь:
...
try {
$ip = $_
$a = (iwr $_).content
...
а потом в секции catch, строку поменяйте на такую:
...
} catch {
write-host Ошибка: $ip - $_ -for red
}
...

значит все условия выполнены »
какие условия? Там надо поменять utf8 на utf-8

Griboed0ff
09-05-2020, 21:15
write-host Ошибка: $ip - $_ -for red » теперь пишет айпишник, почему это всегда 159 на конце, посмотрел на 159 нет в сети никаких устройств. Новый скрипт собрал за коротки промежуток времени столько, сколько старый скрипт собирал целый день!!! Это прям круто.

YuS_2
09-05-2020, 21:28
посмотрел на 159 нет в сети никаких устройств. »
а пинг вручную пробовали именно на такие IP?
test-connection XXX.XXX.XXX.159 -count 1 -q -timeout 1
что выдают?

Griboed0ff
09-05-2020, 21:42
что выдают? » true, но с другого компа та же команда выдала false

они не на каждой подсети появляются, редко, но работает ведь, а на ругань можно не обращать внимания. На этих айпишниках точно ничего нет.

YuS_2
09-05-2020, 22:32
true, но с другого компа та же команда выдала false »
странно... но это сетевые настройки уже надо копать. По идее, такого быть не должно...

Griboed0ff
10-05-2020, 13:03
что естественно, ведь это ресурсоемкий вариант использования... »
все же core имеет проблемки, суть в том, что процесс пошика начинает копится в озу потом лезет в файл подкачки, когда заполняет все работа судя сетевой активности прекращается. Сначала подумал надо поставить не 100, а меньше намного, в общем в несколько тестов разобрался, что даже если потоков будет 2, то процесс пошика все равно забивает память, но медленно. То есть память процесса не очищается и ее заполнение неизбежно.

Griboed0ff
10-05-2020, 13:41
250 подсетей скрипт отработал на 100 потоков, а вот 2500 уже не хватает памяти хоть на скольких потоков.

YuS_2
10-05-2020, 15:48
Griboed0ff, это утечка памяти... видимо из-за runspace -ов. Ничего не поделаешь, только ждать исправлений...

Griboed0ff
10-05-2020, 16:01
Ничего не поделаешь »
раз срипт отрабатывает маленькие списки, может как то выдавать скрипту части списка, например, по пять строк? не существует никакой команды, которая бы очищала бы память?

Griboed0ff
10-05-2020, 19:05
нормально обрабатывает список по 50 строк, больше начинаются приколы.

Foreigner
10-05-2020, 19:26
может как то выдавать скрипту части списка, например, по пять строк? »

А как хранится этот список?

Griboed0ff
10-05-2020, 19:36
А как хранится этот список? »файлик txt, внутри список столбиком 10.10.10.
10.10.20.
10.10.30. у меня почти 3000 подсетей\строк в файлике, по 50 строк обрабатывает на ура.

Foreigner
10-05-2020, 19:50
файлик txt, внутри список столбиком »

Если речь про pwsh, тогда попробуйте запускать так:

PS > get-content file.txt -readcount 50 | foreach -parallel { script.ps1 $_ } -throttlelimit $(сколько потоков)


Если powershell:

PS > get-content file.txt -readcount 50 | foreach { script.ps1 $_ }

Griboed0ff
10-05-2020, 20:18
Если речь про pwsh, тогда попробуйте запускать так: »я так понимаю надо тогда в самом скрипте убирать лишнее? param (
#[parameter(Mandatory=$true)]
[string]$outfile = 'D:\PowerShell\готовые\общийпошик7.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\готовые\ip1.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

if ([string]::isnullorempty($selecttable)){
$number = 0
} else {$number = $selecttable}
$ips|% -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 get-content D:\PowerShell\готовые\ip1.txt -readcount 50 | foreach -parallel { D:\PowerShell\готовые\phone_p7.ps1 $_ } -throttlelimit $(1000)Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
134 | … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.96.34.
| 10.96.37. 10.96.39. 10.96.49. 10.96.50. 10.96.169. 10.96.155. 10.96.146. 10.96.195. 10.96.54.
| 10.96.106. 10.96.184. 10.96.117. 10.96.162. 10.96.158. 10.96.124. 10.96.125. 10.96.55. 10.96.130.
| 10.96.131. 10.96.137. 10.96.138. 10.96.140. 10.96.196. 10.96.193. 10.96.120. 10.96.126. 10.96.51.
| 10.96.166. 10.96.30. 10.97.5. 10.96.70. 10.97.218. 10.97.60. 10.97.137. 10.97.16. 10.97.219.
| 10.97.209. 10.96.48. 10.96.53. 10.96.148. 10.98.17. 10.96.80. 10.96.175. 10.96.173. 10.96.176.
| 10.96.151. 10.96.44. 10.96.167. 10.96.160'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
134 | … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.96.165.
| 10.96.197. 10.96.180. 10.96.199. 10.96.200. 10.96.179. 10.96.181. 10.96.31. 10.97.7. 10.96.121.
| 10.96.202. 10.96.203. 10.96.161. 10.97.6. 10.97.10. 10.97.12. 10.96.189. 10.97.58. 10.97.14. 10.97.15.
| 10.97.27. 10.97.34. 10.97.74. 10.97.35. 10.97.30. 10.97.26. 10.97.81. 10.97.24. 10.97.77. 10.96.60.
| 10.97.83. 10.96.154. 10.96.72. 10.96.73. 10.96.65. 10.96.94. 10.97.23. 10.97.212. 10.97.211. 10.97.82.
| 10.98.11. 10.97.47. 10.97.49. 10.96.89. 10.97.101. 10.97.71. 10.97.120. 10.97.55. 10.96.118. 10.97.57'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
134 | … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.97.18.
| 10.97.67. 10.97.119. 10.97.22. 10.97.28. 10.97.68. 10.97.32. 10.97.33. 10.97.61. 10.97.43. 10.97.69.
| 10.97.62. 10.97.72. 10.97.75. 10.97.79. 10.97.100. 10.97.109. 10.97.110. 10.96.111. 10.97.106.
| 10.96.164. 10.97.111. 10.97.114. 10.96.32. 10.97.115. 10.97.118. 10.98.59. 10.97.54. 10.98.61.
| 10.98.64. 10.98.70. 10.98.68. 10.98.69. 10.98.73. 10.98.67. 10.98.71. 10.98.77. 10.98.75. 10.98.106.
| 10.98.78. 10.98.81. 10.98.79. 10.98.80. 10.98.85. 10.98.92. 10.98.90. 10.98.87. 10.98.86. 10.98.83.
| 10.98.82'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
134 | … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.98.84.
| 10.98.88. 10.98.89. 10.98.95. 10.98.97. 10.98.91. 10.98.93. 10.98.98. 10.98.94. 10.98.96. 10.98.102.
| 10.98.104. 10.98.99. 10.98.101. 10.98.100. 10.98.103. 10.98.105. 10.98.111. 10.98.112. 10.98.108.
| 10.98.107. 10.97.170. 10.98.74. 10.98.116. 10.98.115. 10.97.44. 10.98.114. 10.97.227. 10.96.22'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
134 | … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.208.64.
| 10.209.236. 10.208.67. 10.208.137. 10.208.134. 10.208.143. 10.208.146. 10.209.14. 10.209.13.
| 10.209.16. 10.209.30. 10.209.234. 10.209.233. 10.209.209. 10.209.130. 10.209.211. 10.209.241.
| 10.209.244. 10.209.235. 10.209.242. 10.209.239. 10.209.243. 10.208.36. 10.209.245. 10.209.251.
| 10.209.246. 10.209.252. 10.208.19. 10.208.26. 10.208.32. 10.208.33. 10.208.46. 10.208.41. 10.97.164.
| 10.97.201. 10.96.35. 10.96.27. 10.96.133. 10.96.69. 10.96.75. 10.98.29. 10.97.73. 10.98.32. 10.98.33.
| 10.98.57. 10.97.196. 10.96.42. 10.96.108. 10.97.139. 10.96.183'

Foreigner
10-05-2020, 21:15
Так, сразу и не разберешься. Применительно к скрипту, надо как-то менять саму конструкцию. Попробуйте заменить:


$ips|% -parallel {.....


на

$x = 0

for ($i =0; $i -le ($ips.count - 1); $i += 20) # по 20 адресов
{
$ips[$x..$i] | foreach -parallel { <здесь весь оставшийся код> } -throttlelimit 1000 | export-csv $outfile -notype -enc utf-8 -d ';' -append
$x = $i + 1
}

Т.е. завернуть foreach ("%") в for
Проверить, понятное дело, не могу. И мне кажется, что лучше выбрать throttellimit другим, 1000, имхо, большой перебор. сколько ядер, умноженное на кол-во потоков одного ядра.

Ошибся:

for ($i =20;....

Griboed0ff
10-05-2020, 21:32
Т.е. завернуть foreach ("%") в for » запустил, работает, посмотрим, что насобирает. исправил обе 20 на 50, и throttellimit на 100.

YuS_2
10-05-2020, 21:37
Если powershell: »
Если powrshell, то там это не нужно... runspace в нем задействовать придется по-другому.

Если речь про pwsh »
То именно запуск скрипта лучше не распараллеливать, распареллеливание реализовано уже внутри, тут как раз потребуется последовательное выполнение...

Griboed0ff,
В скрипте, который Вы показываете:
elimit 1000 »
А в логе ошибок:
elimit 1000000 »
:o
Так ресурсы, Вы не сэкономите... скушает скрипт их легко и быстро. :)




© OSzone.net 2001-2012