Парсеры, обработка текста. просто о сложном. cfg, bnf, ll(k), lr(k), peg и другие страшные слова

2. Вопросы по установке, запуску и обновлениях#

2.1. Нажимаю на кнопку Download — а архив не скачивается. Что делать?

Проверте, есть ли у вас свободное место на жестком диске, отключите антивирус. Следуйте инструкции по установке. Также ознакомьтесь с Как начать работать.

2.2. Купил Enterprise версию, но устанавливается по прежнему PRO. Что делать?

Удалите предыдущую версию. В Members Area проверьте верно ли прописан ваш IP-адрес. Перед загрузкой нажмите кнопку Обновить. Скачайте более новую версию. Более детально в инструкции по установке.

2.3. Установил программу, а она не запускается, что делать?

Проверьте запущенные приложения, отключите антивирус, проверьте доступный объём свободной оперативной памяти. Также в Личном кабинете проверьте верно ли прописан ваш IP-адрес. Более детально: инструкции по установке.

2.4. Что делать если у меня динамический IP-адрес?

Ничего страшного, A-Parser поддерживает работу с динамическими IP-адресами. Просто каждый раз, когда он меняется, вам необходимо его прописывать в Members Area. Для того, чтобы избежать данных манипуляций, рекомендуется использовать статический IP-адрес.

2.5. Какие оптимальные параметры сервера, компьютера для установки парсера?

Все системные требования можно посмотреть здесь: системные требования.

2.6. Запустил задание. Парсер упал и больше не запускается что делать?

Необходимо остановить сервер, проверить, не висит ли процесс в памяти, и попробовать запустить еще раз. Так же можно попробовать запустить А-Парсер с остановкой всех заданий. Для этого нужно запустить с параметром -stoptasks. Детально про запуск с параметром.

2.7. Какой пароль вводить при открытии адреса 127.0.0.1:9091?

Если это первый запуск, то пароль пустой. Если не первый — то тот, который Вы задали. Если забыли пароль — .

2.8. В Личном кабинете ввожу свой IP, а он не меняется в поле Ваш текущий IP. Почему?

Поле Ваш текущий IP отображает IP который у вас сейчас действителен, и он не должен менятся. Это его Вы должны вписать в поле IP 1.

2.9. Могу ли я запустить одновременно две копии?

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

Запустить два А-Парсера на разных машинах одновременно можно только если у вас приобретён дополнительный IP в Личном кабинете.

2.10. Есть ли у парсера привязка к железу?

Нет. Для контроля лицензий используется ваш IP.

2.11. Вопрос по обновлению — обновлять только .exe? config/config.db и files/Rank-CMS/apps.json — а для чего эти файлы?

Если иное не указано, то обновлять только . Первый файл для хранения конфигурации А-Парсера, а второй — это база для определения CMS и собственно работы самого парсера Rank::CMS.

2.12. У меня Win Server 2008 Web Edition — парсер не запускается…

На данной версии ОС А-парсер не будет работать. Единственный вариант — сменить ОС.

2.13. У меня 4-ядерный процессор. Почему А-Парсер использует только одно ядро?

A-Parser использует от 2х до 4х ядер, дополнительные ядра используется только при фильтрации, Конструкторе результатов, Parse custom result

2.14. У меня начала появляться ошибка сегментирования (segmentation failed, segmentation error). Что делать?

Скорее все изменился ваш IP. Проверьте в Личном кабинете.

2.15. У меня Linux. А-Парсер запустился, но в браузере не открывается. Как решить?

Проверьте фаервол — скорее всего он блокирует доступ.

Приоритет и ассоциативность операций

Чтобы решить обе проблемы, нам нужно дать парсеру информацию о приоритетах операций.

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

Метод теперь будет принимать аргумент :

С помощью нового аргумента парсер знает, когда продолжать, а когда остановиться, что позволяет правильно связать итоговое AST.

Каждый парслет теперь должен передать свой (приоритет) при вызове :

связывает выражения как лево-ассоциативные. Чтобы разобрать право-ассоциативные выражения, нужно вычесть 1 из приоритета операции:

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

3. Вопросы по настройке А-Парсера и других настройках#

3.1. Как настроить проксичекер?

Детальная инструкция находится здесь: настройка прокси.

3.2. Нет живых проксей — почему?

