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

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

alexmoreman 12-08-2010 17:10 1472296

[решено] Помогите реализовать скачивание html страницы и поиск в ней
 
Подскажите пожалуйста, можно ли и как написать батник выполняющий такие действия:
первым действием идёт скачивание с помощью wget html страницы
wget -c -t 0 Http://sait.ru/452484 -O 452484.html
далее необходимо в скаченном html найти строку
<form action=d/цыфры/цыфры method=GET id="start_download_form">
скопировать из этой строки
d/цыфры/цыфры
и вставить в следующей строке вместо ХХХ
wget -c -t 0 Http://sait.ru/ХХХ -O Fail.avi

NiOl 12-08-2010 19:07 1472365

Пакетным файлом плохо обрабатывать текста, особенно такие как HTML... могут теги поползти еще на этапе чтения... тут что-то по-хитрее надо... в любом случае присоедините в аттач зазипованный пример HTMLки, попробуем...

alexmoreman 12-08-2010 19:27 1472384

Вложений: 1
Вот пример html страницы.
Также я приложил пример скрипта для nix с помощью bash ,только что то не работает или я неправильно делаю.
пробовал через cygwim

deepred 12-08-2010 23:56 1472542

alexmoreman,

Насчет *.bat - не та это задача, чтобы её решать методами CMD, поэтому предлагаю расположить wget в теле Vbsript:

Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "F:\rem\Primer.html"
While objIE.Busy
    WScript.Sleep 200
Wend
Set tag = objIE.Document.getElementByid("start_download_form")
WScript.Echo tag.getAttribute("action") ' смотрим то ли?

Set WshShell = CreateObject("WScript.Shell")
Retval = WshShell.Run ("wget -c -t 0 Http://sait.ru/" & _
tag.getAttribute("action") & "-O Fail.avi", 1, True)
WScript.Echo "Команда выполнена! Код возврата: " & Retval
objIE.Quit

или процедура скачивания полностью на VBS (замена wget):
Код:

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
StrTargetHtml = "Http://sait.ru/" & _
tag.getAttribute("action") & "/" & "Fail.avi"

oXMLHTTP.Open "GET", StrTargetHtml, 0

oXMLHTTP.Send
Set oADOStream = CreateObject("ADODB.Stream")
oADOStream.Mode = 3
oADOStream.Type = 1
oADOStream.Open
oADOStream.Write oXMLHTTP.responseBody
oADOStream.SaveToFile "F:\DL\Fail.avi", 2
WScript.Echo "Закачка завершена"

____________________________________________________________________________________________________ _________________

PS: ознакомтесь с темой протестируйте скрипт для обновления утилит от Piriform (CCleaner,Defraggler и тд) в ней
предолагается решение похожей задачи средствами CMD - сделано граммотно и аккуратно, но слишком сложно
за счет отсутствия необоходимых алгоритмов в утилитах CMD.



alexmoreman 13-08-2010 00:38 1472563

deepred,
спасибо это очень интересно! Я попробовал но увы почему то не идет и выходит ошибка

запускаю с батника так:
wget -c -t 0 Http://share-nn.ru/31032611 -O Primer.html
start script.vbs
Насчет этого в твоём скрипте F:\rem\Primer.html я так понимаю полный путь к файлу?

причина задаться этой проблемои была, в жадности данного хранилища относительно моего провайдера.
вот и приходится wgetом долбиться по ссылкам от 10 до 30 раз для получения как страницы так и файла.
для подобной цели я себе создал 2 .bat
1. wget -c -t 0 Http://sait.ru/452484 -O 452484.html
после скачивания страницы я открываю её и копирую во второй .bat ссылку на файл и его название:
2. wget -c -t 0 Http://sait.ru/d/452484856/765890 -O название файла.avi
поэтому и хочеться этот процесс оптимизировать и не вписывать ссылку на файл вручную.

deepred 13-08-2010 13:02 1472816

alexmoreman,

Цитата:

Цитата alexmoreman
выходит ошибка »

Цитата:

Цитата alexmoreman
строка: 11
символ: 23
»

странная ошибка, у меня всё страбатывает как надо, попробуйте снова скопировать код с форума
и вставить в блокнот (а лучше akelpad).

Как вариант попробуйте изменить определение Retval:
Код:

Retval = WshShell.Run ("cmd /c wget -c -t 0 Http://sait.ru/" & _
tag.getAttribute("action") & "-O Fail.avi", 0, True)

