Поиск по блогу

пятница, 19 февраля 2010 г.

Составление технического задания (ТЗ) на разработку парсера

Ко мне очень часто обращаются по поводу разработки парсеров. В принципе, я и стремилась именно к этому, когда заводила блог "Парсинг от А до Я". Проанализировав обращения потенциальных заказчиков, я поняла: чтобы облегчить себе жизнь - я должна написать о том, в каком виде хотелось бы получать заказы. Иначе - только четверть обращается с ТЗ, по которому нужны минимальные уточнения (либо даже не нужны совсем). Остальные - с общими фразами "нужно спарсить данные с такого-то сайта. оцените сроки и стоимость, во сколько мне обойдется это, если я закажу парсер вам?". Исходя из чего я должна оценивать сложность и объем работ при такой формулировке?

Итак, грамотное техническое задание - залог того, что не понадобится недельная переписка, чтобы клещами вытянуть из заказчика описание того, чего именно он хочет. Даже если вы заказываете парсер не у меня :) , ТЗ будет полезно. В первую очередь - вам самим, бо вы поймете и сформулируете в письменном виде свои пожелания.

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

1) Название ресурса, ссылка. Если необходим парсер только определенного раздела или разделов - указываете здесь же с перечислением всех ссылок (или с перечислением тех ссылок, которые надо исключить).

2) Данные или инструмент? Что вы хотите получить в итоге? Может, вам просто единоразово требуется получить данные? Или вам нужна программа/скрипт для того, чтобы самостоятельно получать требующиеся вам данные в любое время?

3) Если вам нужен "инструмент"
3.1. Это должен быть скрипт, парсер в виде десктопного приложения или все равно? У каждого вида есть определенные особенности. Скрипты обычно заказывают те, кто хочет запускать их по расписанию на хостинге, чтобы, например, регулярно обновлять данные на своем сайте. Вам подойдет десктопное приложение, если данные, полученные в результате парсинга, будут вами как-нибудь обрабатываться (возможно, автоматизированно) и анализироваться, прежде чем "пойдут" дальше. Причины выбора того или иного исполнения могут быть разными.

3.2. Входные данные и настройки. Надо ли предусматривать настройку парсера перед запуском и какую именно? Это касается не только регулярных выражений, обычно я их и так выношу в отдельный конфигурационный файл, чтобы при необходимости поменять без перекомпиляции приложения (если это десктопный парсер). Под настройками я в этом пункте имею в виду возможность задавать какие-либо входные параметры. Например, ключевое слово при парсинге выдачи (или список таких слов, который можно загружать из файла). Или выбор категорий, в которых парсить. Настройка задержки в секундах между запросами. И так далее.

3.3. Нужна ли поддержка работы через прокси-листы? Или какой-нибудь иной метод преодоления защиты от ботов, если таковая имеется на сайте?

4) Формат данных.
В каком виде вы хотите получить результирующие данные? Текстовый файл или база данных? У вас разработана структура базы (в этом случае следует ее приложить) или вы хотели бы, чтобы я сама ее разработала? Когда дело доходит до обсуждения этого пункта, я обычно прошу прислать скрины страниц ресурса-"донора" с выделенными (или каким-то другим образом помеченными) в графическом редакторе блоками. Это еще и играет роль гаранта, что клиент потом не скажет, что имел в виду другое и что мы друг друга не поняли. Если требуемая информация состоит из перечня "параметр - значение" (в большинстве интернет-магазинов), то следует оговорить, надо ли каким-то образом разбивать ее на поля или "выдирать" одним целым, прямо с версткой (например, в виде таблицы). Естественно, что от всего этого напрямую будет зависеть цена.

5) Оплата.
Для кого-то это очень щекотливая тема. Ничего щекотливого в ней не вижу. Свое рабочее время оцениваю 10$/час, прикидываю, сколько потрачу "чистого" времени, определяю сумму, потом по времени буру период с небольшим запасом, чтобы можно было потестировать. Если требуются только данные - пишу парсер и запускаю. Данные предоставляю после отработки программы (когда сайты большие - заранее время определить не могу, тут уж как все сложится - так сложится). Предоплата - 50%.

Если у вас ограниченный бюджет - так прямо и скажите. Лучше не юлить и не спрашивать после оглашения цены, нельзя ли сделать за вот столько-то. Иногда я соглашаюсь на заказы, когда клиент прямо оглашает цену, даже если цифра меньше той, за которую я обычно выполняю проекты аналогичной сложности. Для иллюстрации этого пункта как нельзя лучше подойдет вот этот ролик (я его просто обожаю - настолько там четко все подмечено):


И напоследок еще одна просьба :) Пожалуйста, не напускайте на ваши объяснения таинственности и загадочности. Не бойтесь подробно описывать ваши идеи и требования, уверяю вас, они мне не нужны, у меня самой столько идей, что на их реализацию потребовалось бы не одно десятилетие. Чем подробнее вы все опишете, тем больше шансов, что наше сотрудничество (если такому суждено состояться) будет плодотворным и обоюдоприятным. :) Со своей стороны даю гарантию, что ваши идеи за пределы работы над проектом по вашему заказу не выйдут.

Желаю удачи всем заказчикам! Ну и фрилансерам заодним :))
____

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

четверг, 4 февраля 2010 г.

Работа с библиотекой Synapse в Delphi - начало

Обычно для работы с инетом в своих приложениях я использую компоненты Indy или сокеты. И вот решила, что неплохо было бы расширить свой кругозор и познакомиться с другими библиотеками (и будет вдвойне приятно, если это знакомство окажется полезным).

Первое, что я решила опробовать, это библиотека Synapse. Я уже не раз встречала упоминания о ней, но все как-то не доводилось поработать.

Скачиваем, устанавливаем.

Установка Synapse

(в моем случае на старенький Delphi 7).

1. Распаковать архив в какую-нибудь папку (в Source, например)
2. В меню идем Tools - Environment Options - Library и добавляем в Library Path путь к папке ..Source\SYNAPSE\LIB
3. В новосозданном проекте добавляем в Uses-ы httpsend и synacode (при надобности).

Пришло время "HelloWorld"-а.

Простые примеры кода с использованием Synapse


Давайте начнем с самых простых вещей - с получения содержимого страницы.

Поместим на форму кнопку и TMemo, добавим в uses httpsend, напишем обработчик нажатия кнопки:

procedure TMainF.Button1Click(Sender: TObject);
begin
if not HttpGetText('http://parsing-and-i.blogspot.com', Memo1.Lines) then
ShowMessage('Что-то не получилось.');
end;

После нажатия на кнопку в мемо появилось содержимое страниц. Старт взят: с помощью HttpGetText задачу выполнили.

Дальнейшее изучение библиотеки можно проводить так — заглянуть непосредственно в файл библиотеки (httpsend.pas). Главным классом является THTTPSend. Даже просто изучив его структуру, можно понять принципы работы и возможности.

Итак, HTTPSend.Document возвращает содержимое всего документа. Поэкспериментируем с использованием еще каких-нибудь элементарных функций. Например, получим заголовок страницы и отдельно код ответа.

Поделиться