Проверьте ваше соединение с интернет, а также правильность настройки проксичекера. Если все сделано правильно, то это значит, что на данный момент ваш список прокси не содержит рабочих серверов. Решение данной проблемы: либо использовать другие прокси, либо повторить попытку позже.
Если Вы используете наши прокси, то проверьте IP адрес в Личном кабинете в разделе Прокси. Также возможен вариант, что ваш провайдер блокирует доступ к другим dns, попробуйте сделать описанные здесь шаги: http://a-parser.com/threads/1240/#post-3582

3.3. Как подключит антигейт?

Детальная инструкция по настройке антигейта тут.

3.4. Я изменил парамеры в настройках парсера, но они не применились. Почему?

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

3.5. Можно ли изменить настройки работающего задания?

Можно, но не все. В выполняющемся задании можно нажать на паузу и там же в выпадающем меню выбрать Редактировать.

3.6. Как импортировать пресет?

Нажать кнопку рядом с полем выбора задания в Редакторе заданий. .

3.7. Как настроить парсер чтобы он не использовал прокси?

В настройках нужного парсера снять галочку Use proxy.

3.8. У меня нет кнопки Добавить переопределение / Override option!

Эту опцию можно добавить непосредственно в Редакторе заданий. .

3.9. Как перезаписать в тот же файл с результатами?

При составлении задания выставить опцию Перезаписать файл.

3.10. Где поменять пароль на парсер?

3.11. Поставил 6 миллионов ключей на парсинг, так же указал, что бы домены были все уникальны. А как так сделать, чтобы когда я поставлю новые 6 миллионов ключей, записывались только уникальные домены не перессекающиеся с прошлим парсингом?

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

3.12. Как обойти ограничение в 1000 результатов для гугла?

Воспользуйтесь опцией Спарсить все результаты / Parse all results.

3.13. Как обойти ограничение в 1024 потока на линукс?

3.14. Какой лимит потоков на Windows?

До 10000 потоков.

3.15. Как сделать запросы уникальными?

Использовать опцию Уникальные запросы в блоке Запросы в Редакторе заданий.

3.16. Как отключить проверку проксей?

В Настройки — Настройки проксичекера выбрать нужный проксичекер и добавить галку Не проверять прокси. Сохранить и выбрать сохраненный пресет.

3.17. Что такое Proxy ban time? Могу я постаивть в нем 0?

Время бана прокси в секундах. Да, можете.

3.18. Какая разница между Exact Domain и Top Level Domain в парсере SE::Google::Position

Exact Domain — это строгое соответствие, т.е. если в выдаче www.domain.com, а мы ищем domain.com, то соответствия не будет. Top Level Domain сверяет весь топ домен, т.е. здесь будет соответствие.

3.19. Если запускать тестовый парсинг — все работает, если обычный — получаю ошибку Some error.

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

3.20. Где задается Формат результата?

3.21. В SE::Google отсутствует нидерландский язык, хотя в настройках Гугла он есть. Почему?

Нидерландский язык это Dutch, он есть в списке. Детально в улучшении по добавлении нидерландского языка.

Какой бывает парсинг в соцсетях?

Парсинг соцсетей – это быстрый и простой способ извлечь ценную информацию о ЦА из триллионов байт данных. Парсинг – не самое точное название. На самом деле это этап скрейпинга – автоматизированного сбора информации, когда из собранных данных извлекаются нужные сведения. Но не будем отвлекаться, так как в русскоязычных источниках парсинг – это синоним скрейпинга.

Информацию можно собирать внутри сервиса парсинга и вручную выгружать готовые базы либо включить в процесс API.

API (интерфейс программирования приложений) – это программное обеспечение (ПО), которое помогает обмениваться данными с другим ПО, изначально не предназначенным для совместной работы.

Как это связано с парсингом? Подключите API и сможете автоматизировать процесс:

  • Собирать данные в режиме реального времени. Это особенно полезно для платформы, где тенденции могут поменяться в считанные минуты.
  • Настроить автоматическую воронку сбора данных. Например, воронки помогут сравнить конверсию в целевое действие для разного контента или узнать, что и какой части аудитории зашло на ура.
  • Переносить инфу сразу в вашу базу данных или аналитическое ПО без вмешательства человека.

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

Интеграция 1С с ГИИС ДМДК

ГИИС ДМДК — единая информационная платформа для взаимодействия участников рынка драгоценных металлов и драгоценных камней. с 01.09.21 стартовал обязательный обмен данными с Федеральной пробирной палатой (ФПП) исключительно через ГИИС. А постепенно — с 01.01.2022 и с 01.03.2022 — все данные о продаже драгоценных металлов и камней должны быть интегрированы с ГИИС.
У многих пользователей возникает вопрос как автоматизировать обмен между программой 1С и ГИИС ДМДК.
В настоящей статье ВЦ Раздолье поделится своим опытом о реализации такого обмена.
Автор статьи — Мордовин Антон — архитектор систем на базе 1С Внедренческого центра «Раздолье».

Список собираемых данных#

Здравствуйте, Супер Команда Высочайших Профессионалов своего Дела! Спасибо за возможность изучения Испанского, Турецкого и Португальского языка! Желаю Вам дальнейшего расширения Ваших Возможностей! Вдохновения и Творчества! И просьба добавить Возможность изучения Немецкого и Французского языка!”
Использую лингвалео уже многие годы, первый раз начал заниматься еще когда приложения не было совсем, был только сайт) Спасибо разработчикам, продолжайте в том же духе, с креативом и с большой любовью к делу)
Технический английский для IT: словари, учебники, журналы
Изучай языки онлайн Изучай английский онлайн Изучай вьетнамский онлайн Изучай греческий онлайн Изучай индонезийский онлайн Изучай испанский онлайн Изучай итальянский онлайн Изучай китайский онлайн Изучай корейский онлайн Изучай немецкий онлайн Изучай нидерландский онлайн Изучай польский онлайн Изучай португальский онлайн Изучай сербский онлайн Изучай турецкий онлайн Изучай украинский онлайн Изучай французский онлайн Изучай хинди онлайн Изучай чешский онлайн Изучай японский онлайн

Скопировать

  • Парсит текстовые блоки с указанной страницы
  • Массив со всеми собранными страницами (используется при работе опции Use Pages)

Парсинг

Тот код, который у нас уже есть, можно использовать как основу для скрейпинга. Фактически, мы создали простейший минифреймворк, который можно понемногу дорабатывать каждый раз, как нам попадётся очередной сложный сайт, а для простых сайтов (которых большинство) можно просто писать фрагмент кода, отвечающий за парсинг. Смысл этого фрагмента будет всегда один и тот же: на входе – тело http-ответа, а на выходе – пополнение массива результатов и очереди ссылок. Инструменты для парсинга на остальной код повлиять не должны.

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

Однако, большая часть HTML-страниц легко разбирается DOM-парсерами, которые намного удобнее и легче читаются. Регулярки стоит использовать только если DOM-парсеры не справляются. В нашем случае DOM-парсер отлично подойдёт. В настоящий момент среди DOM-парсеров под Node.js уверенно лидирует cheerio – серверная версия культового JQuery.

(Кстати, на Ferra.ru используется JQuery. Это довольно надёжный признак того, что с таким сайтом справится)

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

Итак, списки ссылок на новости у нас располагаются внутри элемента с классом . Там есть и другие ссылки, которые нам не нужны, но правильные ссылки легко отличить, так как только у таких ссылок родитель – элемент . Ссылка на следующую страницу паджинации у нас располагается внутри элемента с классом , и она там одна. На страницах новостей и на последней странице списка такого элемента нет. Стоит учесть, что ссылки в паджинаторе – относительные, так что их надо не забыть привести к абсолютным. Имя автора спрятано в глубине элемента с классом . На страницах списка такого элемента нет, так что если автор совпадает – можно тупо собирать данные новости.

Не стоит забывать и о битых ссылках (спойлер: в разделе, который мы скрейпим, таких ссылок целая одна). Как вариант, можно у каждого запроса проверять код ответа, но бывают сайты, которые отдают страницу битой ссылки с кодом (даже если пишут на ней “404”). Другой вариант – посмотреть в коде такой страницы те элементы, которые мы собираемся искать парсером. В нашем случае таких элементов на странице битой ссылки нет, так что парсер такие страницы просто проигнорирует.

Добавим в наш код парсинг при помощи :

