Парсинг Яндекс Маркета




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

14 Comments

  1. DimaP

    авансом плюс!

    Reply
  2. prog1c8

    Если вдруг кого то заинтересует готовый продукт по этой тематике, могу предложить…

    Reply
  3. Boudybuilder

    Что то это дело ни фига не находит. или находит , но ничего не заполняет. Картинок нету, данные никакие не загружаются, даже не пойму как с ней работать.

    Reply
  4. dbaser

    (3) Boudybuilder, на момент публикации все было норм.

    С того момента яндекс уже два раза менял адресную строку, поэтому ничего и не находит.

    Ну раз есть интерес и появился такой отзыв — придется выложить рабочую версию)

    Reply
  5. Mudrii_Gankster

    Интересная обработка, а реально допилить обработку: указать организацию и фильтр наименований списком?

    Будет очень полезно для интернет магазинов

    Reply
  6. dbaser

    (5) Mudrii_Gankster,

    Конечно, возможно ее допилить до чего угодно… Это каркас, пример кода с рабочими процедурами.

    Если вдруг здесь сообщат что Я.Маркет поменял что-то и обработка перестала работать, то я обновлю актуальность кода.

    Если Вам нужна обработка конкретно под Ваши рабочие задачи и нигде не нашлось подходящей, то можно обсудить ТЗ в личке.

    з.ы.

    Здесь на инфостарте видел несколько аналогичных решений заточенных под инет-магазин, возможно только реализовано по другому…

    Reply
  7. bob77

    Здравствуйте!!! скачали — Обработку Парсинг яндекс маркета — версия от 06/05/2013! При открытии пустая форма и ничего не находит!

    Reply
  8. dbaser

    Проверил работоспособность обработки от 06/05/2013.

    Все отлично работает — аж удивился.

    Тестил на Win 7, платформа 1С 8.2.17

    Reply
  9. SunShinne

    Работает, плюс однозначно. Не хватает управляемой формы и логика не совсем очевидно, имеется ввиду следуещее — не понятно как именно программа выбирает позицию для парсинга из большого числа в маркете. Ну может разобраться надо. В любом случае автороу респект и плюс!

    Reply
  10. dbaser

    (9) SunShinne, спасибо за отзыв.

    А по поводу замечаний — это пример для программистов, а не готовое решение.

    Код на УФ особо отличаться не будет.

    На более предметные вопросы могу ответить.

    Reply
  11. rounder

    После первой загрузки, вываливается ошибка!!!

    ой…

    Нам очень жаль, но запросы, поступившие с вашего IP-адреса, похожи на автоматические. По этой причине мы вынуждены временно заблокировать доступ к поиску.

    Чтобы продолжить поиск, пожалуйста, введите символы с картинки в поле ввода и нажмите «Отправить».

    Reply
  12. 12345mm

    Добрый вечер! На этой конфигурации УТ будет работать? А пробную версию можно получить st-bt@tut.by?

    Reply
  13. dbaser

    (11) Ну это ж пример парсинга, а не обхода защиты от роботов. На инфостарте есть платные поддерживаемые решения где этот вопрос обходится…

    (12) =) это и есть пробная версия в том смысле что обработка не является готовым решением для конечного пользователя, так что скачивайте за $m.

    Управляемые формы не поддерживаются в данном варианте, но можно переделать — принцип работы сохранится.

    P.S. Давно не заглядывал в эту обработку и даже не знаю работает ли она сейчас….

    Reply
  14. dbaser

    (11) >> После первой загрузки,

    хм… видимо Яндкс опять что-то поменял (макет страницы или внутренний адрес). публикация то старая…

    Reply

Leave a Comment

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