Здраствуйте можете помочь разобрать понять как изменить логику скрипта или добавить в него еще одну функцию парсинга фотографий с сайта донора. ДЛя самого парсинга информации нужные классы элементы используется скрипта:
<?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;
$trimmedP = ltrim($price, "$");
// $priceJIS = float($price);
$post = [
'img' => $img->src,
'title' => $img->alt,
'link' => $link->href,
'price' => $trimmedP,
];
$priceN = isset($post['price']) ? floatval($post['price']) : 0;
$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. $postCount;
$price = $priceElem->plaintext;
echo "Original price: " . $price . PHP_EOL;
//$priceCH = floatval($price);
echo "Parsed price: " . $priceN . PHP_EOL;
}
}
//$page = curlGetPage('https://***/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('ul.pagination',0);
//$lastPageLink = $pagenavi[0]->lastChild();
$lastLi = $pagenavi->find('li', -1);
$lastAnchor = $lastLi->find('a', 0);
if ($lastAnchor && $lastAnchor->hasAttribute('href')) {
// Get the value of the "href" attribute and extract the page number (assuming it's the last part of the URL)
$lastHref = $lastAnchor->getAttribute('href');
$pageNumber = intval(basename($lastHref));
$schetchik = $pageNumber + 1;
// Output the parsed page number as an integer
// echo "Last page number: " . $pageNumber;
for ($i = 1; $i >= $schetchik ; $i++) {
// Set the correct referer for pagination
$referer = "https://optitrade.dp.ua/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;
}
}
}
else{echo "Last link not found or doesn't have the 'href' attribute.";}
?>
Дальше есть скрипт с необходимой функцией, которую по логике нужно обьявить гдето в блоке после использования Курла. Но немогу понять почему сам парсер выгружает в мою базу все записи с сайта донора когда у меня поидее должно отрабатыватся условие помощью ( это второй мой вопрос но он не важный.
if ($i > 100) {
break;
}
Мой вопрос состоит в слудующем как ниженаписанную функцию внедрить правильно в вышестоящий код чтобы не изменлись содержание обьектов и переменных и чтобы парсрер не перестал отрабатываться.
<?php
include_once 'simple_html_dom.php';
function parseImagesWithClass($url, $targetClass, $localDirectory) {
$html = file_get_html($url);
if ($html !== false) {
$elements = $html->find($targetClass);
if (!is_dir($localDirectory)) {
mkdir($localDirectory, 0777, true);
}
foreach ($elements as $element) {
$imgElement = $element->find('img', 0);
if ($imgElement) {
$imgSrc = $imgElement->src;
// Ensure the image URL is absolute
if (strpos($imgSrc, 'http') === false) {
$imgSrc = $url . $imgSrc;
}
$imgFilename = $localDirectory . '/' . basename($imgSrc);
// Download the image and save it to the local directory
file_put_contents($imgFilename, file_get_contents($imgSrc));
}
}
$html->clear();
unset($html);
} else {
echo "Failed to fetch HTML from the URL: $url";
}
}
// Sample usage:
$url = 'https://example.com/products'; // Replace with the URL of the product page
$targetClass = '.product-image'; // Replace with the class that contains the product images
$localDirectory = 'images'; // Replace with the local directory where images will be saved
parseImagesWithClass($url, $targetClass, $localDirectory);
?>
Я так понимаю что по логике эту функцию parseImagesWithClass вторую нужно вызывать после parseAndInsertData($html) чтобы везде сохранились доступы к обьектам и они не перепутали друг друг содержимое.
Извените за столь сложный вопрос.