Парсер базы nakolesah.ru

Грабим nakolesah.ru

Пример работы парсера сайта nakolesah.ru

Уф, докрутил парсер nakolesah до вменяемого состояния и сграбил подбор шин по автомобилю. Кому интересно — ссылка на сам скрипт в конце поста.

Что-то в нём ещё буду менять, не очень мне нравится логика работы нынешняя, основанная на GET-запросах (тогда как браузер получает всю информацию, обращаясь к asp-скрипту с передачей разных параметров в POST-запросе). У меня POST только в конце, а надо бы попробовать работу браузера полностью скопировать, да времени особо не было разбираться.

Ещё не нравится костыль в виде функции замены названий моделей машин. При парсинге nkolesah столкнулся с проблемой (актуально только для работы GET-запросами) разных имён марок и модификаций машин в выпадающих списках и в адресе страницы, например:

sub TransformModel($$){
my ($brand,$car_model) = @_;
	$car_model =~ s/-//g if $brand !~ /Saab|Jaguar|Nissan|Honda|Citroen|MG|Mercedes|Mazda|Ford/i;
	$car_model =~ s/[-+]/_/g if $brand !~ /Citroen/i;

	if ($brand =~ /Nissan/i){
		$car_model =~ s/Z/350z/i;
		$car_model =~ s/GT_R/GTR/i;
	}

	$car_model = 'navigaror_1' if $brand =~ m#Lincoln#i and $car_model eq 'Navigator';
	$car_model = 'Du%D1%81ato' if $brand =~ m#Fiat#i and $car_model =~ /duсato/i;

	if ($brand =~ /Chery/i){
		$car_model = 'c_eastar' if $car_model eq 'CrossEastar';
		$car_model = $brand .'_'. $car_model if $car_model =~ /kimo|qq\d?/i;
	}
return $car_model;
}

Полная выгрузка занимает порядка 12 часов в последовательном режиме (работает в один поток, заказчику многопоточность не была нужна, а мне некогда было её ради интереса приделать). Если кто-то надумает выгрузку и парсинг произвести — советую сделать например четыре копии скрипта и разбить диапазон марок машин на четыре группы соответственно (всего в базе nakolesah 61 марка на данный момент). Можно воспользоваться готовым разбиением, которое в коде у меня сделано:

# next if $brand !~ /Rover|FAW|Volkswagen|Ferrari|Jaguar|Smart|Suzuki|gaz|Bentley|
Peugeot|Pontiac|Honda|Maybach|vaz|Infiniti|Buick|Subaru/i;
# next if $brand !~ /Lancia|Opel|Daihatsu|Hummer|Kia|Fiat|Nissan|Saturn|
Mini|Hyundai|Renault|Citroen|Lincoln|Chevrolet|Dodge/i;
# next if $brand !~ /Chery|Mazda|Ford|uaz|Acura|Porsche|Lotus|Volvo|Toyota|
Skoda|Cadillac|Scion|Saab|Mercury|Daewoo/i;
# next if $brand !~ /Chrysler|BMW|Isuzu|MG|Mercedes|GMC|Seat|Maserati|
Mitsubishi|Jeep|Lexus|Audi|Lifan|Geely/i;

В каждой из четырёх копий раскомментировать нужный диапазон, файлы лучше назвать по-разному, поскольку по умолчанию вывод идёт в файл с именем имя_скрипта.xml (впрочем можно при зпуске ключиком имя выходного файла передать).

Попутно сделал скриптик для валидации результатов работы парсера nakolesah.ru, в очередной раз порадовался красоте перловых регулярок:

m|<(\w+)\s?\w*=?"?\w*"?>\s*</\1>$|ig

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

Ради интереса немного статистки (может когда потянет поностальгировать :) ):

  • чистая база в XML (без пустых строк):
    $ wc -l nakolesah.ru_full_base_4.12.2009.xml
    550657 nakolesah.ru_full_base_4.12.2009.xml
  • 577 моделей машин

Как и обещал, ссылка на скачивание парсера-граббера сайта nakolesah.ru (валидатор выхода тоже лежит в архиве): nakolesah.ru_parser+validator

Всем удачи!

Еще на похожие темы:

Leave a Reply