Цитата:

Цитата alexmoreman
F:\rem\Primer.html я так понимаю полный путь к файлу? »

- да, полный путь...

alexmoreman 13-08-2010 13:57 1472872

deepred,
спасибо огромное тебе! теперь наконец то стало определятся точто вроде нужно.(и в вчерашнем скрипте и с поправками)

но остаются "но" после нажатия OK не запускается wget (не видно работы кансоли(может ты высталил скриптом в тихом режиме?)) и через промежуток выходит это сообщение

все файлы (.bat ,.vbs,.wget.exe) лежат в одной папке

deepred 13-08-2010 14:10 1472879

alexmoreman,

WshShell.Run ("cmd /c wget -c -t 0 Http://sait.ru/" & _
tag.getAttribute("action") & "-O Fail.avi",
0, True)
0 - отвечает за скрытый режим (для видимости консольного окна выставьте "1")

Закачка-то происходит?

alexmoreman 13-08-2010 14:20 1472888

в том то и дело что не происходит
он через раз ошибку выдает и вот сейчас присоединяет к ссылке -0 (в wget)
Http://share-nn.ru/d/10189263/453382-0
точнее не ноль а букву o
------
dвсё решил. поиграл с пробелами(убрал букву о)
а возможен вариант без нажатия ОК?
-----
блин накаркал, прошло в качалке 3 попытки соединится и прикрывается с окном "команда выполнена! Код возврата: 1"

deepred 13-08-2010 14:36 1472901

alexmoreman,

эти окна нужны только для контроля при тестировании сценария, для того чтобы от них
избавиться нужно закоментировать (поставить символ ' в начале) или удалить строки,
содержащие команды Wscript.Echo.

alexmoreman 13-08-2010 14:54 1472912

deepred,
блин незнаю в чём у меня беда.. убрал я эти строки идет запуск качалки , идут попытки соединиться с сервером то на 3 попытке то на 5 или 7 вырубается wget и все

deepred 13-08-2010 15:00 1472915

alexmoreman,


а при запуске wget из CMD также?

попробуйте применить в коде следующее изменение "cmd /c"

alexmoreman 13-08-2010 15:17 1472932

я решил проверить на другом файле, вроде пошло...
правда соединение прошло с 3 попытки
deepred , а в таком виде можно оставить код?
Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "E:\WGET\111.html"
While objIE.Busy
    WScript.Sleep 200
Wend
Set tag = objIE.Document.getElementByid("start_download_form")
Set WshShell = CreateObject("WScript.Shell")
Retval = WshShell.Run ("wget -c -t 0 http://share-nn.ru/" & _
tag.getAttribute("action") &" -O Fail.avi", 1, True)

без последней строки а то с ней ошибка лезет.
а вот ты спросил про CMD? как оно лучше
Код:

так:
Retval = WshShell.Run ("wget -c -t 0 http://share-nn.ru/" & _
tag.getAttribute("action") &" -O Fail.avi", 1, True)
или
Retval = WshShell.Run ("cmd /c wget -c -t 0 http://share-nn.ru/" & _
tag.getAttribute("action") &" -O Fail.avi", 1, True)

и вопрос cmd /c cmd это вызов командной, а вот /с это не совсем догнал (путь до качалки?)

deepred 13-08-2010 15:50 1472955

alexmoreman,

Если последний вариант у Вас работает, то можете его оставать, только в верните в конце строчку:
Код:

objIE.Quit
, internet explorer все-таки следует завершить...

cmd /c - ключ /с применяется для того, чтобы сеанс cmd не завершался по окончанию отработки команды,
я его применил только для наглядности (чтобы увидеть "слет" wget)


PS: а вариант "MSXML2.XMLHTTP" Вы не испытали?

alexmoreman 13-08-2010 16:04 1472962

хорошо щас попробую.
получается к кодом но через раз ошибка вылазает , щас вуду есчё кумекать .

alexmoreman 13-08-2010 16:35 1472986

deepred, гуру я реально туп и непонимаю откуда данный скрипт возьмёт ссылку на файл
Код:

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
StrTargetHtml = "Http://sait.ru/" & _
tag.getAttribute("action") & "/" & "Fail.avi"

oXMLHTTP.Open "GET", StrTargetHtml, 0

oXMLHTTP.Send
Set oADOStream = CreateObject("ADODB.Stream")
oADOStream.Mode = 3
oADOStream.Type = 1
oADOStream.Open
oADOStream.Write oXMLHTTP.responseBody
oADOStream.SaveToFile "F:\DL\Fail.avi", 2
WScript.Echo "Закачка завершена"

вообще просто удивительно интересно получается
создал 3 файла:
1. bat
Код:

wget -c -t 0 http://share-nn.ru/665552828 -O stranyca.html
start script.vbs

при его запуске скачивается страница и запускается vbs и выдаёт ошибку "строка: 9 символ:1"
запускаю второй bat
2.
Код:

start script.vbs
и без ошибки запускается wget и нормально начинается скачивание.
да ещё странность заметил что после запуска появляются характерные щелчки (типа как папка открывается или как страницы в браузере листаеш)
3. vbs
Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "E:\WGET\stranyca.html"
While objIE.Busy
    WScript.Sleep 200
Wend
Set tag = objIE.Document.getElementByid("start_download_form")
Set WshShell = CreateObject("WScript.Shell")
Retval = WshShell.Run ("cmd /c wget -c -t 0 http://share-nn.ru/" & _
tag.getAttribute("action") &" -O Video/Film.avi", 1, True)
objIE.Quit

у меня прям загадка а не комп))

