Итоговые показатели

В базе 1000 доменов, 606 рекламных блоков, 40`201 уникальных объявлений

Всего обработано 39`168`500 рекламных блоков за 23ч. 00м. 52с..

Средняя скорость обработки 472.75 блоков в секунду.

Поиск объявлений

А поиск отключен за давностью лет, но можно скачать дамп БД =)

Исходная задача

Имеется 1000 доменов, нужно с каждого собрать текстовые Google Adsense объявления (к ним относятся заголовок, текст, адрес сайта, на который ссылается реклама).

Реализовать полнотекстовый поиск по объявлениям и веб-интерфейс к нему.

Объявлений нужно собрать как можно больше за время не более одних полных суток.

Решение

В качестве хранилища была взята mysql (innoDB), поскольку оказалась под рукой. По хорошему надо заменить её на что-либо с быстрой и асинхронной записью (тот же mongoDB) и поставить для полнотекстового поиска Sphinx (сейчас используется зеркало в MyISAM).

За сбор данных отвечают два фоновых скрипта - checker и loader. Написаны на python с использованием curl (реализация на php полностью аналогична, просто curl multi там бывает зависает без видимых причин).

checker

Раз в несколько часов скрипт выкачивает главные страницы всех доменов и парсит оные на предмет кода гуглрекламы. Из всех найденных кодов формируются ссылки на гугловский сервис раздачи рекламы и сохраняются в БД.

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

На все действия уходит около полутора минут. За это время с 1000 доменов собирается около 600 рабочих рекламных блоков.

loader

Выбираются несколько ссылок на рекламные блоки и каждая из них загружается некоторое количество раз. Ответы парсятся на текстовые объявления и уникальные пары оных (ссылка+заголовок) сохраняются в БД.

Периодичность запуска скрипта зависит от количества ссылок и повторов каждой из них.

В моём случае за раз обрабатывались все 620 ссылок по 100 загрузок каждой (около двух минут по времени).

Один работающий скрипт забил канал на 40 мбит и одно полное ядро ЦП, поэтому при желании можно запустить его в двух экземплярах на много ядерной машине.

сорцы