Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скачиваине странички целиком (http://forum.oszone.net/showthread.php?t=343280)

jack_nuclear 14-12-2019 15:12 2900332

Скачиваине странички целиком
 
Доброго времени суток, форумчане. Нужно скачать страницу сайта т.е. повторить действия браузера по скачиванию страницы целиком. "Только HTML" - сайт отдает страницу для роботов =) Или прошу пнуть в правильном направлении. Пока я не нашел примеров со скачиванием страницы целиком. Все найденные мной скрипты утыкаются в страницу для роботов. Буду благодарен любой помощи. Wget мне не смог помочь

Что будет сделано дальше уже посредством батника, после скачивания страницы:
Открытие html, поиск класса, копирование с него зачения href в переменную, wget`ом скачать переменную

DJ Mogarych 14-12-2019 16:11 2900345

http://winitpro.ru/index.php/2014/10...-v-powershell/

Iska 14-12-2019 16:13 2900347

jack_nuclear, так зачем Вам тогда «скачивание всего целиком», если Вы парсить будете только сам html? И — давайте конкретику, Url.

jack_nuclear 14-12-2019 16:24 2900352

DJ Mogarych, принято. ковыряю доки. отпишу, если получится и закрою тему =)

Iska, а потому, что только в этом случае сайт отдает нужный мне класс =)
Пример: https://wgmods.net/22/
Класс: ModDetails_hidden--2Rtru

jack_nuclear 15-12-2019 14:43 2900510

DJ Mogarych, никак повершелл не смог... все равно нужна помощь =)

DJ Mogarych 15-12-2019 15:02 2900513

https://stackoverflow.com/questions/...me-in-a-script

jack_nuclear 15-12-2019 15:39 2900522

DJ Mogarych, там сайт отдает инфоЮ а в моем случае НЕТ. иначе я бы просто wget использовал и не задавал вопросов =)

Iska 15-12-2019 17:38 2900548

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()



Предугадать заранее, сколько приседаний «Ку»:
Скрытый текст
Код:

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 2900556

Iska, просто монстр! дай бог здоровья. отписал в лс пару уточняющих вопросов =)

Iska 15-12-2019 18:35 2900559

jack_nuclear, личка у меня «забита» доверху, пишите на почту или непосредственно сюда.

jack_nuclear 15-12-2019 20:29 2900586

Iska, почта заканчивается на 3090. Не хочу засирать тему тут ибо вы уже дали готовый код. Если посчитаете дальнейшее обсуждение примером для других - не вопрос. можно и тут

jack_nuclear 25-06-2020 15:06 2926239

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;

И описание

HTML код:

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 2926248

jack_nuclear, А зачем под PowerShell что-то там мудрить? Закачивайте страницу целиком и работайте с полученным...

Invoke-WebRequest и New-Object System.Net.Webclient в помощь.

jack_nuclear 25-06-2020 22:50 2926303

Foreigner, оба не подошли к сайту. Проверка браузера на нем. Подмена User-Agent не спасла


Время: 22:56.

Время: 22:56.
© OSzone.net 2001-