Показать полную графическую версию : [решено] Скачиваине странички целиком
jack_nuclear
14-12-2019, 15:12
Доброго времени суток, форумчане. Нужно скачать страницу сайта т.е. повторить действия браузера по скачиванию страницы целиком. "Только HTML" - сайт отдает страницу для роботов =) Или прошу пнуть в правильном направлении. Пока я не нашел примеров со скачиванием страницы целиком. Все найденные мной скрипты утыкаются в страницу для роботов. Буду благодарен любой помощи. Wget мне не смог помочь
Что будет сделано дальше уже посредством батника, после скачивания страницы:
Открытие html, поиск класса, копирование с него зачения href в переменную, wget`ом скачать переменную
DJ Mogarych
14-12-2019, 16:11
http://winitpro.ru/index.php/2014/10/08/obrabotka-soderzhimogo-veb-stranic-i-html-sajtov-v-powershell/
jack_nuclear, так зачем Вам тогда «скачивание всего целиком», если Вы парсить будете только сам html? И — давайте конкретику, Url.
jack_nuclear
14-12-2019, 16:24
DJ Mogarych, принято. ковыряю доки. отпишу, если получится и закрою тему =)
Iska, а потому, что только в этом случае сайт отдает нужный мне класс =)
Пример: https://wgmods.net/22/
Класс: ModDetails_hidden--2Rtru
jack_nuclear
15-12-2019, 14:43
DJ Mogarych, никак повершелл не смог... все равно нужна помощь =)
DJ Mogarych
15-12-2019, 15:02
https://stackoverflow.com/questions/17625309/use-getelementsbyclassname-in-a-script
jack_nuclear
15-12-2019, 15:39
DJ Mogarych, там сайт отдает инфоЮ а в моем случае НЕТ. иначе я бы просто wget использовал и не задавал вопросов =)
jack_nuclear, итак, по порядку.
Во-первых, это ни разу не «отдаётся страница для роботов». Это обычное содержимое, который получает любой клиент в ответ на свой http-запрос. Это надо Вам чётко и точно понимать.
Во-вторых, после того, как данное содержимое получено, для клиентов, наподобие wget.exe, curl.exe, менеджеров загрузки и т.п. всё закончено. По мета-тэгам (или строя свои собственные предположения при отсутствии оных) они определяют, что именно им, собственно, было передано, сохраняют (возможно, перекодировав) это содержимое в файл потребного формата и заканчивают на этом свою работу. Они не занимаются ни парсингом содержимого, ни его размещением в окне — рендеринг (если это содержимое — html), ни исполнением скриптов.
Другое дело — браузеры. Получив содержимое, они начинают его парсить, выявляя все внешние вставки (например, ссылки на таблицы стилей, ссылки на изображения, ссылки на скрипты и т.п.) и загружая их. После чего начинают размещение содержимого в своём окне. Затем, когда доходит дело, начинается исполнение скриптов, которое может вмешиваться непосредственно и в само содержимое html-страницы, подчас радикально меняя его. В том числе, появляющиеся в содержимом новые скрипты могут перезапускать весь процесс заново.
В Вашем примере именно это и происходит — ссылка с классом ModDetails_hidden--2Rtru не содержится непосредственно в полученном html-коде страницы, а генерируется скриптом на клиенте, исполняющемся в браузере.
Посему, можно сделать, например, так:
Set-Variable -Name 'READYSTATE_COMPLETE' -Option 'Constant' -Value 4
$oIE = New-Object -ComObject 'InternetExplorer.Application'
$oIE.Navigate("https://wgmods.net/22/")
for($i = 0; $i -le 5; $i++) {
do {
Start-Sleep -Milliseconds 100
} until((-not $oIE.Busy) -and ($oIE.ReadyState -eq $READYSTATE_COMPLETE))
}
$oDocument = $oIE.Document
$oHtmlElement = $oDocument.GetElementsByClassName("ModDetails_hidden--2Rtru")[0]
Write-Host "HRef: $($oHtmlElement.href)"
$oIE.Quit()
https://i.imgur.com/fq53LH6.png
Предугадать заранее, сколько приседаний «Ку»:
for($i = 0; $i -le 5; $i++) {
do {
Start-Sleep -Milliseconds 100
} until((-not $oIE.Busy) -and ($oIE.ReadyState -eq $READYSTATE_COMPLETE))
}
понадобится сделать, пока в теле страницы не появится потребный элемент, в общем и целом — невозможно.
jack_nuclear
15-12-2019, 18:22
Iska, просто монстр! дай бог здоровья. отписал в лс пару уточняющих вопросов =)
jack_nuclear, личка у меня «забита» доверху, пишите на почту или непосредственно сюда.
jack_nuclear
15-12-2019, 20:29
Iska, почта заканчивается на 3090. Не хочу засирать тему тут ибо вы уже дали готовый код. Если посчитаете дальнейшее обсуждение примером для других - не вопрос. можно и тут
jack_nuclear
25-06-2020, 15:06
Iska, Доброго времени суток. Под powershell 7 не работает. Пишет Cannot find an overload for "getElementsByClassName" and the argument count: "1"
У PS7
Document : System.__ComObject
У PS5
Document : mshtml.HTMLDocumentClass
$oIE | Get-Member - говорит есть свойство Document
$oIE.Document | Get-Member - говорит есть метод getElementsByClassName
Подозреваю проблема в Microsoft.mshtml.dll. Подскажите что делать. Так не хочу запускать PS5 из PS7
p.s. в дебрях гугла нашел вот такое
$oIE=new-object -com internetexplorer.application
$oIE.navigate2(“About:blank”)
while ($oIE.busy) {
sleep -milliseconds 50
}
$oIE.visible=$true
$procList=ps |select-object ProcessName,Handles,NPM,PM,WS,VM,CPU,Id |convertto-html
$oDocBody=$oIE.document.documentelement.lastchild ;
#populate the document.body
$oDocBody.innerhtml=$procList
$oDocBody.style.font=”12pt Arial”;
$oIE.document.bgcolor=”#D7D7EA”
#Reading back from IE.
$oTBody=@($oIE.document.getElementsByTagName(“TBODY”))[0] ;
foreach ($oRow in $oTBody.childNodes)
{
#check the 4 column(WS),and highlight it if it is greater than 5MB.
$WS=(@($oRow.childNodes)[4].innerhtml) -as [int] ;
if (($ws -ne $null) -and ($WS -ge 5mb)) {
$oRow.bgColor=”#AAAAAA” ;
}
}
#Prepare a title.
$oTitle=$oIE.document.createElement(“P”)
$oTitle.style.font=”bold 20pt Arial”
$oTitle.innerhtml=”Process List”;
$oTitle.align=”center” ;
#Display the title before the Table object.
$oTable=@($oIE.document.getElementsByTagName(“TABLE”))[0] ;
$oDocBody.insertBefore($oTitle,$oTable) > $null;
И описание
Displaying the “$procList” can also be accomplished with “write” methods instead of innerhtml assignment. But we should perform some extra checks to determine whether the document.body is type of [mshtml.htmldocumentclass]. If the “htmlfile” progid has the following settings in the registry:
HKEY_CLASSES_ROOT\CLSID\{25336920-03F9-11CF-8FD0-00AA00686F13}\InProcServer32
Class : mshtml.HTMLDocumentClass
Assembly : Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
then, mshtml.htmldocumentclass become .NET wrapper for the document.body object.
So the following line :
$oDocBody.innerhtml=$procList
Can be replaced with:
If ($oIE.document.psbase.tostring() –eq “system.__comobject”) {
$oIE.document.write([string]$proclist)
}
else {
$oIE.document.IHTMLDOcument2_write([string]$proclist)
}
$oDocBody=$oIE.document.documentelement.lastchild ;
но применить это мозгов не хватает. Прошу помощи)
Foreigner
25-06-2020, 15:56
jack_nuclear, А зачем под PowerShell что-то там мудрить? Закачивайте страницу целиком и работайте с полученным...
Invoke-WebRequest и New-Object System.Net.Webclient в помощь.
jack_nuclear
25-06-2020, 22:50
Foreigner, оба не подошли к сайту. Проверка браузера на нем. Подмена User-Agent не спасла
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.