В принципе, мы получили скрипт для веб-скрейпинга, который решает нашу задачу (для желающих код на gist). Однако отдавать заказчику я бы такой скрипт не стал. Даже с параллельными запросами этот скрипт выполняется долго, а значит ему как минимум нужно добавить индикацию процесса выполнения. Также сейчас, даже при недолгом перебое со связью, скрипт упадёт не сохранив промежуточных результатов, так что надо сделать либо чтобы скрипт сохранял промежуточные результаты перед падением, либо чтобы он не падал, а вставал на паузу. Ещё я бы от себя добавил возможность принудительно прервать работу скрипта, а потом продолжить с того же места. Это излишество, по большому счёту, но такие “вишенки на торте” очень укрепляют отношения с заказчиками.

Однако если заказчик попросил один раз заскрейпить ему данные и просто прислать файл с результатами, то ничего этого можно и не делать. Всё и так работает (23 минуты в 10 потоков, найдено 1005 публикаций и одна битая ссылка). Если совсем обнаглеть, то можно было бы не делать рекурсивный проход по паджинатору, а сгенерировать по шаблону ссылки на страницы списка за тот период, когда я работал на Ferra.ru. Тогда и скрипт не так долго работал бы. Поначалу это раздражает, но выбор вот таких решений – это тоже важная часть задачи по веб-скрейпингу.

Перед установкой#

Перед установкой необходимо выполнить следующие действия:

  1. В Личном кабинете проверьте верно ли прописан ваш IP-адрес (для пользователей у которых динамический IP-адрес, требуется менять IP-адрес при смене на новый)
  2. Перейдите во вкладку A-Parser — Загрузки
  3. Перед скачиванием необходимой версии, следует предварительно нажать Обновить, для обновления до последней версии A-Parser

A-Parser Release — стабильная версия A-Parser, подробнее о выходе новых версий можно прочитать в разделе новости

A-Parser Beta — промежуточная версия A-Parser, которая постоянно дополняется, подробнее об изменениях можно прочитать на форуме в разделе Next Release

Шаг 3. Пример из реального мира

Для демонстрации библиотеки в действии мы напишем скрипт для скрепинга содержимого сайта net.tutsplus.com и формирования списка заголовков и описания статей, представленных на сайте….только в качестве примера. Скрепинг относится к области трюков в веб, и не должен использоваться без разрешения владельца ресурса.

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

Так же объявим глобальный массив, чтобы сделать проще сбор все информации о статьях в одном месте. Прежде чем начинать парсинг взглянем, как описывается статья на сайте Nettuts+.

Так представлен основой формат поста на сайте, включая комментарии исходного кода. Почему важны комментарии? Они подсчитываются парсером как узлы.

getTaskConf#

Получение конфигурации задания по его id.

Пример запроса

{

«password»»pass»,

«action»»getTaskConf»,

«data»{

«taskUid»»181»

}

}

Скопировать

Пример ответа

В ответ отдаются настройки задания, в т.ч. с результирующем именем файла.

{

«success»1,

«data»{

«parsers»

«SE::Bing»,

«default»,

{

«value»1,

«type»»override»,

«id»»pagecount»

}

,

«resultsFileName»»Mar-05_13-12-23.txt»,

«runTaskOnComplete»null,

«limitLogsCount»»0»,

«resultsPrepend»»»,

«origResultsFileName»»$datefile.format().txt»,

«queriesFrom»»text»,

«runTaskOnCompleteConfig»»default»,

«doLog»»db»,

«useResultsFileAsQueriesFile»,

«additionalFormats»,

«resultsSaveTo»»file»,

«callURLOnComplete»»»,

«resultsFormat»»$p1.related.format(‘$key\\n’)»,

«queryBuilders»,

«preset»»default»,

«resultsAppend»»»,

«uniqueQueries»,

«keepUnique»,

«prio»»5»,

«saveFailedQueries»,

«configPreset»»100 Threads»,

«queries»

«test»

,

«toolsJS»»»,

«moreOptions»,

«resultsBuilders»,

«resultsUnique»»string»,

«iteratorOptions»{

«onAllLevels»,

«queryBuildersAfterIterator»,

«queryBuildersOnAllLevels»

},

«removeOnComplete»,

«queryFormat»

«$query»

,

«configOverrides»,

«resultsOptions»{

«overwrite»,

«writeBOM»

}

}

}

Скопировать

Определение «скрытых» данных на уровне ключевых слов

