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

Грабим nakolesah.ru

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 марка на данный момент). Можно воспользоваться готовым разбиением, которое в коде у меня сделано:

1
2
3
4
5
6
7
8
# 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

Всем удачи!



Category Рубрики: Интернет, Кодинг | Tag Метки: , | Comments 19 комментариев »

19 комментариев

  1. sberkut says:

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

    • dimio says:

      Размеры чего именно? Давайте сразу с конкретикой, так проще будет понять, в чем дело.

      • sberkut says:

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

        ….

        • dimio says:

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

          • sberkut says:

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

            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.

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

            • dimio says:

              Сразу при первом запуске не проходит? Добавьте перед 152 строкой следующее:

              1
              2
              print $response-&gt;content,"\n";
              exit;

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

              • sberkut says:

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

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

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

                • dimio says:

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

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

                  на

                  1
                  my $redir_url = $1 if $response-&gt;content =~ m#\|\|([\wа-яА-Я\.\s\(\),%-]+)\|$#i;
                  • sberkut says:

                    спасибо большое все заработало )

                  • sberkut says:

                    а нет поспешил ( не хочет таки выдергивать, сохраняет так же (

                    • dimio says:

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

  2. Cry says:

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

    1
    cry.int
  3. Vipertp says:

    Если кто-то смог поправить парсер. Помогите пжл.
    icq: 308037667
    skype: viperstp

  4. Rock'n'roll says:

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

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

  6. Добрый день, если кому нужна база с обновлениями, то вам сюда [ссылка]

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