metrpro

ЯН.Парсер и его глюки

Recommended Posts

Давно не писал, но наболело. У меня, пожалуй, тут самый богатый опыт использования ЯН.Парсера, поэтому за последний год уловил еще три глюка (плюс один старый), которые хотелось бы устранить:

1. При импорте изображений из загружаемого фида не импортируются картинки формата png - выдается ошибка. Причем это не зависит от того, накладываете вы водяной знак или нет. 

2. Если у вас в базе улиц есть, скажем, "Победы улица" в двух разных городах - предположим в Москве за id №100 в Справочнике и в Питере за id №200, то при импорте объявления с этой улице в Питере в самом объявлении ему привяжется улица №100 в Москве, выше расположенная в справочнике с меньшим id - т.е. при импорте перебираются только названия улиц, без привязки к городам.

3. При применении ассоциации входящих типов для категорий объявлений в фиде не учитывается тип аренда/продажа - т.е. если у вас в фиде есть категория типа Аренда - Коммерческая - Office и вы честно ставите новый тип "Office" с переадресацией в ваш соответствующий раздел по аренде офисов, то как только парсер встретит в фиде категорию Продажа - Коммерческая - Office, то также определит объявление в аренду офисов, потому что категория Office уже привязана к ней, а то что тип объявления при этом Продажа остаётся неучтенным.

4. Ну я об этом писал и мы с Димой обсуждали - новые генерируемые улицы не привязываются к городам, даже если в самих импортируемых объявлениях города прописаны и в базе уже есть.

У меня все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 10.08.2017 в 06:07, metrpro сказал:

1. При импорте изображений из загружаемого фида не импортируются картинки формата png - выдается ошибка. Причем это не зависит от того, накладываете вы водяной знак или нет. 

А вы не обращали внимания, сами эти картинки, они реально png или у них только расширение стоит png, а внутри, например, обычный jpg?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 18.09.2017 в 02:15, abushyk сказал:

А вы не обращали внимания, сами эти картинки, они реально png или у них только расширение стоит png, а внутри, например, обычный jpg?

Реально png. Уже со многих источников фидов замечено.

Есть, кстати, еще один глюк - не обрабатывается тэг commercial-type

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня 2 вопроса.

1. Когда будет апдейт парсера с учетом ошибок и того, что формат Я.н теперь включает коммерческую недвижимость?

2. На что тратится ресурс при парсинге картинок парсером? Когда на одном аккаунте хостинга висит 2 сайта на сайтбилл, и на одном из них запущен парсер изображений, то он недоступен, как и его ПУ (грубо говоря, сайт "подвисает", пока модуль подгружает картинки). Однако второй сайт при этом работает без проблем - т.е. ресурсы сервера не перегружены. Вопрос - почему подвисает первый сайт, на котором крон в этот момент выдергивает фото? Какой мощности д.б. сервак чтобы этих провисаний не было? И в сервер ли дело?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, metrpro сказал:

На что тратится ресурс при парсинге картинок парсером?

На загрузку фото по каналу на хостинг сайта, распаковку фотки в память, изменение ее максимального размера, создание, путем уменьшения и, при необходимости, подрезки миниатюры, сохранение всего этого из памяти в физический файл. При использовании вотермарка дополнительно опять через память прогоняется больший вариант картинки и картинки вотермарка с взаимным наложением. И так для каждой фотки. Операции в принципе примитивные, но ресурсоемкие, как ни крути.

Есть еще расход на запись в БД данных о фотках - связки объект-картинки. Но это уже мизер по ресурсам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, abushyk сказал:

На загрузку фото по каналу на хостинг сайта, распаковку фотки в память, изменение ее максимального размера, создание, путем уменьшения и, при необходимости, подрезки миниатюры, сохранение всего этого из памяти в физический файл. При использовании вотермарка дополнительно опять через память прогоняется больший вариант картинки и картинки вотермарка с взаимным наложением. И так для каждой фотки. Операции в принципе примитивные, но ресурсоемкие, как ни крути.

Есть еще расход на запись в БД данных о фотках - связки объект-картинки. Но это уже мизер по ресурсам.

Тогда почему второй сайт на том же аккаунте, такой же по движку, при этом не страдает по скорости работы? Ведь выделяются ресурсы хостером на аккаунт, скажем, 1 Гб памяти.

