Как сохранить целые веб-страницы для последующего анализа? - PullRequest
1 голос
/ 03 июля 2010

В последнее время я много раз анализировал веб-страницы, и мой процесс обычно выглядит примерно так:

  1. Получить список ссылок на Parse
  2. Импорт списка в базу данных
  3. Загрузите всю веб-страницу для каждой ссылки и сохраните в mysql
  4. Добавить индекс для каждого сеанса очистки
  5. Очистить соответствующие разделы (содержание, мета, что угодно)
  6. Шаги 4,5 - Промыть / Повторить - как это часто бывает, чтобы очистить diff. позже с той же страницы, или измените ваш xpath, или удалите указанное содержимое или что-то еще.
  7. Экспорт базы данных очистки в реальную базу данных и удаление столбца веб-страницы и индексов очистки

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

Позвольте мне привести несколько примеров проблем, с которыми я постоянно сталкиваюсь: для 50k страниц (строк) у меня есть база данных по 6 гигабайт. Помните, что мы храним ВСЮ веб-страницу в одном столбце, извлекаем из нее соответствующие данные и сохраняем их в другом столбце.

Создание индекса на столе может занять 7-10 минут на четырехъядерном процессоре с 6 гигабайтами оперативной памяти. Дай Бог, чтобы ты что-то напортачил и наблюдал, как mysqld прыгает на 70% процессора и ВСЕХ твоего барана. Вот почему у меня есть шаг 4 - при каждой операции, которую я делаю, перед тем, как сделать это, я добавляю индекс в столбец, поэтому, если я хочу получить метас, я добавлю индекс, скажем, в столбец заголовка, а затем обновлю строка, в которой заголовок не равен нулю.

Я должен заявить, что я НЕ делаю все строки за один раз - что, как правило, приводит меня в замешательство - как следует - вы загружаете 6 гигабайт в память. ;)

Я полагаю, что решение этой проблемы заключается в том, чтобы взять общий счет и затем выполнить итерацию смещения около 100 за раз.

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

EDIT Просто чтобы прояснить это - любое представленное решение должно учитывать тот факт, что 50 КБ страниц - это ОДНА ГРУППА ОДНОГО ПОЛЬЗОВАТЕЛЯ. Я пока не пытаюсь создать несколько пользователей, но мне бы хотелось иметь возможность хранить более пары пакетов одновременно.

Ответы [ 4 ]

2 голосов
/ 03 июля 2010

Почему бы вам не добавить индекс в таблицу ДО вставки ваших данных? Таким образом, индекс строится при добавлении строк в таблицу.

1 голос
/ 03 июля 2010

Если у вас есть больше оборудования для решения этой проблемы, вы можете начать распределять свою базу данных по нескольким серверам, используя sharding .

. Я бы также предложил вам удалить ненужную информацию иззаписываемые веб-страницы (например, теги структуры страницы, JavaScript, стилизация и т. д.) и, возможно, сжатие результатов, если это необходимо.

0 голосов
/ 03 июля 2010

Спасибо, что помогли мне все обдумать!

Я собираюсь попробовать гибридный подход здесь:

1) Свернуть страницы в древовидную структуру в файловой системе.

2) Поместите содержимое в общую таблицу содержимого, которая не содержит какой-либо полной веб-страницы (это означает, что наш средний столбец 63 КБ теперь может составлять 1/10 от k.

ДЕТАЛИ

1) Моя древовидная структура для размещения веб-страниц будет выглядеть так:

-- usr_id1k
|   |-- user1
|   |   |-- job1
|   |   |   |-- pg_id1k
|   |   |   |   |-- p1
|   |   |   |   |-- p2
|   |   |   |   `-- p3
|   |   |   |-- pg_id2k
|   |   |   `-- pg_id3k
|   |   |-- job2
|   |   `-- job3
|   |-- user2
|   `-- user3
|-- usr_id2k
`-- usr_id3k

2) Вместо того, чтобы создавать таблицу для каждого «задания» и затем экспортировать ее, у нас будет пара разных таблиц, основной из которых будет таблица «содержимого».

content_type, Integer # fkey to content_types table
user_id, Integer # fkey to users table
content, Text # actual content, no full webpages

.... другие вещи, такие как созданный_объект, обновленный_тем, химическая завивка и т. Д. *

0 голосов
/ 03 июля 2010

Вы можете использовать существующий веб-сканер , например wget или один из множества других. Это может загрузить файлы на жесткий диск, а затем вы сможете проанализировать файлы и сохранить информацию о них в базе данных.

...