@Inter_GLADOS

Как решить проблемы интерполяции строк и доработать код чтобы работала пагинация при парсинге данных в php?

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

Суть такая есть скрипт который должен брать код страницы интернет магазина проиводить выборку тегов с соотвествующим классом и брать их содержимое, заносить в свойства обьекта, который создаем уже в середине кода.

<?php

global $postCount;
include_once 'db.php';
include_once 'simple_html_dom.php';

function curlGetPage($url, $referer = 'https://google.com/')
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    $response = curl_exec($ch);
    return $response;

}

function parseAndInsertData($html)
{
    global $db;

    foreach ($html->find('*[class="col-6 col-lg-4 col-xl-3 us-item"]') as $element) {
        $img = $element->find('*[class="img-fluid oct-lazy"]',0);
        $link = $element->find('.us-module-img a', 0);
        $priceElem = $element->find('*[class="us-module-price-actual"]',0);



        $price = $priceElem->plaintext;
        $priceJIS = float($price);
        $post = [
            'img' => $img->src,
            'title' => $img->alt,
            'link' => $link->href,
            'price' => $price,
        ];

        $priceN = isset($post['price']) ? floatval($post['price']) : 0;

// Используем подготовленные запросы для избежания SQL инъекций
        $priceCH = floatval($price);
        $db->query("INSERT IGNORE INTO posts (`title`, `img`, `link`, `price`) 
        VALUES('{$post['title']}', '{$post['img']}', '{$post['link']}', {$priceN})");

        echo "Step cycle" . PHP_EOL;

        $price = $priceElem->plaintext;
        echo "Original price: " . $price . PHP_EOL;

        $priceCH = floatval($price);
        echo "Parsed price: " . $priceN . PHP_EOL;

    }
}

//$page = curlGetPage('https://optitrade.dp.ua/zaryadni-prystroyi');
//$html = str_get_html($page);

$url = 'https://***/zaryadni-prystroyi?page=1';
$page = curlGetPage($url);
$html = str_get_html($page);

// Parse and insert data from the first page
parseAndInsertData($html);

$pagenavi = $html->find('.pagination');
$pageCount = count($pagenavi);

$postCount = 0;

for ($i = 2; $i <= $pageCount; $i++) {
    // Set the correct referer for pagination


    $referer = "https://***/zaryadni-prystroyi/?page=$i";

    // Fetch the page content
    $page = curlGetPage($referer, $referer);
    $html = str_get_html($page);

    // Parse and insert data from the current page
    parseAndInsertData($html);

    usleep(1500000);

    // Optionally, you can add a limit to the number of pages to parse
     if ($i > 100) {
         break;
     }
}
?>


Вопрос вот в чем как изменить код и значения переменных в которые есть обьекты?

$priceElem = $element->find('*[class="us-module-price-actual"]',0);
$price = $priceElem->plaintext;
$priceJIS = float($price);
Почему в запросе $db в базу данных попадает пустое значение 0 в поле `price`.
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
i229194964
@i229194964
Веб разработчик
тобы решить проблему с пустым значением 0 в поле price, вы можете изменить способ преобразования строки $price в число. Вместо float($price), я предлагаю использовать функцию str_replace() для удаления всех нечисловых символов из строки, а затем преобразовать результат в число.
$price = $priceElem->plaintext;
$priceCleaned = str_replace(',', '.', preg_replace('/[^0-9,.]/', '', $price));
$priceN = floatval($priceCleaned);

Таким образом, $priceN будет содержать корректное числовое значение price, которое можно использовать для вставки в базу данных.

После этого, вы можете использовать $priceN в вашем запросе вместо $priceCH
$db->query("INSERT IGNORE INTO posts (`title`, `img`, `link`, `price`) 
VALUES('{$post['title']}', '{$post['img']}', '{$post['link']}', {$priceN})");

Это должно решить проблему с пустым значением 0 и корректно передавать числовое значение price в базу данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы