Итоговые показатели
В базе 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 мбит и одно полное ядро ЦП, поэтому при желании можно запустить его в двух экземплярах на много ядерной машине.