Что позволяет обработка: 1) посмотреть структуру HTML-страницы; 2) настроить интерпретацию узлов так, чтобы прочесть данные в таблицу значений; 3) с определённой степенью надёжности делать постоянные настройки чтения; 4) обрабатывать прочитанное произвольным алгоритмом.
Всё началось с необходимости загрузить данные с Яндекс.Маркета. Нашёл было пару обработок, да вот беда — они устарели и нормально не читают, потому что на яндексе уже другие теги, чуть-чуть другая разметка, и всё. И хоть делай заново. Потом я подумал: структура DOM, пусть в самом общем виде, может быть прочитана. И, значит, маркирована так, чтобы дать понять обработке, откуда брать данные. Тут, правда, обнаружился неприятный сюрприз (из-за которого, в общем, полезность моей разработки существенно падает) – уникальная идентификация большинства узлов структуры страницы невозможна. Не по чему их идентифицировать, к сожалению. Поэтому все предлагаемые для примера настройки – с известной степенью точности. Может понадобиться доработка настроек «напильником». Но именно настроек, а не обработки как таковой. Так что теперь, пусть Яндекс.Маркет меняет формат данных хоть раз в неделю. 5 минут подстройки – и можно опять грузить нужные данные.
Обработка – не то чтобы «готовое решение», а инструмент. Позволяет «пристреляться» к странице и сайту. Позволяет малыми усилиями обеспечить разовое, а чуть большими – постоянное чтение данных с сайта. Для примера к публикации прилагаю настройки, демонстрирующие работу с несколькими общеизвестными сайтами.
UPD: Добавлена возможность пакетного чтения и загрузки с нескольких страниц, имеющих однотипные URL. Предусмотрен шаблон или произвольный алгоритм для получения URL, задание границ цикла. Добавлена форма настройки и справка по ней.
UPD 2: В версии 1.5 добавлена возможность «идти глубже». Если есть ссылка — задайте настройку для чтения той страницы, куда эта ссылка ведёт, и обработка автоматически прочитает и её содержимое тоже. Глубина погружения теоретически любая (на практике 3 уровня работают ОК). Зачем это: например, на том же Яндексе нужна детализация (со страницы конкретного товара), т.е. большая картинка, характеристики и тд. Теперь это возможно без особенных усилий, главное — 1 раз сделать настройки чтения. Результаты представляются как таблицы значений внутри ячеек более «общих» таблиц значений. В архиве ParsInto находятся 3 файла для Яндекс-Маркета — настройка чтения списка товаров, настройка чтения карточки товара (шаг №1, из списка) и настройка чтения характеристик (шаг № 2, из карточки). Ахтунг! Пути, указанные в полях, надо будет переписать под ваш случай, имена файлов можно не менять. В справку обработки внесены сведения о том, как это делается.
Работает эта штука на асинхронной загрузке, поэтому может эффектно выкобениваться с точки зрения интерфейса, но у меня стабильно даёт нормальный результат.
UPD: Доделал пакетную загрузку по ссылкам, многостраничную загрузку. Сделана возможность ручной «добивки» неудачно загруженных данных по ссылкам. Повышена избирательность загрузки, точность считывания при одинаковых свойствах ветви. В модуль добавлены полезняшки для работы с html. Исправлена пара багов.
Кто найдёт баги/глюки — пожалуйста, сообщайте, это приветствуется! Буду исправлять оперативно.
UPD: Добавил версию для чтения именно html-таблиц, в ячейках которых маленькие подветки dom-объектов как деревья значений. Всё в виде таблиц значений, структур и прочая, для желающих написать свой механизм настроек интерпретации или просто использовать для прямого чтения, или как пример. В отличие от первой обработки, использует не DOM через ActiveX окна, а штатные средства 1С (построитель DOM).
Как-то не универсально.
(1) Ох ты ж блин, не ту версию выложил. Ща, поправлю, спасибо!
(1) Залил правильный файл. Ещё раз спасибо.
Кстати, у обработки есть довольно подробная встроенная справка по F1. Надеюсь, написано удобоваримо.
Парсятся только сайты без авторизации?
(4) По идее да, но если авторизация успешно пройдена и браузер физически отображает страницу, то, насколько знаю, объектная модель доступна. Вот скачивание по ссылкам (например, картинок) может не получиться, т.к. GET-запрос у меня безо всякой авторизации.
А будет ли она грузить с «закрытого» раздела сайта, необходимо «подпихнуть» сайту сертификат и вылить инфу.
Если не требуется детальный парсинг, а нужно получить одно-два-три значения из большого HTML, то проще использовать следующую функцию (пример в комментарии):
Показать
Отличный механизм. Ещё бы автоматизировать пакетное считывание )
чтобы можно было перебирать однотипные страницы автоматом
Например можно дать возможность пользователю самому формировать код перебора страниц (произвольным алгоритмом)
например страниц вида infostart.ru/public/167437/files/?fduser=yes#users_download
Ошибка при создании СКД: {ВнешняяОбработка.ПолучениеДанныхИзHTML.МодульОбъекта(443)}: Метод объекта не обнаружен (ПревращениеИмениВНаименование)
Классная обработка!
Нужен был парсер как-то, для сбора инфы и потом выгрузки ее на сайт, написал. Когда рассказал знакомым программерам, что парсер на 1С написан, долго смеялись. Но работало без отказно. Парсер работал месяц без остановки. :)) Новое применение 1С
(11) «долго смеялись» — это явно не программисты 1С.
1С 8 рулит 🙂
Скоро будет робот поисковик, написанный на 8-ке 🙂
(11) spleen, тут всё зависит от задачи. Когда то делал обработку по сравнению различных файлов Excel на 7.7 хотя собственно 1С там была не при делах (просто было быстрее сделать так, а надо было срочно…) А один раз нужно было срочно сделать парсер, а 1С не было… Пришлось сделать на базе Excel и его встроенного VB )
(13) Ibrogim, Просто сам по себе 1с не для этого. Но, как показывает практика, скорость написания парсера на 1с не больше чем на php. А с учетом отладчика, думаю даже быстрее. Да простят меня php developers. ;)))))
Хорошая штука. Самому иногда приходится подобным заниматься.
(8) Делаю, как раз такой механизм листания по страницам.
(9) Поправил, перезалил. Приношу извинения за невнимательность свою.
Ошибка ОбщегоНазначения.ПревращениеИмениВНаименование = нет в стандартном модуле Общего назначения такой процедуры…..
(17) Вы файл когда качали? Скачайте заново, давно уж пофиксено.
Очень нужен видеофайл с примером формирования настроек!!!!
(19) Хммм. Только после Нового Года, к сожалению. А что, справки к обработке всё же недостаточно? 🙁
Очень кстати,спасибо.
Отличная тема. Давно хочу занятся автопоиском в инете. Жирный плюс.
Автор молодец, идея обработки хорошая, мыслите в правильном направлении.
Попробовал настроить скажем дляrosohot.ru и salmoru.com , в обоих случаях получились затруднения. Если будет интересно, могу прислать настройки *dst, в которых это видно.
Оба сайта свёрстаны почти без идентификаторов. На rosohot максимум получается выдрать картинку и таблицу характеристик, а тэг DIV, в котором находится описание товара не попадает в СтрокуТаблицы, в которую входит картинка и негде разместить ещё одну директиву СтрокаТаблицы.
На salmoru удаётся выдрать опять таки всё кроме описания. Это потому что описание находится в тэге DIV, вложенном в корневой тэг DIV. И негде разместить все три (!) директивы НачалоТаблицы, СтрокаТаблицы и СтроковаяКолонка. Я вижу два пути: либо дать возможность считать НачаломТаблицы весь документ, либо сделать что-то вроде микса СтрокиТаблицы и СтроковойКолонки в одной директиве…
Ну и, конечно, жаль, что на сайтах без идентификаторов добавляется столько паразитных колонок… Может быть, предусмотреть указывать глубину вложения, порядковый номер подчинённого элемента среди дочерних, название колонки…
Зато радует гибкость 🙂
Я правильно понимаю, что если нужен переход по ссылкам на странице (переход внутрь элемента), то это пока нельзя сделать?
(23) Да, с такими сайтами беда, очень трудно их однозначно читать. Согласен, сделаю, чтобы без директивы «НачалоТаблицы» и чтобы директивы могли быть смешанными.
А вот паразитные колонки, если они пусты, должны удаляться сами (когда включён флаг). Или сделать, чтобы всегда удалялись?
(24) Да, покамест обработка шарит по ссылкам только в случае картинок. Не очень понимаю, какой ещё принцип можно реализовать — ссылок разных много, разве что по расширениям определять, лазить туда или нет…
Было бы отлично, если бы настройки сделать в один архив с обработкой, чтобы только один раз пришлось скачивать,
ну и если будут доработки указывать версию, чтоб было видно, что есть изменения…
По сути идея интересная, нащет универсальности ето врядли. Онним словом появятся деньги посмотрим насколько обработка универсальна. НО удея хорошая, автору спасибо
(28) Универсален только разбор, т.к. модель html-документа везде схожа. Понятно, что с каждым сайтом придётся возиться отдельно.
Неплохо бы было добавить видео инструкцию с примером, а то ковырял-ковырял, так до конца и не разобрался. что-то вытаскивает, что-то нет.
следующий шаг — DDo1C атака 😉
Хм, идея конечно хорошая, универсальный механизм, но не люблю я DOM — медленный, не все данные отображет, я больше за регулярки.
1С эвернот )
А вот мне интересно, ты получаешь вознаграждения за то, что твою разработку скачивают именно с этого сайта. Ведь с меня за скачивание попросили 800 руб. И я не один такой. Если бы этой разработки не было бы, то и сайт этот мне не нужен был. Обрати внимание на Соглашение, если там нет передачи прав на платное распространение твоего интеллектуального труда, то можем засудить их по Закону об авторских правах. От 10000 до 5000000 руб возмещение.
(34) Во-первых, я ничего не получаю. Плюсы мне, в общем-то, пофигу (принцип, по которому их на ИС раздают, мне по сей день неведом), а ещё-то что? Во-вторых, несколько вышеотписавшихся попросили у меня прислать им на почту, и я прислал. В третьих, мне глубоко безразлично, что там есть в Соглашении и чего нет. В четвёртых, скоро планирую выкладывать обновление, более продвинутую версию.
Если бы я собирался «наварить» на публикации, то размещал бы в «магазине», поэтому ваш комментарий, уж извините, не по адресу.
Если быть честным, то для нормального парсинга страниц эта обработка не подходит. Нет четко заданных координат данных, которые нужно получать. Так пионэрская разработка. Серьезный парсинг нужен для серьезной агрегации данных и последующей конверсии данных в денежный эквивалент.
(36) Чётко заданные координаты данных, как я выше указывал, для универсала в общем виде невозможны. Эта «пионэрская» разработка уже 2 месяца используется для серьёзного парсинга и конверсии, как вы изволили выразиться, в денежный эквивалент. Если вы можете предложить способ идентификации источника данных в общем случае, в рамках классического DOM, я с большим интересом ознакомлюсь.
noor странный человек, видимо скачал обработку с оплатой 800 рубасов, а оказалось, что и не подходит она, и нет бесплатной пожизненной поддержки и доработки, да и вообще делает только то, что в описании и не больше )
Если надо готовую вещь, то мне кажется, стоит предложить автору обработки коммерческое сотрудничество,
хотя после таких комментариев неудивительно, если он и откажется.
Можете ли вы снять видео файл? (Если есть технические проблемы со съемкой, то я помогу.) в котором покажете как выполнять настройку — т.е. как пристреляться к любому сайту. А так механизм супер спасибо +++++.
что бы не искать мои контакты то скиньте хотя бы инструкцию на sfedorov777@yandex.ru
Большая просьба поделиться Вашей обработкой по адресу wrkr2 @rambler.ru .
Уважаемые коллеги, опубликована новая версия, делать какие-то инструкции к старой не буду, а вот к новой попробую успеть, хотя занят преизрядно.
Новая версия умеет «идти глубже». По ссылке, упомянутой на одной странице, умеет читать другую страницу. Жду отзывов и замечаний, т.к. подозреваю, что где-то мог и накосячить.
(42) прочитал «UPD 2», что внесены изменения, есть вопрос,
файл HTMLParsLoad.epf остался такой же и с тем же названием, он обновлен уже или нет?
Не хотелось бы конечно навязывать что-то,
но может проще тогда сделать новую публикацию с обновленной версией обработки + инструкцией (возможно даже видео) и примерами настроек в одном архиве (если конечно не ради SM разделены файлы настроек и обработки), а здесь поместить на нее ссылку,
тогда многие бы смогли поставить плюсы еще раз), ведь по сути уже очень много нового будет и тема очень интересная,
а пока непонятно, стоит скачать, или еще не обновлена версия приложенного файла..
Еще кстати вначале пытался найти по слову «парсер», но не нашел, т.к. в названии нет этого слова..
По работе обработки : есть ли общие черты в настройках для работы с сайтами на одинаковых CMS, например Битрикс, Joomla?
или все же настраивать надо очень индивидуально для каждого сайта?
(43) Подозреваю, что новая публикация как раз и может быть расценена как погоня за SM, поэтому всё выкладываю тут. Но, если вы считаете правильным, можно и отдельно, что сегодня-завтра проделаю. Правда, видео, наверно, не осилю, но встроенную справку поддерживаю актуальной.
Насчёт настроек в отдельных файлах — просто не сообразил, честно говоря. Взял да приаттачил, как лежали…
Насчёт слова «парсер» — учту.
Насчёт Битрикса и Джумлы — честно говоря, не знаю. Наверно, если есть общие черты, можно сделать «заготовку», базовую настройку, и дальше её докручивать при нужде. Например, чтение главной страницы, списка товаров — можно единой настройкой, а вот углубление по ссылкам в детальные данные может потребовать напильника.
Я как интегратор со стажем могу предложить помощь в написании php скриптов, которые будут отправлять инфу пропарсеную в Joomla 2.5… Отправлять файлы только post запросом.
конструктивных предложений так и не видно……
http://infostart.ru/public/63867/) где можно добавить новую страничку… тем самым избежать ограничение отображения структуры второго уровня.
Первый замеченный недостаток:
Когда несколько уровней списка поиска, при прочтении первого уровня где есть ссылка на второй уровень создается колонка со структурой в «тДанных», если колонка в «тДанных» — «Картинка», то при выборе ячейки с картинкой открывается «ПанельДанныхЯчейки» на странице «Картинка» и видим эту картинку в «КартинкаДанных», а если выбираем ячейку со «структурой» она открывается на «ПанельДанныхЯчейки» в «ВложенныеРезультаты» где тоже присутствует колонка с картинками уже второго уровня и посмотреть ячейку с «Картинкой» из «ВложенныеРезультаты» нет возможности, т.к. «ПанельДанныхЯчейки» отображает страницу «ВложенныеРезультаты» и не может одновременно показать страницу «Картинка»…. тоже самое со структурой третьего уровня — ее просто некуда вообще вывести!
(!!!)Предлагаю на форме сделать отдельную панель «Картинка» а для отображения структуры последующего уровня создавать новую панель, по типу «Панель пользователя» (
Второй замеченный недостаток:
При перемещении по страницам на «ПолеОбозревателя» не всегда подтягивается файл настроек dst. Т.е. например на маркете я прочитал список с мобильными телефонами, потом я прошел в список холодильников и после этого структура из dst уже не применяется к новой странице списка… приходится по новой читать структуру новой страницы HTML и загружать настройки dst.
Добавь кнопку «Развернуть» на закладку «НастройкаЧтения» — ЭлементыФормы.дСтруктуры.Развернуть(стро, Истина);
Так и не понял пока эту фразу «Парсинг любых сайтов. Загрузка данных из таблиц и тегов с сайтов. Загрузка картинок.» куда эти картинки загружаются? Если уж загружать, то хотя бы их грузить в хранилище например так:
Спр.Хранилище = Новый ХранилищеЗначения(Новый Картинка(мФайл), Новый СжатиеДанных);
«В алгоритме доступна для чтения и записи прочитанная таблица, хранящаяся в переменной ТекущаяТаблица. При установке переменной «Отказ» в Истина таблица изменена не будет.» — не совсем понятен принцип Алгоритма постобработки. Можно какой-нибудь пример….
(46) Ага, попробую эти замечания учесть. Быстро не обещаю, но в фоновом режиме буду делать.
(47) Вот и пишите это в Вашем алгоритме. Специфика у каждого своя, обработку можно и нужно дорабатывать напильником в той части, которая касается загрузки данных из таблицы дальше в базу. У меня картинки, как следует из справки, загружаются в колонку таблицы значений и никуда более.
(48) Давайте разберём на Вашей конкретной задаче. Пока не очень понял, что Вас смущает.
Я парсю html твот таким кодом. Главное получше прицелится и все получится. То есть определяем координаты нужных данных методом исключения
Показать
И самое странное, работает.
(50) Эх, парсить — это ведь не самое главное. Главное — прочитать осмысленно. При абсолютном совпадении имён классов и имён узлов концептуально нельзя применять никакую настройку чтения. Локально, конкретно, «по месту прицелясь» — да, можно. А универсально — уже нет.
Вот есть у вас три одинаковых тега и разных текстовых содержимых, в одной подветке DOM. И дальше-то, как программа поймёт, который текст нужен? Только хардкодить…
Это и есть наиболее универсальный механизм. Я настраиваю выборку данных с любого количества сайтов с передачей данных в 1С. Мне без разницы как это работает, правильно или нет. Но это позволяет мне получать именно те данные, которые мне нужны и в дальнейшем их обрабатывать и транслировать как во внутреннюю базу данных так и во внешнюю. Эта проблема возникла. когда мне нужно было получать свежие данные по тендерам и передавать исполнителю с 20 сайтов, чтобы он не лазил по ним и не тратил время и деньги.
(52) Вы не ответили на мой вопрос. Что вы делаете с совершенно неразличимыми, но разными по содержанию узлами?
(52) универсальный механизм при любых входных данных, — это сродни искусственному интеллекту. например : я беру 100500 сайтов и убираю из них все тэги, оставляю только текст, а потом говорю получите определенные данные со всех сайтов универсальным механизмом. Ок?
Если можно отправьте пожалуйста программный модуль-«Разбор и загрузка данных с любого сайта», на buktoru@yandex.ru, заранее спасибо.
(55) Отправил. Там несколько другая версия, более доработанная. Вот найду время, доведу до ума, выложу её сюды.
Посмотреть результат моей концепции можно наhttp://www.tender.infopiter.ru/tenders.html?keywords=&bdt=&edt=
Сбор информации на 20 площадках идет за 5 минут.
Можно подключить загрузку графики и прочей фигни. Но это будут следующие проекты по агрегации
данных. Так как я планирую зарабатывать на таких проектах деньги, то алгоритмы и иные технологические
фишки не открою. Ранее я указал. что основным качеством разбора является определение координат данных.
(57) Результат — это, конечно, супер. Но вы мне на вопрос вторично не ответили — значит, или не знаете, или изобрели ИИ и теперь разумно желаете продать его задорого. Правда, мне вот в принципе неясно, что можно сделать при двух совершенно одинаковых ветвях DOM-дерева, кроме как тупо привязываться к порядку их следования и уже исходя из этого черпать данные. Других «координат данных» в DOM в принципе нет.
И, пожалуйста, спокойнее, а то у меня возникает нехорошее ощущение, что эта моя бесплатная фиговинка вас волнует как серьёзный конкурент )))
Отвечаю, в двух одинаковых узлах могут быть разные классы, разные родители родителей, разный первый и последний дочерний элемент, покопайте в DOM еще, там много чего интересного есть. А конкуренции я не боюсь, потому что у меня все разработки для домашнего применения. Результаты получаемы при помощи разработок для коммерции.
Кстати, посмотрел я на всё своё творчество… и думаю замутить вообще другую версию, где а) парсинг DOM средствами 1С, б) настройки в виде адекватного xml, а не как сейчас, в) сохранение промежуточного дерева в xml же. Ну и скорость повыше будет.
(59) А вот когда и родитель один, и имён классов нет, и дочерних нет (сами они концевые), тогда что? Или мне конкретный пример привести?
Выложил обновлённую версию. Всерьёз думаю над кардинальной переработкой.
Реально задача достаточно сложная. Особенно если нужно обходить защиту от парсинга, которую любят ставить тупоголовые айтишники госструктур. Но как говориться на любую хитрую ж…. всегда найдется болт с резьбой.
Как побороть эту ошибку
{Форма.ОсновнаяФорма.Форма(393,16)}: Переменная не определена (СКДиПостроители)
мСКДСтруктуры=<<?>>СКДиПостроители.СоздатьСКД(тСтруктурыДляПоиска);
{Форма.ОсновнаяФорма.Форма(448,7)}: Переменная не определена (СКДиПостроители)
трез=<<?>>СКДиПостроители.ПоместитьРезультатСКДвТаблицуЗначений(мСКДСтруктуры,фп.КомпоновщикСКД,тСтруктурыДляПоиска);
(64) Скачать текущую версию. Это у вас, видимо, одна из первых. Или, хотите, вышлю почтой.
(65) ошибка указанная в (64) возникает как-раз после обновления файла для скачивания
Вышлите пожалуйста, так как скачивал 30 апреля. Proit@mail.ru
Никак не хочет… 8.2.17.169УТ10.3.21.2
UPD: Файл скачал сегодня.
та же самая проблема…
В итоге загуглил название имя файла и нашёл где-то на просторах инета работающий парсер… Уже ноги с руками переломал)))
(66) (68) (69) Перезалил ещё раз. Странное дело, эта бага была убрана ещё полгода назад…
Попробую на паре сайтов. Задачи по парсингу всегда актуальны.
(12) adhocprog, Уже есть, и ресурсов много не ест
(74) где можно увидеть? )
(74) (75) Коллеги, просьба всё-таки не оффтопить. Тут — обсуждение моей разработки, а не сравнительный анализ нескольких и уж тем более не площадка для рекламы других решений. Лады?
Какая актуальная версия обработки?
🙁 А то как-то разбрасываться $$долларом как-то не хочется за примеры настроек для обработки или скачать для того чтоб узнать версию……
(77) Актуальная уже давно под УФ и на эту не похожа ни капли. Всё надеюсь её довинтить и выложить, хотя уже и аналоги от других авторов появились. Если очень горит, могу выслать текущий «полуфабрикат».
1С 8.3.5.1098 + УТ 11.1.7.54
Не открывается обработка. Разворачивается пустая область.
Версия не подходит, в свежем варианте будет поддержка? =) Оч надо
(79) Буквально на неделе выложу новую версию под УФ, здесь кину ссылку. Там всё будет иначе)
(80) Отличные новости! Жду с нетерпением 😉
(81)http://infostart.ru/public/328533/
Добрый вечер! На этой конфигурации УТ будет работать? А пробную версию можно получить st-bt@tut.by?
при открытии некоторых сайтов вылетает ошибка выполнения скрипта.
http://infostart.ru/public/174856/ можно попробовать избавиться от этого, подключив библиотеку excanvas.js , думаю поможет удалить показ ошибок скриптов
тут