В Google Analytics есть возможность подгрузить данные из Search Console. Но вы не увидите ничего нового — все те же страницы, CTR, позиции и показы. А было бы интересно посмотреть, какой процент отказов при переходе по тем или иным ключевым словам и, что еще интересней, сколько достигнуто целей по ним.

Тут поможет шаблон от Sarah Lively, который описан в статье для MOZ.

Для начала работы установите дополнения для Google Sheets:

  • Google Analytics Spreadsheet Add-on;
  • Search Analytics for Sheets (если вы использовали первые два шаблона, то это дополнение у вас уже есть).

Шаг 1. Настраиваем выгрузку данных из Google Analytics

Создайте новую таблицу, откройте меню «Дополнения» / «Google Analytics» и выберите пункт «Create new report».

Заполняем параметры отчета:

  • Name — «Organic Landing Pages Last Year»;
  • Account — выбираем аккаунт;
  • Property — выбираем ресурс;
  • View — выбираем представление.

Нажимаем «Create report». Появляется лист «Report Configuration». Вначале он выглядит так:

Но нам нужно, чтобы он выглядел так (параметры выгрузки вводим вручную):

Просто скопируйте и вставьте параметры отчетов (и удалите в поле Limit значение 1000):

Report Name Organic Landing Pages Last Year Organic Landing Pages This Year
View ID //здесь будет ваш ID в GA!!! //здесь будет ваш ID в GA!!!
Start Date 395daysAgo 30daysAgo
End Date 365daysAgo yesterday
Metrics ga:sessions, ga:bounces, ga:goalCompletionsAll ga:sessions, ga:bounces, ga:goalCompletionsAll
Dimensions ga:landingPagePath ga:landingPagePath
Order -ga:sessions -ga:sessions
Filters    
Segments sessions::condition::ga:medium==organic sessions::condition::ga:medium==organic

После этого в меню «Дополнения» / «Google Analytics» нажмите «Run reports». Если все хорошо, вы увидите такое сообщение:

Также появится два новых листа с названиями отчетов.

Шаг 2. Выгрузка данных из Search Console

Работаем в том же файле. Переходим на новый лист и запускаем дополнение Search Analytics for Sheets.

Параметры выгрузки:

  • Verified Site — указываем сайт;
  • Date Range — задаем тот же период, что и в отчете «Organic Landing Pages This Year» (в нашем случае — последний месяц);
  • Group By — «Query», «Page»;
  • Aggregation Type — «By Page»;
  • Results Sheet — выбираем текущий «Лист 1».

Выгружаем данные и переименовываем «Лист 1» на «Search Console Data». Получаем такую таблицу:

Для приведения данных в сопоставимый с Google Analytics вид меняем URL на относительные — удаляем название домена (через функцию замены меняем домен на пустой символ).

После изменения URL должны иметь такой вид:

Шаг 3. Сводим данные из Google Analytics и Search Console

Копируем шаблон Keyword Level Data. Открываем его и копируем лист «Keyword Data» в наш рабочий файл. В столбцы «Page URL #1» и «Page URL #2» вставляем относительные URL страниц, по которым хотим сравнить статистику.

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

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

Как видите, для работы с ключами не обязательно сразу доставать кошелек. Есть немало простых решений. Следите за нашими публикациями — мы еще не раз поделимся полезностями.

Мы не упоролись плюсовыми шаблонами

Первый ответ, наименее очевидный, состоит в том, что мы хотим рассказывать не только о том, что RESTinio делает, но и как он это делает. В частности, о технических решениях, применяемых в реализации RESTinio.

Думаю, что эта информация несколько повышает степень доверия к нашей разработке. Ведь одно дело, когда человек заглядывает в исходники RESTinio, видит там шаблонную магию и думает, что это просто потому, что авторы упоролись шаблонами и пытаются проверить C++ные компиляторы на прочность. Совсем другое дело, когда принятые нами решения объяснены и аргументированы.

Сам по себе easy_parser появился в RESTinio не просто так, а как результат попытки добавить в RESTinio средства работы с HTTP-заголовками.

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