И что с остальными моими вопросами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: metrpro
      Добрый день. Стоит задача - массово ГРАМОТНо удалить все изображений объявлений формата PNG (было настроено малое сжатие, занимают много места). Если физически с сервера удалить их не проблема, то как сделать, чтобы упоминание о них в самой базе re_data пропало?..
    • Автор: Jack Dan
      Как выгрузить номера квартир в  фид?
    • Автор: Jack Dan
      Добрый день! Раньше код работал, а потом перестал. Когда понадобилась выгрузка на infoline, снова пришлось обратиться к коду.
      infoline прислали требование к xml, прикрепляю его (infoline_xml.rtf). Вот код php файла по адресу https://мой_сайт/infoline/parser/yandex_infoline_convert.php:
       
      <?php include(dirname(__FILE__).'/func.php'); @unlink(dirname(__FILE__).'/tmp/log.html'); header("Content-type: text/html; charset=utf-8"); error_reporting (E_ALL &~ E_DEPRECATED &~E_NOTICE); ini_set("pcre.backtrack_limit", "99999999999"); comment('<html lang="ru"><head><meta charset="utf-8">'); //mb_internal_encoding("UTF-8"); $test = 9999999; // кол-во для теста, чтобы выгружало все поставьте большое число любое, 9999999 $filename = 'infoline_export.xml'; $phone1 = '89065808308'; $phone2 = ''; $email = 'infoline@dvm-vrn.ru'; $infoline = 1; // затем поставьте значения соответствующее значению поля infoline в БД. //print_R($cats); die(); $in_file = 'yandexrealty.xml'; $in_file = 'https://gm36.ru/yandexrealty'; //$p = get_page($in_file); $p = file_get_contents($in_file); $to = '<?xml version="1.0" encoding="UTF-8"?> <realty-feed> <generation-date>'.date('Y-m-d+H:i').'</generation-date>'; preg_match_all('/<offer.*<\/offer>/isU', $p, $offers, $o); //print_r($offers[0]); print_r($offers[1]);print_r($offers[110]);print_r($offers[1110]); die(); //unset($offers[0]); $ii = 0; $q = db_query("select * from `re_data` where `infoline` = '".$infoline."' and `active` = '1' "); while($qr = mysql_fetch_assoc($q)) { $ids[] = $qr['id']; $data[$qr['id']] = $qr; } //print_r($ids); die(); $temp = file(dirname(__FILE__).'/replaces.txt'); unset($temp[0]); foreach($temp as $tt) { $t = explode('~~', $tt); $replaces[trim($t[0])]=trim($t[1]);} $bath = array(0=>'совмещенный',1=>'раздельный',2=>'два и больше'); $balc = array(0=>'выбрать',1=>'Лоджия',2=>'Отсутствует', 3=>'Есть'); //print_r($replaces); die(); //echo $st.'___'.$end; die(); foreach($offers as $it) { unset($res); //comment($ii.'__'.$st.'__'.$end); preg_match('/internal\-id="([^"]+)"/iU', $it[0], $t); $res['id'] = $t[1]; if(!in_array($res['id'], $ids)) comment($res['id']. ' - не выгружаем.'); else{ preg_match('/<category>(.*)<\/category>/iU', $it[0], $t); $res['category'] = $t[1]; preg_match('/<rooms>(.*)<\/rooms>/iU', $it[0], $t); $res['rooms'] = $t[1]; preg_match('/<area>[^<>]*<value>([^<>]+)</isU', $it[0], $t); $res['area'] = $t[1]; preg_match('/<living-space>[^<>]*<value>([^<>]+)</isU', $it[0], $t); $res['living-space'] = $t[1]; preg_match('/<kitchen-space>[^<>]*<value>([^<>]+)</isU', $it[0], $t); $res['kitchen-space'] = $t[1]; $res['floors-total'] = $data[$res['id']]['floor_count']; $res['floor'] = $data[$res['id']]['floor']; preg_match('/<country>(.*)<\/country>/iU', $it[0], $t); $res['country'] = $t[1]; preg_match('/<region>(.*)<\/region>/iU', $it[0], $t); $res['region'] = $t[1]; preg_match('/<locality\-name>(.*)<\/locality\-name>/iU', $it[0], $t); $res['locality-name'] = $t[1]; preg_match('/<sub\-locality\-name>(.*)</iU', $it[0], $t); $res['sub-locality-name'] = $t[1]; preg_match('/<address>(.*)<\/address>/iU', $it[0], $t); $res['address'] = $t[1]; $t = explode(',', $res['address']); $res['street'] = trim($t[0]); $res['house'] = trim($t[1]); preg_match('/<latitude>(.*)<\/latitude>/iU', $it[0], $t); $res['latitude'] = $t[1]; preg_match('/<longitude>(.*)<\/longitude>/iU', $it[0], $t); $res['longitude'] = $t[1]; preg_match('/<price>[^<>]*<value>(.*)</isU', $it[0], $t); $res['price'] = $t[1]; preg_match('/<currency>(.*)<\/currency>/iU', $it[0], $t); $res['currency'] = $t[1]; //print_r($res);print_r($it); die(); if(preg_match_all('/<picture>([^<>]+)<\/picture>/iU', $it[0], $temp, $o)) { foreach($temp as $t) { $res['image_str_ar'][] = '<Image url="'.$t[1].'" />'; } $res['image_str'] = '<Images>'.implode("\n", $res['image_str_ar']).'</Images>'; } foreach($cats as $k=>$v) { if($res['type_id'] == '' and preg_match('/'.str_replace("/", "\/", $k).'/iU', mb_strtolower($res['name'], 'UTF-8'))) { //comment($c); $res['type_id'] = $v; $res['type_key'] = $k; } //comment($k); } if($res['type_id'] == '') $res['type_id'] = '11-623'; // print_r($cats); print_r($res);print_r($it); die(); $res['name'] = preg_replace('/\&.{2,6};/iU', '', htmlentities($res['name'], null, 'utf-8')); $res['name_to'] = mb_substr($res['name'], 0, 50, 'UTF-8'); if($replaces[$data[$res['id']]['walls']] != '') $res['mat'] = $replaces[$data[$res['id']]['walls']]; else $res['mat']= ''; $q = db_query("select `developer_id` from `re_complex` where `complex_id` = '".$data[$res['id']]['complex_id']."'"); while($qr = mysql_fetch_assoc($q)) { $qq = db_query("select `name` from `re_developer` where `developer_id` = '".$qr['developer_id']."'"); while($qqr = mysql_fetch_assoc($qq)) $res['dev'] = $qqr['name']; } $q = db_query("select `fio` from `re_user` where `user_id` = '".$data[$res['id']]['user_id']."'"); while($qr = mysql_fetch_assoc($q)) $res['user'] = $qr['fio']; $q = db_query("select `name` from `re_district` where `id` = '".$data[$res['id']]['district_id']."'"); while($qr = mysql_fetch_assoc($q)) $res['district'] = $qr['name']; $res['image_ar'] = unserialize($data[$res['id']]['image']); foreach($res['image_ar'] as $im) $res['images'][] = '<foto>http://gm36.ru/img/data/'.$im['normal'].'</foto>'; $res['im'] = implode("\n", $res['images']); $data[$res['id']]['text'] = '<![CDATA['.$data[$res['id']]['text'].']]>'; //$res['name_to']=$res['name']; // print_r($res);print_r($it);print_r($data[$res['id']]);print_r($replaces); die(); $to = $to.'<offer internal-id="'.$res['id'].'" types="open"> <apptype>1</apptype> <folder>2</folder> <obj>'.$res['category'].'</obj> <rooms>'.$res['rooms'].'</rooms> <areas> <total>'.$res['area'].'</total> <living>'.$res['living-space'].'</living> <kitchen>'.$res['kitchen-space'].'</kitchen> <lot></lot> </areas> <floor>'.$res['floor'].'</floor> <floors>'.$res['floors-total'].'</floors> <mat>'.$res['mat'].'</mat> <housetype>Современная</housetype> <klass>Современная</klass> <zastroishik>'.$res['dev'].'</zastroishik> <declaration></declaration> <location> <country>'.$res['country'].'</country> <region>'.$res['region'].'</region> <raion></raion> <gorod>'.$res['locality-name'].'</gorod> <selo></selo> <street>'.$res['street'].'</street> <district>'.$res['district'].'</district> <place></place> <numhouse>'.$res['house'].'</numhouse> <latitude>'.$res['latitude'].'</latitude> <longitude>'.$res['longitude'].'</longitude> </location> <price> <value>'.$res['price'].'</value> <currency>'.$res['currency'].'</currency> <unit>все</unit> <period></period> <ipoteka></ipoteka> <ischp></ischp> <obmen></obmen> </price> <agent internal-id="'.$res['user_id'].'"> <name>'.$res['user'] .'</name> <phone>'.$phone1.'</phone> <phone>'.$phone2.'</phone> <mails>'.$email.'</mails> <skype></skype> <icq></icq> </agent> <bathroom>'.$bath[$data[$res['id']]['bathroom']].'</bathroom> <balcon>'.$balc[$data[$res['id']]['balcony']].'</balcon> <comment>'.$data[$res['id']]['text'].'</comment> <fotos> '.$res['im'].' </fotos> </offer> '; if($ii >= $test){ $to = $to.'</realty-feed>'; file_put_contents(dirname(__FILE__).'/tmp/'.$filename, $to); echo "<a href='tmp/".$filename."'>FILE</a>"; die(); } } $ii++;} $to = $to.'</realty-feed>'; file_put_contents(dirname(__FILE__).'/tmp/'.$filename, $to); echo "<a href='tmp/".$filename."'>FILE</a>"; comment('DONE'); ?> По запуску получаю только дату (смотреть картинку). 
      Что не так с кодом?
      infoline_xml.rtf

    • Автор: Макс
      Здравствуйте, в ходе проверки ФИДА http://ihouse24.ru/yandexrealty/ Яндекс прислал вот такую ошибку мне: 

       

      "Телефон агента/продавца не указан или указан в неподходящем формате"

       

      Подскажите пожалуйста, где указывать телефон агента, что это за поле.. ( на фото в этих полях должен быть указан номер агента?) 

      или вот второе фото в редакторе форм- поле data в этом поле номер агента? или надо создать новое поле? подскажите правильное решение ошибки этой 

      ---------------------------------------------------

      -------------------------------------------------------------------

      ---------------------------------------------------------------------

      Кажется разобрался это поле "Пользователь" данные пользователя надо указывать (телефон,почта и тд)