25.11.2009

Парсер-граббер nakolesah.ru

Был занят в свободное (от основной работы) время — делал халтуру, которая заключалась в просьбе написать парсер, чтобы сграбить структуру подбора колёс по автомобилю с сайта nakolesah.ru (естественно, на языке perl).
И вот сегодня он готов (начал в минувшее воскресенье) и проходит тестирование у заказчика. Приятно то, что это первый случай, когда моё хобби принесло небольшую денежку (которую я потрачу на другое хобби — охоту :) ).
Если любишь ты вордпресс – подпишись на RSS!

Не могу сказать, что парсер идеален. Меня упорно преследует ощущение, что всё можно было сделать проще и лучше :)
Но, помимо того, что это первый мой написанный на заказ скрипт, парсер nakolesah.ru для меня лично примечателен еще по нескольким причинами:

  • во-первых, я впервые применил многоуровневую структуру данных (раньше глубже списка, вложенного в хэш, не опускался) и разобрался с разыменовыванием ссылок соответственно;
  • во-вторых — впервые столкнулся с aspx-скриптами на сервере (откровенно говоря, осталось не самое приятное ощущение, по сравнению с perl и php. Впрочем, чего ожидать от microsoft?).

Структура данных после парсинга nakolesah содержит аж семь уровней вложенности, что поначалу несколько пугает и путает. Впрочем, благодаря отличной книге «Perl — изучаем глубже», разобраться в этом вопросе не очень сложно.

Вот небольшой кусочек структуры данных для наглядности:

 'Nissan' => {          'Terrano' => {                     '1994' => {                            '30Di' => {                                   'wheels' => {                                             '8 x 16 ET10' => {                                                      'Replacement' => 1                                                                 },                                             '7 x 15 ET12' => {                                                      'OEM' => 1                                                                 },                                             '8 x 18 ET' => {                                                      'Replacement' => 1                                                                },                                             '8 x 17 ET' => {                                                      'Replacement' => 1                                                                }                                                   }, 

При начале разработки я предполагал, что вложенность будет ещё глубже — за счёт добавления в конец дерева массива с характеристиками шин и дисков, но это оказалось не нужно.

А вот так выглядит результат работы парсера nakolesah.ru (вывод производится в XML-файл):

 <brand name="Chrysler"> 	<model name="Pacifica"> 		<year value="2005"> 			<modifi name="35i"> 				<type name="wheels"> 					<label name="8 x 17 ET38"> 						<completion>Replacement</completion> 						<axle> </axle> 					</label> 					<label name="7,5 x 17 ET45"> 						<completion>OEM</completion> 						<axle> </axle> 					</label> 					<label name="8 x 19 ET35"> 						<completion>Replacement</completion> 						<axle> </axle> 					</label> 					<label name="8 x 18 ET35"> 						<completion>Replacement</completion> 						<axle> </axle> 					</label> 				</type> 				<type name="tires"> 					<label name="235/60 R18"> 						<completion>Replacement</completion> 						<axle> </axle> 					</label> 					<label name="235/65 R17"> 						<completion>OEM</completion> 						<axle> </axle> 					</label> 					<label name="235/55 R19"> 						<completion>Replacement</completion> 						<axle> </axle> 					</label> 				</type> 			</modifi> 

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

С наилучшими пожеланиями, dimio!


Что бы Ктулху не воскрес – подпишись на RSS!

Здесь можно оставить свои комментарии. Выпуск подготовленплагином wordpress для subscribe.ru

Ссылки по теме:



0 коммент.:

Отправить комментарий

Спасибо за комментарий!