Использование парсера на базе грамматик выглядело как наиболее подходящее решение, но вот вариант затащить в проект какой-то генератор парсеров (вроде bison, coco/r, ragel и пр.) рассматривался как нежелательный. RESTinio является header-only библиотекой (хоть и требует линковки к libhttp-parser). А использовать для разработки кросс-платформенной header-only библиотеки внешние генераторы кода выглядит так себе идеей. Кроме того, смущал вот какой момент: допустим, мы сгенерируем код для разбора каких-то штатных заголовков и этот код попадет в состав RESTinio, но что делать пользователю, которому захочется разобрать какой-нибудь нестандартный заголовок (или стандартный, но поддержки которого еще нет в RESTinio)? Писать разбор вручную или осваивать ragel или coco/r? Ну так себе выбор, как по мне.

Cтатья продемонстрировала как выглядит добавление поддержки HTTP-заголовка в RESTinio с помощью easy_parser-а. Это может показаться чрезмерным усложнением.

Но…

На практике, после освоения easy_parser, написать показанный выше код не сложно. Это занимает совсем немного времени. Гораздо больше уходит на то, чтобы a) вкурить соответствующую часть RFC, b) понять, во что именно должно трансформироваться разобранное значение, какие структуры потребуются для хранения результата разбора, c) покрыть написанный парсер тестами и d) задокументировать это все. Так что, бывает, что общая работа по реализации поддержки какого-то не самого простого заголовка занимает 4-6 часов, из которых написание связанного с easy_parser-ом кода — это всего 15-20 минут.

Так что, хоть у easy_parser-а в RESTinio есть свои особенность и недостатки, все-таки его создание и использование в RESTinio пока что выглядит оправданным.

Парсите страницы сайтов в структуры данных

Что такое Диггернаут и что такое диггер?

Диггернаут — это облачный сервис для парсинга сайтов, сбора информации и других ETL (Extract, Transform, Load) задач. Если ваш бизнес лежит в плоскости торговли и ваш поставщик не предоставляет вам данные в нужном вам формате, например в csv или excel, мы можем вам помочь избежать ручной работы, сэкономив ваши время и деньги!

Все, что вам нужно сделать — создать парсер (диггер), крошечного робота, который будет парсить сайты по вашему запросу, извлекать данные, нормализовать и обрабатывать их, сохранять массивы данных в облаке, откуда вы сможете скачать их в любом из доступных форматов (например, CSV, XML, XLSX, JSON) или забрать в автоматическом режиме через наш API.

Какую информацию может добывать Диггернаут?

  • Цены и другую информацию о товарах, отзывы и рейтинги с сайтов ритейлеров.
  • Данные о различных событиях по всему миру.
  • Новости и заголовки с сайтов различных новостных агентств и агрегаторов.
  • Данные для статистических исследований из различных источников.
  • Открытые данные из государственных и муниципальных источников. Полицейские сводки, документы по судопроизводству, росреест, госзакупки и другие.
  • Лицензии и разрешения, выданные государственными структурами.
  • Мнения людей и их комментарии по определенной проблематике на форумах и в соцсетях.
  • Информация, помогающая в оценке недвижимости.
  • Или что-то иное, что можно добыть с помощью парсинга.

Должен ли я быть экспертом в программировании?

Если вы никогда не сталкивались с программированием, вы можете использовать наш специальный инструмент для построения конфигурации парсера (диггера) — Excavator. Он имеет графическую оболочку и позволяет работать с сервисом людям, не имеющих теоретических познаний в программировании. Вам нужно лишь выделить данные, которые нужно забрать и разместить их в структуре данных, которую создаст для вас парсер. Для более простого освоения этого инструмента, мы создали серию видео уроков, с которыми вы можете ознакомиться в документации.

Если вы программист или веб-разработчик, знаете что такое HTML/CSS и готовы к изучению нового, для вас мы приготовили мета-язык, освоив который вы сможете решать очень сложные задачи, которые невозможно решить с помощью конфигуратора Excavator. Вы можете ознакомиться с документацией, которую мы снабдили примерами из реальной жизни для простого и быстрого понимания материала.

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

СОЗДАНИЕ HTTP-СОЕДИНЕНИЯ, ВЫЗОВ ЗАПРОСА И ОБРАБОТКА ОТВЕТА

Для создания HTTP-соединения и запроса в 1С есть простые объекты, которые прямо так и называются:

После того, как мы прочитали JSON и распарсили его, получили такой вот объект:

В объекте есть два поля: content и remaining, в первом находится HTML страницы, а во втором — количество оставшихся элементов.

Давайте попробуем засунуть значение в ДокументDOM, чтобы можно было написать к нему XPath:

