Найти на веб-странице текст href и скачать по ссылке

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем alex_diablo, 27 июн 2016.

  1. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    доброго времени суток.
    есть следующая задача:

    имеем страницу: Unity - Unity QA - Patch Releases

    нужно написать скрипт, который будет искать на странице адрес для скачивания файла.
    поясню: есть ссылка http://beta.unity3d.com/download/2f...5p5.exe?_ga=1.192374762.1548665087.1441112791


    из этой ссылки нам нужно записать в переменную только: 2fb591d65635

    у каждой версии файла этот 12-символьный код произвольный, поэтому нам нужно его находить таким образом: у нас есть переменная UnitySetup64-5.3.5p5.exe

    далее скрипт должен на странице найти строку, где указан этот файл и из пути выдернуть тот 12-символьный код, который в данном урле.

    надеюсь, понятно объяснил суть.


    п.с. пробовал через wget скачать страницу и локально через findstr искать нужный урл по маске: UnitySetup64-5.3.5p5.exe. далее строку записывал в файл.
    но не знаю, как правильно записать в переменную всю строку (и убрать все лишнее, кроме необходимых 12 символов.)
     
    Последнее редактирование: 27 июн 2016
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Здравствуйте!

    У меня почему-то именно эту страницу выводить не хочет:

    Код (Text):
    wget -q -O- https://unity3d.com/ru/unity/qa/patch-releases/
    Какие вы ключи используете?
     
  3. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    хм... без всяких ключей у меня все скачивается...
    Код (Text):
    wget https://unity3d.com/ru/unity/qa/patch-releases
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Разобрался. У меня ругалось на сертификат. А у Вас ради интереса, какая версия wget?
    Можете в ЛС скинуть EXE-шник?
     
  5. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Обе разрядности Unit нужны или одна?
     
  7. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    пока что используется только х64
     
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Так попробуйте:

    Код (DOS):
    @echo off

    set "command=wget -q --force-html -O- --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate https://unity3d.com/ru/unity/qa/patch-releases/"

    for /f UseBackQ^ tokens^=2^ delims^=^" %%a in (`%command% ^| find /i "UnitySetup64"`) do (
      wget --tries=3 --connect-timeout=5 --retry-connrefused --continue --no-check-certificate "%%a"
      goto end
    )
    :end

    pause
     
  9. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    скрипт работает, спасибо. но не совсем так, как нужно. попробую пояснить.
    сам файл по ссылке этой http://beta.unity3d.com/download/2fb591d65635/Windows64EditorInstaller/UnitySetup64-5.3.5p5.exe скачиваться не должен.

    к примеру, вышла новая версия Unity, допустим это будет: 5.3.6р1
    тогда урл на скачивание этого файла будет иметь вид: http://beta.unity3d.com/download/************/Windows64EditorInstaller/UnitySetup64-5.3.6p1.exe
    где ************ - уникальная сгенерированная комбинация символов. для каждой ссылки они соответственно разные.
    мы задаем переменную по маске для поиска:
    Код (Text):
    set ver=5.3.6р1
    далее скрипт по маске
    Код (Text):
    unitysetup64-%ver%.exe
    должен нам найти данный урл и в переменную (например url) записать то значение, которое на месте звездочек.
    т.е. вот для версии 5.3.5р5 , скрипт должен на странице найти ссылку: http://beta.unity3d.com/download/2fb591d65635/Windows64EditorInstaller/UnitySetup64-5.3.5p5.exe
    и выцепить из нее только символы: 2fb591d65635 и записать их в переменную url.
    вот как то так...
     
    Последнее редактирование: 28 июн 2016
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Код (DOS):
    @echo off
    SetLocal EnableExtensions

    set "ver=5.3.5p5"
    set "bit=UnitySetup64"

    set "command=wget -q --force-html -O- --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate https://unity3d.com/ru/unity/qa/patch-releases/"

    for /f UseBackQ^ tokens^=2^ delims^=^" %%a in (`%command% ^| find /i "%bit%" ^| find /i "%ver%"`) do (
     rem echo "%%a"
      for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
      goto end
    )
    :end

    echo %url%

    pause
    exit /B
     
     
  11. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    отлично! спасибо! то что нужно
     
  12. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    вопрос касательно 1 варианта скрипта: как заставить wget выкачивать файл в сетевую шару? например в: \\file_server\soft\unity
     
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Код (Text):

    wget -P "\\file_server\soft\unity" -O index.html https://unity3d.com/ru/unity/qa/patch-releases/
     
    или
    Код (Text):

    wget -O "\\file_server\soft\unity\index.html" https://unity3d.com/ru/unity/qa/patch-releases/
     
     
  14. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    не актуально.

    up:

    нужно дописать возможность указания в поиске другой версии, если вдруг такая версия не найдена.

    и еще: у нас сделан поиск только на странице Unity - Unity QA - Patch Releases

    было бы здорово искать по всем страницам, т.к. искомая версия может быть старой и соответственно, находиться на другой странице:

    например:
    HTML:
    https://unity3d.com/ru/unity/qa/patch-releases
    https://unity3d.com/ru/unity/qa/patch-releases?page=2
    ...
    https://unity3d.com/ru/unity/qa/patch-releases?page=20
    и т.д.
     
    Последнее редактирование: 29 июн 2016
  15. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Может, дополнительно вывести перечень доступных версий (если не была найдена искомая) и предложить ввести одну из них ?
    --- Объединённое сообщение, 29 июн 2016 ---
    Такое?

    Код (DOS):
    @echo off
    SetLocal EnableExtensions

    set "ver=5.3.6р1"
    set "bit=UnitySetup64"

    :: временная папка для скачивания html (не указывайте закрывающий слэш)

    set tmpFolder=.

    set "UnityURL=https://unity3d.com/ru/unity/qa/patch-releases/"

    wget -q --force-html -P "%tmpFolder%" -O "index.html" --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate %UnityURL% || (
      echo Не удалось скачать страницу.
      pause >NUL
      exit /B
    )

    :begin
    cls
    echo Unity3D Downloader
    echo.
    echo Список доступных версий:
    echo.
    for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| find /i "%bit%"') do (
      for /f "tokens=6 delims=/" %%b in ("%%a") do (
        for /f "tokens=2 delims=-" %%c in ("%%b") do set /p "=%%~nc - "<NUL & for /f "tokens=4 delims=/" %%b in ("%%a") do echo %%b
      )
    )
    echo.
    echo Выбрана: %ver%
    echo.
    for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| find /i "%bit%" ^| find /i "%ver%"') do (
    rem echo "%%a"
      for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
      goto end
    )
    :end
    if defined url (
      echo Код для скачивания: %url%
    ) else (
      set /p "ver=Версия не найдена! Введите новую: "
      goto begin
    )
    echo.
    pause
    unity1.png unity2.png
     
  16. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    немного конкретизирую: было бы здорово, чтобы на первоначальном этапе можно было выбрать: прописать нужную версию вручную, либо чтобы сразу вывелся список всех доступных версий. только поиск должен проводиться по всем имеющимся там страницам.
    далее - если ищем вручную и нужная версия существует -> присваиваем искомый код переменной %url%
    если такой версии не существует, выдается сообщение, что такая версия не найдена и выдается список всех найденных версий.
    если же изначально выбираем показать все имеющиеся версии - то сразу выводить список версий.
    в списке нужно сделать возможность выбора версии. если возможно - по нажатию цифры, соответствующей пункту в списке. либо ввод вручную, если список длиннее.
    вообще в идеале - сделать возможность постраничного отображения списка, чтобы не было длинной простыни. ну и навигация вперед-назад. если такое возможно.
    ну и в итоге - по нажатию пункта в меню - переменной %url% также присваивался бы искомый код.

    :Blush2:
     
  17. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    По моему на сайте всё сделано именно так как Вы просите: не простыня и навигация вперед-назад :)
    --- Объединённое сообщение, 29 июн 2016 ---
    Я бы тут побеспокоился о немного другом: там 22 страницы и если их перекачивать это займёт ~ 60 секунд.
    Можно завести рядом списочек уже полученных ссылок (если учесть что гиперссылка для старых версий не изменяется), тогда будет достаточно скачивать только первую страницу для обновления списка базы данных, при учёте конечно что вы хотя бы раз в месяц будете запускать скрипт.
     
  18. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    навигация действительно сделана. это факт) можно было бы и не заморачиваться со скриптом вообще, а просто заходить на сайт, смотреть, какие версии есть и оттуда же качать то, что там есть)
    проблема кроется в другом. по-умолчанию, там можно скачать только основной установочный файл и установщик дополнительных компонентов. дополнительные компоненты можно установить, предварительно установив ассистент. там можно выбрать уже нужные компоненты.
    задача стоит как раз в том, чтобы автоматизировать процесс поиска новой вышедшей версии и скачивание всех необходимых установочных файлов, включая компоненты.

    вот например, для версии 5.3.5р5 ссылки на эти файлы компонентов выглядят так:

    http://beta.unity3d.com/download/2f...ySetup-Android-Support-for-Editor-5.3.5p5.exe
    http://beta.unity3d.com/download/2f...UnitySetup-Mac-Support-for-Editor-5.3.5p5.exe
    http://beta.unity3d.com/download/2f...UnitySetup-iOS-Support-for-Editor-5.3.5p5.exe
    http://beta.unity3d.com/download/2f...ySetup-Windows-Support-for-Editor-5.3.5p5.exe

    как вы можете видеть, находятся они совсем по другому пути. единственное, что их объединяет с сылкой, которую мы ищем в скрипте, это тот код, который мы как раз и ищем.
    но узнать мы его можем только с той самой страницы, с которой и ведем поиск :)

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

    конечно, можно зайти на сайт, пробежаться по страницам, потом в скрипте указать нужную страницу. но хотелось бы чтобы все было в одном месте и сразу :)

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

    вот как то так :)


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

    на практике такое может понадобиться редко, т.к. в основном искомая версия известна, как правило качаются новые и они всегда на гл. странице. но раз в пятилетку и палка хочет выстрелить. так что если мы можем ее заставить это сделать - было бы здорово! )
     
    Последнее редактирование: 29 июн 2016
  19. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    А Вы учитываете тот факт, что для старых версий имя файла может отличаться?

    См. (это полный перечень из всех 22 страниц):

     
  20. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    да, немного меняется шаблон имени файла... но в целом там одинаково присутствуют: UnitySetup (32 или 64) - это касаемо версий, начиная с 5.х.х.
    Версии 4.х.х были все 32 битные. поэтому шаблон имени файла у них другой.
    в принципе... старые версии по большому счету, все выкачаны уже, так что действительно наверное не имеет смысла шерстить все страницы.
    но в таком случае, что неплохо было бы сделать:
    чтобы при запуске скрипта сразу выводился список доступных для скачивания версий с 1 страницы с возможностью по нажатию соответствующего пункта в списке выбрать эту версию;
    далее, чтобы на локальном сервере (\\fileserver\unity) выполнялся поиск, вдруг эти файлы уже скачаны:

    например:

    запустили скрипт, он вывел список всех доступных для скачивания.
    выбираем версию , скажем - 5.3.5p5

    далее скрипт смотрит на шаре, не скачан ли этот файл уже (если файл уже существует - он в теории должен находиться по адресу: \\fileserver\unity\5.3.5р6\UnitySetup64-5.3.5p5.exe)
    там же должны быть и компоненты:

    UnitySetup-Android-Support-for-Editor-5.3.5p5.exe
    UnitySetup-Mac-Support-for-Editor-5.3.5p5.exe
    UnitySetup-iOS-Support-for-Editor-5.3.5p6.exe
    UnitySetup-Windows-Support-for-Editor-5.3.5p5.exe

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

    если же такой версии еще нет на шаре, нужно создать папку 5.3.5р6 и туда закачать 5 файлов:

    непосредственно основной инсталлер

    http://beta.unity3d.com/download/2fb591d65635/Windows64EditorInstaller/UnitySetup64-5.3.5p5.exe

    и 4 используемые компонента (на самом деле их больше там, но испольются только эти)

    http://beta.unity3d.com/download/2f...ySetup-Android-Support-for-Editor-5.3.5p5.exe
    http://beta.unity3d.com/download/2f...UnitySetup-Mac-Support-for-Editor-5.3.5p5.exe
    http://beta.unity3d.com/download/2f...UnitySetup-iOS-Support-for-Editor-5.3.5p5.exe
    http://beta.unity3d.com/download/2f...ySetup-Windows-Support-for-Editor-5.3.5p5.exe

    при попытке закачать уже существующую версию (только если вдруг ее нет вообще на сервере) - выдать что-то типа: данная версия уже есть.
    если вдруг каких-то файлов не хватает, то их докачать.

    ну и было бы неплохо результат скачивания записать в лог-файл (который лежал бы там же рядом)

    слишком нагло и сложно?
     
    Последнее редактирование: 1 июл 2016

Поделиться этой страницей