Войти

Показать полную графическую версию : [решено] Скачиваине странички целиком


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/

Iska
14-12-2019, 16:13
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 использовал и не задавал вопросов =)

Iska
15-12-2019, 17:38
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, просто монстр! дай бог здоровья. отписал в лс пару уточняющих вопросов =)

Iska
15-12-2019, 18:35
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