Итак, что тут происходит? Я прочитал JSON в соответствие СС, после чего создал построитель ДОМ, которым прочитал XML из СС. Но у меня вывалилась первая ошибка:

Что там у нас в 7-й строке? Тег img, который не закрывается!

Да, мы можем прочитать данные в ДокументHTML вместо DOM, но тогда нам не будет доступен XPath. Также мы не можем просто так взять и поправить все «>» на «/>» — есть такие теги, которые содержат внутренние элементы. Надеюсь Вы теперь понимаете, почему почтенные веб-разработчики просят соблюдать стандарт и не писать «<br>» вместо «<br />» (кстати, не стоит путать стандарт XML и нечто от 1С об именовании переменных).

Благо, что у нас в img всегда есть alt, по которому мы сможем узнать, что тег надо закрыть. Итак, давайте исправим это:

Но ничего не вышло:

Что на этот раз? Тут все просто — 1С не может прочитать неполный документ, т.е. все теги документа должны быть в одном корневом контейнере. Исправить это нетрудно:

В итоге при чтении XML в DOM у нас пока больше нет ошибок. На том же PHP у меня нет ошибок сразу — я могу любую ересь в него прочитать и применить к прочитанному XPath. Но это так — лирическое отступление.

getProxies#

Запрос списка живых проксей. Возвращается список живых прокси со всех проксичекеров.

Пример запроса

{

«password»»pass»,

«action»»getProxies»

}

Скопировать

Пример ответа

{

«success»1,

«data»{

«127.0.0.1:23486»

«socks»

,

«127.0.0.1:23140»

«socks»

,

«127.0.0.1:21971»

«http»

}

}

Скопировать

IP:port прокси будет указан в качестве имени массива. Первым элементом массива идет тип прокси, может принимать 3 значения — http, socks, socks4. Если указана авторизация по логин\паролю то вторым и третьим элементами будет логин и пароль.

Также можно получить список прокси только из определенных проксичекеров. Для этого нужно дополнительно передать массив .

Пример:

{

«password»»pass»,

«action»»getProxies»,

«data»{

«checkers»

«Elite proxies»,

«free proxies»

}

}

Скопировать

bulkRequest#

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

Пример запроса

{

«password»»pass»,

«action»»bulkRequest»,

«data»{

«parser»»SE::Google»,

«preset»»Pages Count no Proxy»,

«configPreset»»default»,

«threads»3,

«rawResults»1,

«queries»

«test1»,

«test2»,

«test3»,

«test4»,

«test5»

}

}

Скопировать

Пример ответа

{

«success»1,

«data»{

«logs»{

«0»{

«1»

4,

1614935687,

«SE::Google::0»,

«test1»

,

,

1614935688,

«Thread complete work»

},

…лог по остальным потокам…

},

«results»

{

«ads»,

«success»1,

«info»{

«success»1,

«retries»,

«stats»{

«success»1,

«retries»,

«proxiesUsed»,

«requests»,

«queries»1

}

},

«query»{

«first»»test1»,

«threadId»»0»,

«lvl»,

«query»»test1»,

«queryUid»»0»,

«orig»»test1»,

«prefered_proxy»null

},

«totalcount»»35800000»,

«serp»

«https://www.test1solutions.com/»,

«FoamFlex200 | Oil Spill Absorbent | Oil Disaster solution»,

«<em>TEST1</em> IS SOLUTION. In addition to the different models&nbsp;…»,

,

,

«related»

«<b>test2</b>»,

,

«detected_geo»»Germany»,

«rich»

«Featured snippet»,

«People also ask»

,

«misspell»,

«resultsCount»12

},

…результаты по остальным запросам…

}

}

Скопировать

Заключение

Для серьёзных целей существуют генераторы парсеров и прочие штуки.

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

Полезные ссылочки:

  1. библиотека на github
  2. Пример парсинга DSL
  3. «Programming in scala», глава «parser combinators»

Приведённый выше код я выложил на github

P.S. У меня всё ещё есть цель дописать свой интерпретатор lua-подобного языка с шахматами и поэтессами. Я вроде бы продумал синтаксис языка, потом в процессе написания парсера наткнулся на противоречия — пришлось отказаться от пары поэтесс и заменить шахматы на шашки, но результат всё равно получается довольно интересным.