Уф, докрутил парсер 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
Всем удачи!
Добрый день! Видимо они дизайн сменили и не парсятся размеры, не могу бы вы поправить это платно/бесплатно ! спасибо )
Размеры чего именно? Давайте сразу с конкретикой, так проще будет понять, в чем дело.
скрипт отлично берет модели машин, но типоразмеры шин и дисков подходящих он не выбирает, в результате xml имеется вида:
….
Не могу сказать, в чем дело, поскольку у меня нормально выгружается вся информация.
у меня помоему редирект не проходит , пишет:
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.
не поможете разобраться? 🙂
Сразу при первом запуске не проходит? Добавьте перед 152 строкой следующее:
print $response->content,"\n";
exit;
и результат сообщите мне.
выдает следущее:
1|#||4|54|pageRedirect||%2fselect%2ftiresbyauto%2facura%2fcl%2f2003%2f32i.aspx|
как я понял урл для редиректа распознает, но не переходит 🙁
Ну это поправить не сложно. Он как раз таки не распознавал ссылку для редиректа, поскольку изменилась форма её выдачи.
Надо в строке 150 заменить шаблон поиска:
my $redir_url = $1 if $response->content =~ m#/([\wа-яА-Я\.\s\(\),%-]+)\|$#i;
на
my $redir_url = $1 if $response->content =~ m#\|\|([\wа-яА-Я\.\s\(\),%-]+)\|$#i;
спасибо большое все заработало )
а нет поспешил ( не хочет таки выдергивать, сохраняет так же (
Скорее всего там поменялась не только форма выдачи ссылки, но и выдача информации по шинам/дискам и чтобы восстановить работоспособность, придётся много менять в функции разбора страниц.
Поправил парсер, могу поделиться или базой или им самим … пишите skype:
cry.int
какая почта? или ася
http://www.dimio.org/about
Если кто-то смог поправить парсер. Помогите пжл.
icq: 308037667
skype: viperstp
Может кто-то все таки поделится информацией почему не вытаскивает типоразмеры, что именно в коде надо поменять.
Выше человек давал свой контакт и писал, что поправил всё под совр. условия.
Здравствуйте,если у кого есть парсер на пхп то поделитесь пожалуйста а то срочно надо((( моя ася 202716 а то двиг у нас дле(он на пхп)
Добрый день, если кому нужна база с обновлениями, то вам сюда [ссылка]