Эффективное хранение и доступ к веб-страницам с Python - PullRequest
1 голос
/ 10 октября 2009

Так что, как и многим людям, я хочу способ загрузки, индексации / извлечения информации и эффективного хранения веб-страниц. Моя первая мысль - использовать MySQL и просто перетаскивать страницы, на которых можно было бы использовать поиск FULLTEXT, что позволило бы мне легко выполнять специальные запросы (на случай, если я захочу увидеть, существует ли что-то и извлечь это и т. Д.). Но, конечно, с точки зрения производительности у меня есть некоторые проблемы, особенно с большими объектами / страницами и большими объемами данных. Так что это заставляет меня взглянуть на такие вещи, как CouchDB / поисковые системы / и т.д. Подводя итог, мои основные требования:

  1. Должно быть совместимо с Python (библиотеки / и т. Д.)
  2. Сохранение метаданных (URL, время извлечения, все отправленные мной сообщения GET / POST), код ответа и т. Д. Страницы, которую я запросил.
  3. Сохранение копии исходной веб-страницы, отправленной сервером (может быть содержимым, страницей поиска 404 и т. Д.).
  4. Извлечение информации с веб-страницы и сохранение ее в базе данных.
  5. Иметь возможность выполнять специальные запросы к существующему корпусу оригинальных веб-страниц (например, новый тип информации, которую я хочу извлечь, или посмотреть, сколько страниц содержит строку "fizzbuzz" или что-то еще в них) .
  6. И, конечно, он должен быть совместимым с открытым исходным кодом / Linux, меня не интересует то, что я не могу изменить или изменить.

Так что я думаю, что несколько широких вариантов:

  1. Бросить все в MySQL, использовать FULLTEXT, сходить с ума, при необходимости осколить контакт.
  2. Бросить метаданные в MySQL, сохранить данные в файловой системе или в чем-то подобном CouchDB, написать некоторые пользовательские элементы поиска.
  3. Вставить метаданные в MySQL, сохранить данные в файловой системе с веб-сервером (возможно, / ГГГГ / ММ / ДД / ЧЧ / ММ / СС / URL /), убедиться, что по умолчанию нет index.html / etc указан (каталог индексирует каждый каталог другими словами) и использует некоторую поисковую систему, такую ​​как Lucene или Sphinx , индексирует контент и использует его для поиска. Самым большим недостатком, который я вижу здесь, является неэффективность повторного сканирования сайта.
  4. Другие решения?

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

Ответы [ 3 ]

2 голосов
/ 10 октября 2009

Почему вы думаете, что решение (3), основанное на сфинксе, требует "многократного сканирования сайта"? Sphinx может принимать и индексировать множество различных источников данных, в том числе MySQL и PostgreSQL «нативно» (есть дополнительные надстройки для других БД, таких как Firebird) - вы можете хранить ваши HTML-документы в виде столбцов в БД, если хотите (современный PostgreSQL версии не должны иметь проблем с этим, и я думаю, что MySQL тоже не будет), просто используйте Sphinx превосходную индексацию и полнотекстовый поиск (включая stemming & c). В конце концов, все ваши метаданные поступают из заголовков (плюс тело HTTP-запроса, если вы хотите отслеживать запросы, в которых вы отправили данные, но никак не тело HTTP-ответа).

Одно важное практическое соображение: я бы порекомендовал стандартизировать UTF-8 - HTML придет к вам во всех видах странных кодировок, но не нужно сходить с ума, поддерживая это во время поиска - просто перекодируйте каждую текстовую страницу в UTF-8 по прибытии (из какой бы странной кодировки он не входил), до того, как его сохранить и проиндексировать, и жить долго и счастливо.

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

Кстати, Sphinx поставляется с привязками Python, как вы и просите.

1 голос
/ 10 октября 2009

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

  • позволяет отображать определенную страницу, как это было на исходном сайте
  • обеспечивает индексацию для поиска страниц, соответствующих определенным критериям поиска

HTML-код, лежащий в основе веб-страницы, когда-то выглядел немного похожим на автономный документ, но страницы, просканированные из сети, в настоящее время намного более беспорядочные: JavaScript, фрагменты ajax, рекламные разделы, блоки изображений и т. Д.
Эта реальность может заставить вас переосмыслить подход единого хранилища для всех html. (А также анализ / предварительная обработка просканированного материала, но это уже другая история ...)

С другой стороны, различие между метаданными и истинным текстовым содержимым , связанным со страницей, не нуждается в такой маркировке. Под «истинным текстовым содержанием» я подразумеваю [возможно, частично размеченный] текст с веб-страниц, который в противном случае свободен от всех других «шумов Web 2.0») Многие поисковые системы, включая Solr (поскольку вы упомянули Lucene) теперь можно смешивать два жанра в форме полуструктурированных данных. В оперативных целях (например, для задания сканеров и т. Д.) Вы можете хранить реляционное хранилище с метаданными, связанными с управлением, но идея заключается в том, что для целей поиска полевая и свободная текстовая информация может прекрасно сосуществовать (за счет предварительной обработки). большая часть входных данных).

0 голосов
/ 10 октября 2009

Звучит так, будто вам нужна система управления контентом. Проверьте Plone . Если это не то, что вам нужно, может быть, веб-фреймворк, такой как Grok, BFG, Django, Turbogears или что-то в этом списке . Если это тоже не хорошо, тогда я не знаю, о чем вы спрашиваете. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...