@9StarRu

Как не загружать товары по новой, если они уже есть в базе?

Парсю список товаров и сохраняю в sqlite базу данных с помощью следующего кода:

<?php

set_time_limit(0);

include __DIR__ . '/config.php';

include __DIR__ . '/libs/shop.class.php';
include __DIR__ . '/libs/database.class.php';

$banlist = array_filter(array_map('trim', file(__DIR__ . '/banlist.txt')));
$shop = new Shop(__DIR__ . '/auth.cookie');
$db = new DataBase(__DIR__ . '/db.sqlite');

// Проверка авторизации. Если уже авторизован, то идет дальше, нет - авторизуется по логину и паролю

if (!$shop->checkAuth()) {
$shop->auth(USER, PASS);

if (!$shop->checkAuth()) {
    die('Can\'t auth');
}
}

$items = $db->all();

for ($page = 1; $page >= 1; $page--) {
//for ($page = 1; $page <= 1; $page++) {

// Загрузка

$items = $shop->getMarketplaceTrends('Day', $page);
//krsort($items);
krsort($item->id);

foreach ($items as $item) {
    if (!in_array($item->user['id'], $banlist)) {
        if ($db->exists($item, 3)) {
            continue;
        }

        $item->downloadAndResizeImages();

        $db->add(array_merge($item->only(['title', 'description', 'image', 'images', 'wareUrl', 'user', 'user_id', 'rate', 'createdAt', 'price', 'price_total']), [
            //'id' => (3 * 10000000) + $item->id,
            'wareUrl' => trim($item->wareUrl, '/'),
            'id' => $item->id,
            'item_id' => $item->id,
            'type' => 3,
            'user_id' => $item->user['id'],
            'user_fullname' => $item->user['fullName'],
            'hasPromo' => (int)$item->hasPromo,
            'price_total' => $item->price['total'],
            'time' => date("r")
        ]));
    }
sleep(SLEEP_CHECKS);
}

sleep(SLEEP);

// Загрузка

$items = $shop->getMarketplaceTrends('ThreeDays', $page);
//krsort($items);
krsort($item->id);

foreach ($items as $item) {
    if (!in_array($item->user['id'], $banlist)) {
        if ($db->exists($item, 3)) {//4
            continue;
        }

        $item->downloadAndResizeImages();

        $db->add(array_merge($item->only(['title', 'description', 'image', 'images', 'wareUrl', 'user', 'user_id', 'rate', 'createdAt', 'price', 'price_total']), [
            //'id' => (4 * 10000000) + $item->id,
            'wareUrl' => trim($item->wareUrl, '/'),
            'id' => $item->id,
            'item_id' => $item->id,
            'type' => 3,//4
            'user_id' => $item->user['id'],
            'user_fullname' => $item->user['fullName'],
            'hasPromo' => (int)$item->hasPromo,
            'price_total' => $item->price['total'],
            'time' => date("r")
        ]));
    }
sleep(SLEEP_CHECKS);

}

sleep(SLEEP);

// Загрузка

$items = $shop->getMarketplace('leaders', $page);
//krsort($items);
krsort($item->id);

foreach ($items as $item) {
    if (!in_array($item->user['id'], $banlist)) {
        if ($db->exists($item, 3)) {//5
            continue;
        }

        $item->downloadAndResizeImages();

        $db->add(array_merge($item->only(['title', 'description', 'image', 'images', 'wareUrl', 'user', 'user_id', 'rate', 'createdAt', 'price', 'price_total']), [
            //'id' => (5 * 10000000) + $item->id,
            'wareUrl' => trim($item->wareUrl, '/'),
            'id' => $item->id,
            'item_id' => $item->id,
            'type' => 3,//5
            'user_id' => $item->user['id'],
            'user_fullname' => $item->user['fullName'],
            'hasPromo' => (int)$item->hasPromo,
            'price_total' => $item->price['total'],
            //'time' => microtime(true)
            'time' => date("r")
        ]));
    }
sleep(SLEEP_CHECKS);

}

sleep(SLEEP);
}

echo 'Done';


Скрипт запускаю по крону и каждый раз все товары загружаются по новой.

Как сделать проверку на ранее загруженные товары, например по id или item_id, чтобы скрипт сначала проверял наличие товара в базе и парсил его только в том случае, если товара в базе нет?

Спасибо!
  • Вопрос задан
  • 71 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Wentixon
Сначала ты собираешь ссылки, которые будешь парсить. Так вот запиши эти ссылки в отдельную таблицу. В следующий раз при сборе ссылок собственно получай ссылки, которые уже есть и исключая их, оставляй новые
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