[about] [index] [prev] [2021-10-13 22:02:09+03:00] [2ceefeb3cb19e64f869660906306d1df9d72edfd]
Topics: [web]

tofuproxy теперь ещё и WARC броузер

http://www.tofuproxy.stargrave.org/WARCs.html
Ещё одна давняя многолетняя хотелка воплотилась в жизнь! tofuproxy
теперь ещё поддерживает загрузку WARC файлов. Идея и формат WARC-ов мне
нравятся, особенно учитывая что их даже GNU Wget умеет создавать. Но вот
смотреть их -- боль. Потому что почти весь инструментарий написан на
Python (ну ещё на Java, но в её сторону не смотрю, ибо тёмный это для
меня мир) и паршивого качества, который ещё и не поставить
(587711a01f7226bc45fa1a59177e5dccb3f61310).

Раз tofuproxy может выступать в роли и HTTPS сервера/прокси, то и
никаких проблем с ссылками на HTTPS ресурсы. Не нужно париться с
переконвертацией ссылок в документах, чтобы броузер долбился по HTTP и
WARC-capable прокси сервер мог бы нормально отвечать.

Посмотрел на несколько WARC библиотек на Go, пару даже использовал, но в
итоге написал полностью свою реализацию по чтению этих WARC-ов.
Некоторые реализации отмечаю потому что они полностью считывают хотя бы
одну запись в память -- если это WARC coursera.org, то в одной записи
легко может содержаться многосотмегабайтное видео. Не гоже. Некоторые
отмёл просто потому что не нравится как написаны, плохой код, где автор
не всё до конца в Go понимает (создавалось такое впечатление). А
некоторые наоборот слишком монструозны. Ну и главное: не все
поддерживают WARC-и в которых записи разделены на сегменты: часть ответа
может быть в одном WARC, а часть уже в другом. И не во всех можно узнать
хоть какой-нибудь offset по которому можно было бы быстро прыгнуть на
нужную запись в файле.

Вот и родилась собственная реализация. Которая поддерживает и .gz/.zst
сжатые файлы, но без возможности перемещаться по потокам этого gzip-а.
Чтобы достать запись из WARC-а, придётся с самого начала его
декомпрессировать. Поэтому лучше конечно иметь голый .warc, пускай и на
сжатом ZFS dataset-е. Но возможно и добавлю возможность перемещаться
оптимальнее.

Через FIFO файлы можно указывать какие WARC-и надо загрузить. Можно
удалить. Можно зайти на http://warc/ и посмотреть список всех известных
URL-ов загруженных из них. Суть работы тривиальна: просто ищем по URL-у
нет ли такого в WARC-ах и, если нашли, то отдавать ответ из WARC-а.
Вполне себе работает отлично на практике.

Конечно же можно индексы, после парсинга WARC-ов, сохранить на диск,
повторно их уже быстро загружая сразу в память. Думал приделать
поддержку CDX индексов (https://archive.org/web/researcher/cdx_legend.php),
но в них нельзя выразить знание о сегментированных записях. По идее не
проблема, но такой индекс уже не универсален, поэтому я просто сбрасываю
в gob формате.

[leave comment]