Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 256
Благодарности: 64

Профиль | Отправить PM | Цитировать


Парсинг и проблемы устойчивость ссылок.
Скрытый текст
Устойчивость ссылок

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

например сайт
http://www.softpedia.com/
каждый день, час обновляется, некий продукт обновился - отдельная страница для этого продукта обновляется, на этой странице обновляется версия, формируется новая ссылка на новый продукт.

вот, на 22.02.18 я выловил на этом сайте интересную для меня программу:
Wise Anti Malware
http://www.softpedia.com/get/Securit...-Malware.shtml
скачаем эту страницу и поглядим, где расположена строка, показывающая версию:
Код: Выделить весь код
var spjs_prog_version="1.2.6.68 Beta";
и эта ссылка навечно! навсегда! пока программисты, разрабатывающие сайт Softpedia не изменят саму структуру сайта.
а оно им надо? думаю, нет.

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

еще пример:
Telegram Desktop
http://www.softpedia.com/get/Interne...-Desktop.shtml
строка версии:
Код: Выделить весь код
var spjs_prog_version="1.2.14";
эта устойчивость в большинстве случаев распространяется на всё!
можно логически понять, люди, разрабатывающие некий продукт, в меньшей степени заботятся об красоте своего сайта, на котором расположены ссылки для скачивания этого продукта.
конечно, есть вариант некоего ребрендинга, импульса перестройки сайта для красивости и удобства.
такая перестройка сайта ведет к потере размещения ссылок, которые мы выловили.

Парсинг

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

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

вернусь к сайту Softpedia.

Telegram Desktop
страница донора (в терминах )
http://www.softpedia.com/get/Interne...-Desktop.shtml

поисковое выражение:
Код: Выделить весь код
var spjs_prog_version=
сам парсинг выглядит так:
начинаю читать (скачивать страницу донора), используя поисковое выражение. чтение идет в файл (он мусорный, по окончании работы обновлятора удалится)
этот файл тоже неизменный:
down.txt

вот команда парсинга:
Код: Выделить весь код
("%~dp0..\Scripts\wget.exe" -q -O- "http://www.softpedia.com/get/Internet/Chat/Instant-Messaging/Telegram-Desktop.shtml" | findstr /R /C:"var spjs_prog_version=") >"%~dp0down.txt"
в файле down.txt строка:
Код: Выделить весь код
var spjs_prog_version="1.2.14";
и вообще парсинг в обновляторе сделан в виде блока. есть переменные донора, поисковых выражений.
работа блока парсинга заканчивается созданием переменных (с неизменными именами) в которых будут прямые ссылки на скачивания или строка версии.

файл down.txt содержит отпарсенные строки. в идеале хорошо иметь одну строку. но обычно таких строк много.
например парсим ссылки на дистрибутивы для х86 и х64 версий. ссылки разные, значит и строки будут разные.
конечно, можно сузить поиск и отпарсить отдельно ссылку на х86, включая в поисковые выражения упоминания об х86.
потом еще раз парсить ту же страницу уже с другими поисковыми выражениями.

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

если уже есть прямые ссылки на дистрибутивы, пример Yandex:
https://download.cdn.yandex.net/brow.../ru/Yandex.exe
использование тернета такое:
- проверили необходимость скачивания
- если файл по ссылке (его размер) не равен нашему файлу в ячейке - его скачиваем!
остальные действия по определению версии и протчее - тернет не нужен!

еще пример. WinRar

страницы, где имеются ссылки на х86 и х64 разные.
http://www.win-rar.com/postdownload.html?&L=4
http://www.win-rar.com/postdownload....&Version=64bit
тут интересно, если эти ссылки открыть в браузере, то он предложит скачать уже готовый дистрибутив (сработал внутренний парсер на офсайте)
но для нас эта такая же страница, на которой есть реальные ссылки на скачивание!

поисковая строка такая:
Код: Выделить весь код
winrar-versions
после парсинга получим в файле down.txt такую строку:
Код: Выделить весь код
<span><a href="https://www.win-rar.com/fileadmin/winrar-versions/winrar/wrar550ru.exe" class="postdownloadlink">нажмите здесь</a></span>
Обработка результатов парсинга

после парсинга имеем файл down.txt в котором есть одна или несколько строк.
используем ранее рассмотренный принцЫп устойчивости ссылок.

WinRar
в выше приведенной строке интересующая нас ссылка располагается между первым появлением символа " и заканчивается вторым появлением символа "

