Некоторое время назад, обещал написать инструкцию, по обработке Книг Памяти. Пошаговой инструкции не получится, так как даже в пределах одного тома структура данных районов может различаться. Постараюсь описать действия подробней, чтобы был понятен алгоритм и можно было подстроиться под локальные особенности конкретного района.
В некоторых вопросах, у меня не хватает знаний, поэтому решения не всегда оптимальные, буду рад советам/исправлениям. Ниже, трудозатраты для каждого из этапов указаны на примере Можгинского района (200 страниц, 8000 записей). Итак, основные этапы:
- Скачивание данных. Суммарно заняло три дня, утром уходя на работу ставил закачку, вечером приблизительно 1 час уходил на обработку результатов скачивания.
- Распознавание скачанных изображений программой FineReader. Самый трудоемкий процесс, потратил на этот этап два выходных, приблизительно 20-25 часов работы.
- Нормализация распознанных данных. Приблизительно 3-4 часа.
- Сопоставление распознанных и скачанных данных. Приблизительно 3-4 часа.
- Финальная сверка и привязка НП. Приблизительно 3-4 часа.
Каждый этап, будет описан в отдельной статье. В этой, поговорим о скачивании изображений и данных.
Скачивание изображений.
Для массового скачивания, я использовал расширение для Google Chrome - Web Scraper. После установки расширения открываем сайт obd-memorial.ru и нажимаем клавишу F12, справа откроется консоль, для удобства переместим консоль в нижнюю часть браузера.
Выбираем пункт Web Scraper, затем Create new sitemap, затем Import sitemap и загружаем следующий код в поле Sitemap JSON:
{"selectors":[{"parentSelectors":["_root"],"type":"SelectorElement","multiple":false,"id":"Select Image","selector":"img#image","delay":""},
{"parentSelectors":["Select Image"],"type":"SelectorImage","multiple":false,"id":"Image","selector":"_parent_","downloadImage":true,"delay":""}],
"startUrl":"https://www.obd-memorial.ru/html/info.htm?id=404169001&page=[1-533]",
"_id":"obd_image"}
Далее во вкладке Sitemaps выбираем загруженный профиль obd_image, нажимаем Sitemap, далее Edit Metadata и в поле Start URL указываем диапазон ссылок, с которой будем работать. В квадратных скобках указан диапазон номеров страниц для скачивания. Например, если хотим скачать сканы всех страниц первого тома Книги Памяти Удмуртской Республики, необходимо указать:
https://www.obd-memorial.ru/html/info.htm?id=404169001&page=[1-533]
После этого кликаем Sitemap -> Scrape. И ждем, когда скачаются все изображения.
UPD 26.12.2017: После последнего обновления Chrome, потоковое скачивание больше не работает. В результате получается только список ссылок. По этому списку изображения можно скачать используя любой менеджер закачки.
Скачивание данных.
Процедура полностью аналогична скачиванию изображений. Если выставлять скачивание больше 300 страниц одновременно, у меня скрэппер зависал, поэтому при скачивании данных, указывал не более 300 страниц одновременно. Процесс очень длительный, по очереди открываются все ссылки на странице, сбор данных продолжается несколько часов. Код:
{"selectors":[{"parentSelectors":["_root"],"type":"SelectorElement","multiple":false,"id":"Картинка","selector":"img#image","delay":""},
{"parentSelectors":["Картинка"],"type":"SelectorImage","multiple":false,"id":"Картинка образ","selector":"_parent_","downloadImage":false,"delay":""},
{"parentSelectors":["_root"],"type":"SelectorLink","multiple":true,"id":"Ссылки","selector":"area","delay":""},
{"parentSelectors":["Ссылки"],"type":"SelectorElement","multiple":false,"id":"Запись","selector":"div#result_div table.info_table","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Номер записи","selector":"td.id_result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 1","selector":"tr:nth-of-type(4) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 2","selector":"tr:nth-of-type(4) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 3","selector":"tr:nth-of-type(5) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 4","selector":"tr:nth-of-type(5) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 5","selector":"tr:nth-of-type(6) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 6","selector":"tr:nth-of-type(6) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 7","selector":"tr:nth-of-type(7) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 8","selector":"tr:nth-of-type(7) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 9","selector":"tr:nth-of-type(8) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 10","selector":"tr:nth-of-type(8) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 11","selector":"tr:nth-of-type(9) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 12","selector":"tr:nth-of-type(9) td.result","regex":"","delay":""},
{"parentSelectors":["_root"],"type":"SelectorText","multiple":false,"id":"Код страницы","selector":"td.id_result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 13","selector":"tr:nth-of-type(10) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 14","selector":"tr:nth-of-type(10) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 15","selector":"tr:nth-of-type(11) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 16","selector":"tr:nth-of-type(11) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 17","selector":"tr:nth-of-type(12) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 18","selector":"tr:nth-of-type(12) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 19","selector":"tr:nth-of-type(13) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 20","selector":"tr:nth-of-type(13) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 21","selector":"tr:nth-of-type(14) td.title","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 22","selector":"tr:nth-of-type(14) td.result","regex":"","delay":""},
{"parentSelectors":["Запись"],"type":"SelectorText","multiple":false,"id":"Запись 23","selector":"tr:nth-of-type(n+15) td","regex":"","delay":""}],
"startUrl":"https://www.obd-memorial.ru/html/info.htm?id=404169001&page=[1-533]",
"_id":"obd_data"}
После завершения сбора данных, сохраняем их в csv. Затем результат импортируем в Excel.
PS: Список Книг Памяти опубликованных на сайте obd-memorial.ru:
Том | Содержание | Ссылка | Таблица | Сканы | Комментарий |
КО 1 | Арбажский, Афанасьевский, Белохолуницкий | Ссылка | Таблица | ||
КО 2 | Богородский, Верхнекамский, Верхошижемский, Вятскополянский | Ссылка | пропущены стр. 65-80 | ||
КО 3 | Даровский, Зуевский, Кикнурский | Ссылка | |||
КО 4 | Кильмезский, Кирово-Чепецкий | Ссылка | |||
КО 5 | Куменский, Котельнический | Ссылка | |||
КО 6 | Лебяжский, Лузский, Малмыжский, Мурашинский | Ссылка | |||
КО 7 | Нагорский, Немский, Нолинский | Ссылка | |||
КО 8 | Омутнинский, Опаринский, Оричевский, Орловский | Ссылка | |||
КО 9 | Пижанский, Подосиновский, Санчурский | Ссылка | |||
КО 10 | Свечинский, Слободской | Ссылка | |||
КО 11 | Советский, Сунский, Тужинский | Ссылка | |||
КО 12 | Унинский, Уржумский | Ссылка | |||
КО 13 | Фаленский, Шабалинский | Ссылка | |||
КО 14 | Юрьянский, Яранский, Дополнительные списки | Ссылка | |||
КО 15 | Киров | Ссылка | |||
КО 16 | нет | ||||
КО 17 | Дополнительные списки | Ссылка | |||
КО 18 | Дополнительные списки | Ссылка | |||
КО 19 | нет | ||||
КО ФСБ | Книга Памяти ФСБ | Ссылка | нет | ||
УР 1 | Алнашский, Граховский, Кизнерский, Можгинский | Ссылка | Таблица | Сканы | |
УР 2 | Вавожский, Игринский, Селтинский, Сюмсинский, Увинский | Ссылка | Сканы | ||
УР 3 | Воткинский, Дебесский, Завьяловский, Якшур-Бодьинский | Ссылка | |||
УР 4 | Глазовский, Красногорский, Юкаменский, Ярский | Ссылка | |||
УР 5 | Балезинский, Кезский, Шарканский | Ссылка | |||
УР 6 | Камбарский, Каракулинский, Киясовский, Малопургинский, Сарапульский | Ссылка | пропущены стр. 369-384 | ||
УР 7 | Ижевск, Дополнительные списки | Ссылка | Таблица | ||
УР 8 | Дополнительные списки, Воины умершие в госпиталях на территории Удмуртии | Ссылка | Таблица | пропущены стр. 23 и 24 | |
УР 9 | Дополнительные списки | Ссылка | Таблица | ||
РТ 1 | Агрызский | Ссылка | |||
РТ 6 | Балтасинский | Ссылка | |||
РТ 9 | Елабужский | Ссылка | |||
РТ 14 | Кукморский | Ссылка | пропущены стр. 249-256 | ||
РТ 16 | Менделеевский | Ссылка | пропущены стр. 265-272 |
Виктор, большое спасибо, что делишься опытом!
К сожалению, из-за обновлений Chrome этот метод уже не работает, поэтому пока на паузе.
Кировская область, том 2. На ОБД "Мемориал" отсутствуют сканы страниц с 65 по 80 (всего 16 страниц) - Богородский район.
По таким случаям придётся смотреть оригиналы КП в библиотеке.
Т.к. проблема серийная добавил отдельную колонку для пропущенных страниц
Перепроверил все остальные районы. Подтверждаю пропуски в томе УР-8. Больше пропусков нет.
КП УР. Том 6 - пропущены страницы 369-384.
КП РТ. Том 14 - пропущены страницы 249-256 (Кукморский район)
КП НО. Том 13 - пропущена страница 227 (Шарангский район)
КП РТ. Том 16 - пропущены страницы 265-272 - это Мамадышский район - он вроде бы нас не интересует, Менделеевский начинается со стр. 273.
Но там не совсем понятно, т.к. заголовочные страницы Менделеевского района не пронумерованы, может быть наоборот не хватает 267-273 по Менделеевскому району.
Менделеевский район буду делать, проверю.
Сканы по всем томам выкачал, вот ссылка: https://drive.google.com/drive/folders/1TOL28xjlJiBB_WmE89eLk3_syv9sT02V...
(кроме 1-го тома по Удмуртии, который уже полностью готов)
Использовал другой метод (написал свою программу).
Догружаю в облако КП ФСБ Кировской области, КП по 5 районам Татарстана и КП Большесосновского района. Выгрузка ещё по 3 томам в процессе.
Все сканы загружены: https://drive.google.com/drive/folders/1TOL28xjlJiBB_WmE89eLk3_syv9sT02V
Данные тоже (там же, подпапка _Таблицы)