GrabDuck

Парсинг для начинающих. Практическая работа. Часть I

:

До начала второй части отпуска осталось 4 дня. Использую это время с пользой — напишу статью на блог. :)

Итак, долой теорию, переходим к практике парсинга. Соберем с какого-нибудь сайта структурированную информацию. Исходя из того, что для примера структура должна быть простой, я выбрала обредший небывалую популярность во время кризиса сайт по поиску работы hh.ru. Еще мой выбор обоснован тем, что с этим сайтом я довольно-таки давно и тесно "работаю" :D. Парсить в этот раз мы будем не вакансии, а информацию о предприятиях.

По ссылке http://hh.ru/employersList.do можно увидеть список компаний, имеющих на данный момент открытые вакансии. Отметив чекбокс "Показать компании, у которых нет открытых вакансий" и нажав на кнопку "Найти" получаем список всех предприятий (на момент написания статьи — 76 101). База немаленькая. Если парсить в один поток и делать перерыв между загрузками 2 секунды, то процесс займет около двух суток.

Рассмотрим структуру выдачи. Get-запрос будет следующим:

http://hh.ru/employersList.do?letter=&employerName=&areaId=113&companyWithoutVacancy=on&page=[PageNum]

[PageNum] — номер страницы. Нумерация начинается с нуля.

Необходимая нам информация о предприятии:
- название;
- ссылка на сайт;
- описание предприятия;
- ссылка на источник информации.

Последний пункт — URL страницы, с которой берется информация (ссылка вида http://hh.ru/employer/[ID]). Мы будем парсить постранично список с предприятиями, потом заходить по каждой ссылке и брать подробную информацию. "Почему такой способ, а не перебор всех ID по порядку в ссылке http://hh.ru/employer/[ID]?" — спросите вы. Отвечу: "Да потому, что это менее затратно". Идентификаторов гораздо больше, чем "действующих" ссылок (например, наберите http://hh.ru/employer/4 — увидите своими глазами, что предприятия с таким ID не существует).

Итак, алгоритм:
1) скачиваем первую страницу списка фирм;
2) находим все ссылки на предприятия;
3) если ссылки есть - заходим по каждой ссылке и получаем детальную информацию, записываем; если ссылок нет — заканчиваем работу;
4) загружаем следующую по счету страницу;
5) повторяем пункты 2 — 4.

Скачивать страницу можно любым из способов, о которых я писала в блоге (мне привычней старый добрый Get).

Как находить ссылки на предприятия? Способов тоже несколько:
1) в содержимом страницы по регулярному выражению;
2) просмотреть весь массив ссылок, найденный через DOM, и отобрать ссылки, начинающиеся с "/employer/".

По каждой найденной ссылке зайти и найти информацию о компании + адрес сайта. Полученные результаты сохранить. Тут уж кто как привык. Можно сразу в базу. Мне, допустим, удобней и привычней записать сначала все в List, а потом уже с ним делать все, что угодно.

Для компаний я создала класс TCompany:

type
TCompany = class
N : integer;
CName,
CURL,
CInfoURL,
CInfo : string;
end;

TCompanies = class (TList)
function IsNewCompany (sLink : string) : boolean;
procedure LoadFromQuery ( Query : TpFIBDataSet );
destructor Destroy; override;
end;

TCompanies — класс для работы со списком предприятий.

Интерфейс получился такой:
parsing hh.ru

Продолжение следует.

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