как получить URL-адреса из Dmoz ODP - PullRequest
0 голосов
/ 24 декабря 2009

Я хочу использовать базу данных URL-адресов, присутствующих в DMOZ ODP, для моего приложения. (массив строк URL или файл, содержащий то же самое). Есть ли какой-нибудь способ его получения (кроме копирования-вставки вручную)?

РЕДАКТИРОВАТЬ:

Есть ли скрипт / код для разбора файла rdf ..

Ответы [ 3 ]

4 голосов
/ 17 января 2010

Взгляните на http://rdf.dmoz.org/,, вам нужно будет найти способ проанализировать RDF в вашей базе данных.

Я сделал это на днях, используя odp2db скрипты из программного обеспечения Стива . Они старые, но формат существенно не изменился, поэтому они отлично работают.

Я обнаружил, что мне не нужно выполнять шаги iconv и xmlclean.pl, предложенные в файле readme, просто распаковал дампы и запустил сценарии structure2db.pl и content2db.pl. Вам нужно будет создать таблицы базы данных вручную (см. SQL-код в верхней части сценария) и изменить детали подключения в сценариях перед началом работы.

С дампом середины января 2009 года я использовал 756 962 категории и 4 436 796 веб-сайтов. Потребовалось некоторое время, чтобы пройти их все, но не слишком долго, хотя я обошелся без описания сайта, поскольку они мне не нужны. Также, возможно, стоит добавить индексы базы данных после создания таблиц, чтобы ускорить доступ позже. Необработанные файлы структуры и содержимого были сжаты 75 МБ и 300 МБ соответственно. 848 МБ и 2 ГБ соответственно.

2 голосов
/ 12 февраля 2010

Я на самом деле сделал это в Java. Я просто использовал SAX API для чтения файлов RDF. Это было довольно просто. В моем случае я хотел вытащить каждый URL, который был в теме с "Weblogs" в названии темы.

В основном то, что было реализовано org.xml.sax.helpers.DefaultHandler

Затем для настройки кода вы делаете:

       InputSource is = new InputSource(new FileInputStream("filename.rdf"));
       XMLReader r = XMLReaderFactory.createXMLReader();
       r.setContentHandler(new MyHandlerClass());
       r.parse(is);

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

  • startElement(String uri, String localName, String qName, Attributes attributes) тогда у меня был оператор if, чтобы увидеть, был ли это тег «ExternalPage», и в этом случае я перешел в другое состояние, чтобы найти «topic», «Title» и «Description». У меня был другой

  • characters(char[] ch, int start, int length) где я читаю в теме, заголовке и тексте описания в зависимости от того, какой из них был последний раз отправлен на startElement

  • endElement(String uri, String localName, String qName) где я проверил, какой элемент заканчивается, и если это ExternalPage, то это означает конец текущего элемента.

Всего было 80-90 строк кода для базового разбора. Так легко написать. Он мог прожевать мультигигабайтные файлы в ... Не помню, может быть, минуту или две? Если вы просто хотите запросить некоторые конкретные данные, может быть проще написать код для этого в вашем обработчике, а не пытаться загрузить его в БД.

Если вы найдете инструмент, который работает хорошо, это, очевидно, лучше, чем писать собственный код. Но написание собственного кода не сложно! RDF - это просто формат XML, и он не является вложенным или чем-то еще. Простой SAX-парсер легко выполним за день или около того.

0 голосов
/ 10 февраля 2010

Вы всегда можете заплатить одному из редакторов, и они вам помогут

...