Парсинг Сервис

Пишем парсер данных выписки из егрюл/егрип.

Всем привет! В этой статье расскажу о работе с ""API Федеральной Налоговой Службы"". И чем это в итоге обернулось.

В одном из проектов была задача было получать данные Юридическом Лице(ООО, ИП, и т.д.)

Проект представляет собой POS-систему для кафе и рестаранов.
Для обслуживания, процессинга и учета клиентов используется корпоративный портал. Портал позволяет управлять клиентами и хранит мнжество данных от Названия организации до ОКВЭД(Общероссийский классификатор видов экономической деятельности).

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

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

Обычно, когда мне нужно сделать что-то подобное, я смотрю не предоставляет ли данный сервис API для взаимодействия. И обычно, если это популярный и востребованный сервис, то api существует в том или ином виде.
Например facebook api, vk api, ebay api и т.д.

Сразу же возникает вопрос, а нет ли чего-то подобного у федеральной налоговой службы. Но и ответ находится достаточно быстро.
www.nalog/rn77/service/egrip2/access_order/

Nalog позволяет получить данные организаций в электронном виде через ftp. Либо через api(не подтверждено).

за годовое абонентское обслуживание одного рабочего места одного реестра (ЕГРЮЛ или ЕГРИП) - 150 тысяч рублей (НДС не облагается в соответствии с подпунктом 4 пункта 2 статьи 146 Налогового кодекса Российской Федерации);

за однократное предоставление открытых сведений в полном объеме одного реестра (ЕГРЮЛ или ЕГРИП) - 50 тысяч рублей (НДС не облагается в соответствии с подпунктом 4 пункта 2 статьи 146 Налогового кодекса Российской Федерации);

за однократное предоставление открытых обновленных сведений (в случае обновления уже полученных открытых сведений в полном объеме) – 5 тыс. рублей (НДС не облагается в соответствии с подпунктом 4 пункта 2 статьи 146 Налогового кодекса Российской Федерации).

В общем, и то и другое платно. Постоянный доступ - 150 000 р./год. для одного оператора. Либо
50 000 р. единовременно + 5 т.р. за каждое обновление.
Цены ощутимые, учитывая что база обновляется каждый день(так написано на сайте налоговой). Правда это или нет - другой вопрос.

Скорее всего одного оператора достаточно, чтобы скачать данные, внести в свою БД и уже по ней вести поиск. Время от времени обновлять данные.
Но в любом случае, в нашей компании не готовы были платить такие деньги. Оно и понятно.

К тому же сам процесс достаточно трудоемкий, предполагает получение Rutoken, настройка окружения для безопасного взаимодействия с системой.
Затем нужно автоматизировать процесс загрузки файлов по ftp, парсинг и обновление локальной базы. Что заеняло бы много сил и времени.

В итоге был выбрран немножечко костыльный, но рабочий вариант. Наиболее оптимальный, как мне кажется.

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

Нужно указать данные организации. Инн, либо другие данные.
Также нужно ввести капчу.
В результате будет сгенерирован pdf файл

Обходом капчи заниматься не хотелось. Да и не силен я в этом. К тому же, пока мы подключаем не 1000 клиентов в день, это не так уж принципиально.
Менеджер может перейти по ссылке, скачать pdf файл и загрузить в систему.

Update 2018-12-24: Сайт налоговой инспекции немного поменялся. В частности, теперь не нужно вводить капчу.
Вместо этого добавили что-то вроде двухэтапной авторизации.

Примеры pdf документов для ИП и ООО:

nalog_org.pdf
nalog_pe.pdf

Остается распарсить pdf и получить нужные данные.
Я думал, что с этим возникнут проблемы, но на самом деле все оказалось не так сложно.

Конечно, многое зависит от формата pdf. Здесь он генерируется с помошью iText Java library.

Парсер разрабатывал на php, оформил в виде библиотеки.
Выложил на github, можно установить через composer

composer require ""antonshell/egrul-nalog-parser:dev-master""

Для парсинга использовал эту библиотеку github/smalot/pdfparser/

Парсит достаточно хорошо, получаем такой текст