(открою хитрость, разделитель " очень опасен для поисковых выражений, он заменяется на +++ путем использования при парсинге не простой утилиты wget.exe, а более навороченной http2cli.exe)

используем сл. команду:
Код: Выделить весь код
FOR /F "usebackq tokens=2 delims=+++" %%a in ("%~dp0down.txt") do set "g1=%%a"
в переменной %g1% будет прямая ссылка на дистрибутив:
https://www.win-rar.com/fileadmin/wi.../wrar550ru.exe

если выйдет новая версия архиватора, то по принцЫпу устойчивости ссылок при всех тех же поисковых выражений и команд у нас в итоге в переменной %g1% будет прямая ссылка на дистрибутив!
пусть он будет другим, к примеру:
https://www.win-rar.com/fileadmin/wi.../wrar566ru.exe
но ссылка будет всегда!

вернусь к Telegram Desktop

в файле down.txt строка:
Код: Выделить весь код
var spjs_prog_version="1.2.14";
ищем всё между первым появление символа = и заканчиваем поиск появлением символа ; всё пишем в переменную версии %f%
это: "1.2.14"
далее отрезаем по одному символу вначале и конце.

команды такие:
Код: Выделить весь код
FOR /F "usebackq tokens=2 delims==;" %%a in ("%~dp0down.txt") do set f=%%a
set f=%f:~1,-1%
в переменной %f% будет такая строка: 1.2.14

на 22.03.14 это самая новая версия Telegram Desktop

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

я специально ввел слова ТЕОРИЯ и концепция .. Теория Идеальной Сборки, концепция ячейки.
это не есть ИСТИНА, это есть вИдение некой недостижимой ИСТИНЫ мною.


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

много сайтов, помимо ссылок на дистрибутив, выделяют версию этих дистрибутивов. типа так: вот ссылка на дистрибутив, а вот версия этого дистрибутива. качайте!

однако, есть сайты, где есть ссылка на файл, но нет упоминание об версии. и нет от слова вообще

пример. наш любимый Яндекс.Браузер
https://browser.yandex.ru/

ссылка на дистрибутив есть, версию этого дистрибутива вижу, на 22.03.18 она такая: версия 18.2.1
но попробуйте пропарсить эту версию, её нет! она динамически показывается на странице, используя джава-вызовы из самого офсайта.
как быть?

путь первый. я назвал его нечестным и ячейка, в которой версия инсталлятора получена таким способом - эта нечестная ячейка.

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

итак. используем огромные интеграторы программ.

например
Softpedia
http://www.softpedia.com/

или такой сайт:
http://www.majorgeeks.com/

страницы, описывающие наш Яндекс.Браузер на таких интеграторах неизменны:
http://www.majorgeeks.com/files/deta...x_browser.html
http://www.softpedia.com/get/Interne...-Browser.shtml

получить версию, пропарсив эти ссылки довольно леххко.

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

версию можно получить из самого дистрибутива! она там зашита! попробуйте на чём-либо исполняемом нажать ПКМ, свойства, закладка Подробно, смотрим строку Версия файла.

тактика такая:
- скачиваем дистрибутив (если он поменялся)
- и путем использования небольшой утилиты от мелко-софта filever.exe получаем версию.

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

еще один способ.
версия имеется в ссылках на дистрибутивы!

например Evernote
https://evernote.com/intl/ru/download

ссылка на дистрибутив:
https://cdn1.evernote.com/win6/publi....10.3.6921.exe

порядок действия таков:
- пропарсили донорскую ссылку:
https://evernote.com/intl/ru/download
- выделили ссылку на дистрибутив:
https://cdn1.evernote.com/win6/publi....10.3.6921.exe
- обработали эту ссылку:
прочитаем её после первого появления символа _ до конца строки:
6.10.3.6921.exe
уберем 4 символа с конца .exe и получим версию:
6.10.3.6921

завтра, через неделю будет новая версия этого продукта, она будет выглядеть так (к примеру):
https://cdn1.evernote.com/win6/publi....16.6.6666.exe

вид ссылки неизменен! и обработка и получение версии останется прежней!

еще пример. Tor Browser
получаем инсталлятор через FTP. есть прямые ссылки через офсайт, но они порой запаздывают с новинками. вышла новая версия, её все обсуждают, но на офсайте всё еще старая версия.
некоторые ячейки есть в таких 2-х вариантах. один вариант получение инсталлятора через офсайт, другой через FTP.

итак, ссылка:
https://dist.torproject.org/torbrowser/

поисковое выражение:
Код: Выделить весь код
href.*[0-9][.].[^a-b]
поясню это поисковое выражение:
- ищем строки, в которых есть символы: href
- потом идут любые символы: .*
- потом идет любая цЫфра: [0-9]
- потом точка [.]
- потом любые символы, кроме символов из диапазона a-b (т.е это цЫфры 0-9 и точки .): .[^a-b]

итого, пропарсив с такими данными в файле down.txt получим сл. строки:
Код: Выделить весь код
<img src="/icons/folder.gif" alt="[DIR]"> <a href="7.5.1/">7.5.1/</a>                  2018-03-12 21:45    -
<img src="/icons/folder.gif" alt="[DIR]"> <a href="7.5.2/">7.5.2/</a>                  2018-03-17 01:06    -
далее просто, берем последнюю строку, выделяем из неё версию в переменную %f%:
Код: Выделить весь код
FOR /F "usebackq tokens=6 delims=>/" %%a in ("%~dp0down.txt") do set f=%%a
и соответственно прямая ссылка на дистрибутив переменная %g1%::
Код: Выделить весь код
set "g1=https://dist.torproject.org/torbrowser/%f%/torbrowser-install-%f%_ru.exe"
далее блок скачки (если это необходимо) дистрибутива ..

Структуризация ячеек. Группы
Скрытый текст
в хорошей сборке может быть не одна сотня ячеек. Представляете, как трудно будет работать с таким списком, что обновить, что установить.

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

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

Группа

каждая ячейка в себе содержит файл group.txt (и в этом файле в одну строку прописано число - номер группы)
Номер группы - число от 0 до .. думаю, предела нет
Группы нумеруются по порядку!
по-умолчанию 0 - это неправильная группа (если в ячейке нет файла group.txt, то при фазировании сборки этой ячейке присвоится номер группы 0)

в сборке есть файл All-Group.txt (он расположен в папке, где находятся все наши ячейки, по умолчанию эта папка Install)
первая строка этого файла строго фиксирована:
Код: Выделить весь код
[Group]
и далее по списку:
Код: Выделить весь код
номер группы = описание группы (не увлекайтесь описанием)
вот содержимое файла All-Group.txt моей сборки Все Браузеры:
Код: Выделить весь код
[Group]
0=- неправильная группа-
1=-- Браузеры на основе Firefox
2=-- Браузеры на основе Chromium
3=-- Браузеры на основе Internet Explorer
4=-- Комбо-Браузеры (много-движковые)
5=-- Браузеры : Opera
6=-- Браузеры : Yandex
7=-- Браузеры : Экзотика и собственные движки
8=-- Браузеры в архиве (без инсталляции)
9=-- Online Браузеры (интернет-установка полной версии)
99=-- Выход / Перезагрузка
в каждой ячейке нашей сборки содержимое файла group.txt должно соответствовать нужному номеру
например ячейка Maxthon5 Ru и там в файле group.txt число 4

если в этом файле прописано число вне нашего диапазона, например 10, то ячейка не будет участвовать в фазах и не попадет в списки

приведу пример группирования

сборка BELOFF 2018 [Ru]
Код: Выделить весь код
[Group]
0=Системa | Компоненты
1=Microsoft Office 2003
2=Microsoft Office 2007
3=Microsoft Office 2010
4=Microsoft Office 2013
5=Microsoft Office 2016
6=Текст | Перевод
7=Офис | Учёба
8=Архивация | Распаковка
9=Установка | Удаление
10=Файловые Менеджеры | Редакторы Ресурсов
11=Информация и Диагностика ПК | ОС
12=Обслуживание HDD | SSD
13=Обслуживание ОС
14=Виртуальные машины
15=Графика | Дизайн
16=Графика
17=Медиа | Кодеки
18=Медиа | Плееры
19=Медиа | Редакторы
20=Медиа | Конвертеры
21=DVD | ISO | USB
22=Общение | Почта
23=Интернет | Сети
24=Скачивание | Загрузка
25=Мини-Игры
26=Интерфейс | Гаджеты
27=Скринсейверы | Обои
28=Браузеры
29=Безопасность
30=3Planesoft
31=Завершение
MInstAll v.16.03.2018 By Andreyonohov & Leha342 [Ru]
Код: Выделить весь код
[Group]
0=АКТИВАЦИЯ :
1=СИСТЕМНЫЕ :
2=ОБСЛУЖИВАНИЕ ОС :
3=ИНТЕРНЕТ :
4=БРАУЗЕРЫ :
5=ГРАФИКА :
6=ТЕКСТОВЫЕ РЕДАКТОРЫ :
7=ОФИС :
8=ИНТЕРФЕЙС :
9=ИГРЫ :
10=КОДЕКИ :
11=ПЛЕЕРЫ :
12=DVD-BLU-RAY ISO :
13=АРХИВАТОРЫ :
14=ИНФОРМАЦИЯ :
15=ФАЙЛОВЫЕ МЕНЕДЖЕРЫ :
16=РЕДАКТОРЫ РЕСУРСА :
17=ИНСТАЛЛЯЦИЯ :
18=УДАЛЕНИЕ :
19=КОНВЕРТЕРЫ :
20=МЕДИА РЕДАКТОРЫ :
21=ЗАПИСЬ :
22=ОБСЛУЖИВАНИЕ HDD-SSD :
23=ВИРТУАЛЬНЫЕ МАШИНЫ :
24=ДРАЙВЕРЫ :
25=MICROSOFT OFFICE  2003 :
26=MICROSOFT OFFICE  2007 :
27=MICROSOFT OFFICE  2010 :
28=MICROSOFT OFFICE  2013 :
29=MICROSOFT OFFICE  2016 :
30=БЕЗОПАСНОСТЬ :
31=ЗАВЕРШЕНИЕ :
вот моя расширенная (оставлены лакуны, если наступит острая нужда добавить еще одну группу):
Код: Выделить весь код
[Group]
0= - неправильная группа-
1= - CD-DvD-ISO : Burn
2= - CD-DvD-ISO : Copy
3= - CD-DvD-ISO : ISO
4= - CD-DvD-ISO : Virtual
5= -
6= - Drv : DrvPack
7= - Drv : Drv-Update
8= - Drv : Tools
9= - Drv : Mobile
10= -
11= - DeskTop : Calendar-DockBar-Widget
12= - DeskTop : Scr
13= - DeskTop : Tools
14= -
15= - Grafics : Edit
16= - Grafics : Snapshot
17= - Grafics : View
18= - Grafics : Toolz
19= -
20= - HDD : Defrag
21= - HDD : Manager
22= - HDD : Tweak
23= -
24= - File : Archive
25= - File : BackUp
26= - File : Dublicate
27= - File : FileManager
28= - File : Rename
29= - File : Search
30= - File : Synchro
31= - File : Tools
32= -
33= - Lan : Manager
34= - Lan : Remote
35= - Lan : Toolz
36= -
37= - I-net : Browzer
38= - I-net : Chat
39= - I-net : Cloud
40= - I-net : DC-FTP
41= - I-net : DefenZe
42= - I-net : Download
43= - I-net : Mail
44= - I-net : Toolz
45= - I-net : Torrent
46= - I-net : TV-Radio
47= -
48= - Media : Codecs
49= - Media : Edit
50= - Media : Encoder
51= - Media : Player
52= - Media : Toolz
53= -
54= - Office : Big-Pack
55= - Office : DJV-DWG-AutoCAD-Kompas
56= - Office : Edit
57= - Office : Font
58= - Office : Organize
59= - Office : PDF
60= - Office : Reader
61= - Office : Russ-ClipBoard
62= - Office : Scan
63= - Office : Translate
64= -
65= - Recovery : Password
66= - Recovery : Recovery
67= -
68= - USB-Flash : Defenze
69= - USB-Flash : Install
70= - USB-Flash : Manager
71= -
72= - Games
73= -
74= - System : Ms-Patch-Dx-Update
75= - System : Clear
76= - System : Toolz
77= - System : Tweak
78= - System : UnInstall
79= - System : Test
80= -
81= - DefenZe : Avir
82= - DefenZe : FireWall
83= - DefenZe : Scan
84= - DefenZe : Toolz
85= -
86= - Win7-8-10 : Crack
87= - Win7-8-10 : StartMenu
88= - Win7-8-10 : Tools
89= -
99= - Выход / Перезагрузка

Последний раз редактировалось wadimus, 22-03-2018 в 20:13.


Отправлено: 15:28, 22-03-2018 | #2