Pull to refresh

Два года с кравлерами (web-mining)

Reading time 4 min
Views 3.7K
Disclaimer: этот топик, возможно, отчасти самореклама, «вода» и бред, но, скорее всего, это просто классификация информации и опыта, накопленного за два года работы в области скрейпинга, для себя и тех кому интересно.

За кармой не гонюсь, ее хватает.

Под катом — небольшой пост про современный рынок кравлеров/парсеров, с классификацией и особенностями.

Сабж


Мы говорим о «пауках», или программах, собирающих информацию в Сети. Пауки бывают разные — большинство лазят по вебу, некоторые парсят торренты, некоторые — fido/ed2k и прочие интересные штуки. Суть одна — в удобном заказчику виде предоставить нужную ему информацию.

К сожалению, С. Шульга (gatekeeper) слишком переоценил эту индустрию — добыча информации популярное дело, но тем не менее, технологии ИИ там применяются мало, и до автоматических советчиков далеко. В основном пауки делятся на несколько категорий, отличающихся сложностью применяемых методов.

Классификация


Простые кравлеры

Дешевые, простые скрипты, обычно на PHP, задача — последовательно выкачать сайт, сохранить в базу цены, аттрибуты, фото, возможно обработать. Стоимость проектов можете посмотреть на базах фрилансеров, она обычно смехотворна. В основном, одноразовые проекты. Банятся по IP или по скорости запросов.

Групповые кравлеры

Похожий проект мною реализовался для cenugids.lv. В этом случае множество (50+) кравлеров используют одну и ту же базу кода, вернее, это один кравлер с интерфейсами для нескольких источников (для cenugids.lv это были магазины). С основном используется для собра информации с похожих источников (форумы, магазины).

Поведенческие кравлеры

Подразумевает маскировку бота под человека. Заказчик обычно запрашивает определенную стратегию поведения — собирать инфу только в обеденный перерыв, по 2м страницам в минуту, на рабочей недели 3-4 дня в неделю, к примеру. В ТЗ может быть заложено даже прерывание на «отпуск» и смена «версии браузера» в соответствии с релизами.

Кеширующие кравлеры

Технически самое громоздкое решение, используется для скрейпа чего-то размером c ebay. Состоит обычно из нескольких частей — одна выцепляет из источника места, по которым стоит походить (например, для магазина это категории и страницы). Этот процесс происходит довольно редко, т.к. эта информация достаточно неизменна. Далее, через случайные промежутки времени паук ходит по «интересным местам» и собирает ссылки на данные (например, товары). Это ссылки опять-же обрабатываются со случайными задержками и заносятся в базу.

Это процесс не является периодическим, он идет постоянно. Паралельно с ним идет проверка старых ссылок — т.е. скажем раз в 5 минут выбираем 10 прокешированных товаров из базы и проверяем, живы ли они, не поменялась ли цена и аттрибуты.

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

Проблемы и методы



Обнаружение

Достаточно просто (хотя бы взглянув на статистику) понять что ваш сайт выкачивают. Количество запросов равное количеству страниц — что может быть более заметным? Обходится это обычно применением кеширующего кравлера и графиков кравлинга. Естественно, нельзя выбиваться за посещаемость целевого сайта.

Бан по IP

Самое простое, на что можно нарваться в начале войны с админом. Первый выход — использовать proxy. Минус — вам нужно поддерживать свою инфраструктуру, обновлять список proxy, передавать заказчику, и делать так чтобы это не завалилось в один момент. При одноразовых заказах, естественно, это отпадает. Хотя, у меня на реализацию такой инфраструктуры вместе с интерфейсами ушла неделя.

Вторым вариантом является Tor. Великая P2P сеть анонимизации, с идеальным интерфесом, где можно указывать желаемую страну и точку выхода. Скорость, в принципе, при кешируюших решениях, не так актуальна. Результативность достаточно хорошая — у меня один клиент до сих пор банит все exit points, правил iptables уже over 9000 (на момент написания 9873), а результата все еще нет…

Регистрация/авторизация

Тривиальная проблема, решаемая по мере получения опыта. Залогинились / записали куки / вошли / парсим. Капчи так же прекрасно ломаются.

Уход в бесконечность

Парсер может сойти с ума, если сайт каким-то образом генерирует бесконечное количество ссылок. Например, добавление osCsid (OsCommerce SessionID)/PHPSESSID каждый раз может заставить кравлер воспринимать ссылку как новую. Я видел магазины которые вообще при рефреше генерировали псевдослучайные ссылки (таким образом для поисковиков один товар был размещен на 50+ старницах с разными URL). Наконец, баги в источнике могут так же генерировать неограниченное количество ссылок (например, магазин, который показывал ссылку next и +5 страниц от текущей даже где-то на 7000+ пустой странице).

Кодировки

Как ни странно, самая большая пробелма — кодировки. cp1251? HTML entities? ПЯТЬ видов «пробелов» в таблице unicode? А если заказчик на выходе просит XML, и один неверный символ убивает simplexml намертво?

Весь список ошибок кодировок мне, наверное, даже лень указывать. Скажу просто — в постпроцессинге данных, в моем кравлере, обработка кодировок — почти ровно половина.

Платформа


Народ любит PHP. Обычно PHP+simplexml, или PHP+DOM/XPath. Xpath вообще незаменим, но у PHP систем есть два больших минуса — жрут и отваливаются. По 512 мегабайт на один кравлер — нормальное явление, при использовании mbstring, не говоря уже о coredump просто при попытки создать +1 тег в XML. При обработке небольших сайтов это назметно, но когда с источника выкачивается по 50+ мегабайт за раз… Поэтому, в основном, серьезные игроки с PHP уходят.

Мой выбор — Python. Кроме того же XPath, есть библиотеки для ed2k, kazzaa, торрентов, любых баз данных, идеальная обработки строк, скорость, стабильность и OOP. Плюс, возможность встроить туда свой мини-сервер для выдачи данных клиенту позволяет не ставить на сервер лишнего и оставаться незаметным — например, не успел забрать выдачу за 15 минут после полуночи — пинай на себя.

Заключение


Если кому-то интересно, могу описать отдельной статьей методы влома капч, обхода защиты по User-Agent, анализу выдачи серверов и парсингу не-веб источников. Есть вопросы? Добро пожаловать в камменты или личку!
Tags:
Hubs:
+30
Comments 31
Comments Comments 31

Articles