ЕДИНЫЙ ГОСУДАРСТВЕННЫЙ РЕЕСТР ИНДИВИДУАЛЬНЫХ ПРЕДПРИНИМАТЕЛЕЙ
Сведения об индивидуальном предпринимателе
ИВАНОВ ИВАН ИВАНОВИЧ
ОГРНИП 314213009700255
ИНН 213000262765
по состоянию на 11.09.2017
№ п/пНаименование показателяЗначение показателя
123
Фамилия, имя, отчество (при наличии\fbg^b\b^mZevgh]hij_^ijbgbfZl_ey
1ФамилияИВАНОВ
2ИмяИВАН
3ОтчествоИВАНОВИЧ
4Полмужской
5ГРН и дата внесения в ЕГРИП записи,
содержащей указанные сведения
314213009700255
07.04.2014
Сведения о гражданстве
6Гражданствогражданин Российской Федерации
7ГРН и дата внесения в ЕГРИП записи,
содержащей указанные сведения
314213009700255
07.04.2014
Сведения о регистрации индивидуального предпринимателя
8ОГРНИП314213009700255
9Дата регистрации07.04.2014
Сведения о регистрирующем органе по месту жительства индивидуального
предпринимателя
10Наименование регистрирующего органаИнспекция Федеральной налоговой службы
по г. Чебоксары
11Адрес регистрирующего органа,428032,,, Чебоксары г,, Базарная ул, д 40,,
12ГРН и дата внесения в ЕГРИП записи,
содержащей указанные сведения
314213009700255
07.04.2014
Сведения об учете в налоговом органе
13Идентификационный номер
налогоплательщика (ИНН\f
213000262765
14Дата постановки на учет07.04.2014
15Наименование налогового органаИнспекция Федеральной налоговой службы
по г.Чебоксары
16ГРН и дата внесения в ЕГРИП записи,
содержащей указанные сведения
414213009800211
08.04.2014

Выглядит немного беспорядочно. Но в итоге можно распарсить по ключевым словам

Единственная проблема закрывающей кавычкой. Так и не решил ее. Но в итоге мне это не помешало распарсить почти все данные.

На github есть issue, у человека возникла такая же проблема: github/smalot/pdfparser/issues/138.

Примерный алгоритм парсинга такой:

Идти по строкам подряд.
Если чтрока начинается с цифры, достаем заголовок поля.
Поскольку заголовоки повторяются то вводим понятие разделов и ключевые слова для них

Названия полей выделяем по ключевым словам, заменяем в тексте.

Используем стоп слова, стобы убрать лишние данные.

Распарсить выписку для ООО можно таким образом:

parseNalogOrg($pathOrg);

Для ИП:

parseNalogPe($pathPe);

В итоге получается примерно такой массив данных:

[common] => Array
(
[last_name] => ИВАНОВ
[first_name] => ИВАН
[middle_name] => ИВАНОВИЧ
[gender] => мужской
[grn_record] => 314213009700255 07.04.2014
)
[citizen] => Array
(
[citizen] => гражданин Российской Федерации
[grn_record] => 314213009700255 07.04.2014
)
[pe_register_info] => Array
(
[ogrnip] => 314213009700255
[register_date] => 07.04.2014
)
[register_org_info] => Array
(
[register_organization] => Инспекция Федеральной налоговой службы по г. Чебоксары
[register_organization_2] => ,428032,,, Чебоксары г,, Базарная ул, д 40,,
[grn_record] => 314213009700255 07.04.2014
)
[taxes] => Array
(
[inn] => (ИНН 213000262765
[account_date] => 07.04.2014
[account_organization] => Инспекция Федеральной налоговой службы по г.Чебоксары
[grn_record] => 414213009800211 08.04.2014
)
[pension] => Array
(
[register_number] => 015023040857
[register_date] => 09.04.2014
[organization_name] => Управление Пенсионного фонда Российской Федерации по г.Чебоксары Чувашской Республики
[grn_record] => 414213010010346 10.04.2014
[register_number_2] => 213005674221003
[register_date_2] => 19.10.2015
[grn_record_2] => 415213000168905 20.10.2015
)

Библиотека доступна на github: github/antonshell/egrul-nalog-parser

Спасибо за внимание!