Итак, долой теорию, переходим к практике парсинга. Соберем с какого-нибудь сайта структурированную информацию. Исходя из того, что для примера структура должна быть простой, я выбрала обредший небывалую популярность во время кризиса сайт по поиску работы 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 — класс для работы со списком предприятий.
Интерфейс получился такой:
Продолжение следует.
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
Комментариев нет:
Отправить комментарий
Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.
К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?