deepred 13-08-2010 17:09 1473022

alexmoreman,

в таком виде ему её взять неоткуда (читай внимательней предыдущие посты):

Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "F:\rem\Primer.html"
While objIE.Busy
    WScript.Sleep 200
Wend
Set tag = objIE.Document.getElementByid("start_download_form")
WScript.Echo tag.getAttribute("action") ' смотрим то ли?

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
StrTargetHtml = "Http://sait.ru/" & _
tag.getAttribute("action") & "/" & "Fail.avi"

oXMLHTTP.Open "GET", StrTargetHtml, 0

oXMLHTTP.Send
Set oADOStream = CreateObject("ADODB.Stream")
oADOStream.Mode = 3
oADOStream.Type = 1
oADOStream.Open
oADOStream.Write oXMLHTTP.responseBody
oADOStream.SaveToFile "F:\DL\Fail.avi", 2
WScript.Echo "Закачка завершена"
objIE.Quit


deepred 13-08-2010 17:38 1473049

alexmoreman,

Уважаемый!!!! Не надо скачивать страницу, выставьте в мой VBS-скрипт этот inet адрес...

Откуда берется ошибка не знаю, возможно просто не успевает загрузиться страница...
Щелчки и прочее может издавать IE (хотя и не должно такого быть)

и потом: для запуска vbscript следует использовать следующий синтаксис:
Код:

wscript //logo script.vbs

alexmoreman 13-08-2010 17:39 1473050

deepred, да я сразу догадался так сделать но увы ошибка...
да бог с ней, слушай а после завершения работы в процессах не должен наверное оставаться iexplore.exe ?

deepred 13-08-2010 17:42 1473052

alexmoreman,
Цитата:

Цитата deepred
alexmoreman,
Если последний вариант у Вас работает, то можете его оставить, только в верните в конце строчку:
Код:
objIE.Quit
, internet explorer все-таки следует завершить... »

Будьте внимательней..

alexmoreman 13-08-2010 17:53 1473066

deepred, я сделал как ты и сказал , строка objIE.Quit там давно уже тусит.
вот так сейчас подрубилась изумительно
Код:

wget -c -t 0 http://share-nn.ru/665552828 -O stranyca.html
wscript //logo script2.vbs

по завершению работы гляну в процессы.
Низкий тебе сердечный поклон, за проделанную работу!
Плохо что в своё время не пошел учиться, а щас после аварии , только дома обложившись книгами да с вашей помощью.
Ещё раз спасибо.

alexmoreman 13-08-2010 18:18 1473083

deepred,
Цитата:

Не надо скачивать страницу, выставьте в мой VBS-скрипт этот inet адрес...
как понимаю это так?
Код:

было
objIE.Navigate "F:\rem\Primer.html"
станет
objIE.Navigateinet "http://share-nn.ru/665552828"

deepred, подвожу предварительный итог, задача ради которой создавалась тема решена с вашей помощью.
Проблема с закрытием iexplore так и не решилась строкой objIE.Quit. Но не беда, убиваю процесс в диспетчере задач.
Второй способ пока не работает, по мере проб и ошибок о результатах отпишу в личку.
Ещё раз огромное спасибо за проделанную работу!
Задача решена.


Время: 17:08.

Время: 17:08.
© OSzone.net 2001-2025