Парсер базы 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*$|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

Всем удачи!

19 мыслей о “Парсер базы nakolesah.ru”

  1. Добрый день! Видимо они дизайн сменили и не парсятся размеры, не могу бы вы поправить это платно/бесплатно ! спасибо )

      1. скрипт отлично берет модели машин, но типоразмеры шин и дисков подходящих он не выбирает, в результате xml имеется вида:

        ….

          1. у меня помоему редирект не проходит , пишет:

            Use of uninitialized value $redir_url in concatenation (.) or string at /home/digbox/data/www/digbox.ru/cgi-bin/nakolesah_ru_parser.pl line 152.

            не поможете разобраться? 🙂

            1. Сразу при первом запуске не проходит? Добавьте перед 152 строкой следующее:
              print $response->content,"\n";
              exit;

              и результат сообщите мне.

              1. выдает следущее:

                1|#||4|54|pageRedirect||%2fselect%2ftiresbyauto%2facura%2fcl%2f2003%2f32i.aspx|

                как я понял урл для редиректа распознает, но не переходит 🙁

                1. Ну это поправить не сложно. Он как раз таки не распознавал ссылку для редиректа, поскольку изменилась форма её выдачи.
                  Надо в строке 150 заменить шаблон поиска:

                  my $redir_url = $1 if $response->content =~ m#/([\wа-яА-Я\.\s\(\),%-]+)\|$#i;
                  на
                  my $redir_url = $1 if $response->content =~ m#\|\|([\wа-яА-Я\.\s\(\),%-]+)\|$#i;

                    1. Скорее всего там поменялась не только форма выдачи ссылки, но и выдача информации по шинам/дискам и чтобы восстановить работоспособность, придётся много менять в функции разбора страниц.

  2. Поправил парсер, могу поделиться или базой или им самим … пишите skype: cry.int

  3. Может кто-то все таки поделится информацией почему не вытаскивает типоразмеры, что именно в коде надо поменять.

  4. Здравствуйте,если у кого есть парсер на пхп то поделитесь пожалуйста а то срочно надо((( моя ася 202716 а то двиг у нас дле(он на пхп)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *