Парсер (копия темы с DF2)

Модератор: t800

Re: Парсер (копия темы с DF2)

Сообщение t800 » 09 май 2022, 12:14

Так. Вот вроде из примера сделал скрипт который спарсил страницу с товаром

Код: Выделить всё
<?php
echo '<html xml:lang="ru-ru" lang="ru-ru" >';
echo '<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head>';

//подгружаем библиотеку
require_once 'library/simplehtmldom.php';

//создаём новый объект
$html = new simple_html_dom();
//загружаем в него данные
$html = file_get_html('http://site.ru/catalog/ibp_akkumulyatory_i_stabilizatory/batarei_dlya_ibp/akkumulyatornye_batarei_dlya_ups_svc_12v_12_ach_razmer_v_mm_150_98_95/');

//находим путь категории  на странице ...

foreach($html->find('ul[class=breadcrumb-navigation]') as $element) echo $element->plaintext . '<br>';

echo '<br>';

// нахожим название

foreach($html->find('h1[class=header_grey]') as $element) echo $element->plaintext . '<br>';

echo '<br>';


// находим цену

foreach($html->find('div[class=item_current_price]') as $element) echo $element->plaintext . '<br>';

echo '<br>';


// находим картинку

foreach($html->find('a[class=fancy bx_bigimages_aligner]') as $element) echo '<img src="' . $element->href . '"><br>';

echo '<br>';

// находим  краткие характеристики

foreach($html->find('div[class=props_top]') as $element) echo $element->plaintext . '<br>';

echo '<br>';

// находим полные характеристики

foreach($html->find('div[class=left_prop]') as $element) echo $element->plaintext . '<br>';

echo '<br>';

foreach($html->find('div[class=left_value]') as $element) echo $element->plaintext . '<br>';


//освобождаем ресурсы
$html->clear();
unset($html);
?>


Вот что получилось http://wiki.kvkozyrev.org/parser/test6.php

А как теперь сделать чтобы он парсил не одну страницу а все страницы с товарами?
Про это в примерах я ничего не нашел.
Справочник и Форум Green Dragon
T-800 MOD для Heroes of Might and Magic 2

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

Re: Парсер (копия темы с DF2)

Сообщение t800 » 09 май 2022, 12:15

Фух вроде доделал скрипт. :barb_metal: :barb_metal: :barb_metal:

Код: Выделить всё
<?php
// Задаем заголовки чтобы по русски отображалось нормально
echo '<html xml:lang="ru-ru" lang="ru-ru" >';
echo '<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head>';
echo "Парсер от t800 :-) <br/><br/>";


set_time_limit(0); // это для того чтобы скрипт не отвалился через 30 секунд

//подгружаем библиотеку Simple HTML Dom
require_once 'library/simplehtmldom.php';

/* Теперь сам скрипт */


$i=1;

// Указваем количество страниц сколько  хочем спарсить
$n=5;

// Пишем дату сверху в файл куда пишем то что будем парсить
$time = date('Y:m:d:H:i');
$fp = fopen("parse.txt", "w"); // Открываем файл в режиме записи
$test = fwrite($fp,$time . "\r\n");
fclose($fp); //Закрытие файла

// Указываем адрес карты сайта (файла sitemap.xml) откуда берем ссылки страниц которые надо парсить

$sitemap = "http://site.ru/sitemap.xml";

// загружаем файл sitemap

$xml = simplexml_load_file($sitemap);

// Извлекаем ссылки из файла sitemap.xml

foreach ($xml->url as $url_list) {
    $url = $url_list->loc;

// вызываем нашу функцию parse() с указанием url страницы которую надо спарсить

    parse($url);

// Выводим инфу о загрузке
        echo " ***  Загружено: ".$i." из ".$n." страниц *** \r\n ";
        echo "<br>";
        echo str_pad('',4096)."\n";
        echo str_pad('',4096)."\n";
        flush();
// Тут проверка условия  на то сколько спрарсили страниц и выход из скрипта если уже спарсили сколько задано
        if($i++>=$n){
                echo " *** Готово! *** ";
                exit;
                }
}

// Здесь парсим страницу с url  нашей фукцией  parse()
// А это код нашей функция parse()

function parse($url)
{

$data = @file_get_contents($url); // собачка нужна в если сервер нам вернул 404, это вызовет Warning:, поэтому экранируем ошибки
if(trim($data)=='')return false; // бывает что сайт недоступен, тогда страницy не грузим а выходим из функции

//создаём новый объект
$html = new simple_html_dom();
//загружаем в него данные
$html = @file_get_html($url); // собачка нужна в если сервер нам вернул 404, это вызовет Warning:, поэтому экранируем ошибки

//проверяем что спарсили страничу с товаром (проверку делаем по цене) если цены нету то выходим из функции

$ret = $html->find('div[class=item_current_price]', 0);
if ($ret==null) return false;

//находим путь категории  на странице ...

foreach($html->find('ul[class=breadcrumb-navigation]') as $ul)
{
        foreach($ul->find('li') as $li)
        {
                foreach($li->find('a') as $a)
                {
                echo $a->plaintext . '/';
                $catalog = $a->plaintext . '/';
                $fp = fopen("parse.txt", "a"); // Открываем файл в режиме дописывания
                $test = fwrite($fp, $catalog ); // Запись в файл
                fclose($fp); //Закрытие файла
                }

       }
}


//echo '<br/>';

$fp = fopen("parse.txt", "a"); // Открываем файл в режиме дописывания

// находим название

foreach($html->find('h1[class=header_grey]') as $element) echo $element->plaintext;

//echo '<br>';

$test = fwrite($fp, $element->plaintext ); // Запись в файл
if ($test) echo '';
else echo 'Ошибка при записи в файл.';


// находим цену

foreach($html->find('div[class=item_current_price]') as $element) echo '';

$test = fwrite($fp, $element->plaintext ); // Запись в файл

if ($test) echo '';
else echo 'Ошибка при записи в файл.';


// находим картинку

foreach($html->find('a[class=fancy bx_bigimages_aligner]') as $element) echo '';

$url_img = "http://site.ru/" . $element->href;

// извелкаем имя файла картинки из url картинки
$file_name= substr($url_img, strrpos($url_img,"/")+1, strlen($url_img)-strrpos($url_img,"/"));  //Retrive file name from url

// задаем папку куда картинку сохранять
$img_path = "./images/".$file_name;

$test = fwrite($fp, $img_path ); // Запись в файл
if ($test) echo '';
else echo 'Ошибка при записи в файл.';

//  Закачиваем и сохраняем изображение

grab_image($url_img,$img_path);

// находим  краткие характеристики

foreach($html->find('div[class=props_top]') as $element) $test = fwrite($fp, $element); // Запись в файл

// находим полные характеристики

foreach($html->find('div[class=left_prop]') as $element)  $test = fwrite($fp, $element); // Запись в файл

foreach($html->find('div[class=left_value]') as $element)  $test = fwrite($fp, $element); // Запись в файл


// Записываем концы строк

$test = fwrite($fp, "\r\n" );
fclose($fp); //Закрытие файла

//в конце освобождаем ресурсы (не знаю зачем это надо, но говорят, что надо, иначе скрипт может зависнуть)
$html->clear();
unset($html);

}

// Это функция grub_image() че картинки скачивает сurl-ом  и сохраняет  (взята из комментариев на Stack Overflow)
// ЗЫ  сurl-ом потому что curl-ом быстрее скачивается

function grab_image($url,$saveto){
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $raw=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($saveto)){
        unlink($saveto);
    }
    $fp = fopen($saveto,'x');
    fwrite($fp, $raw);
    fclose($fp);
}

?>


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

http://wiki.kvkozyrev.org/parser/parser7.php
Справочник и Форум Green Dragon
T-800 MOD для Heroes of Might and Magic 2

Основатель клуба "Армагеддон"

Основатель клуба "Пещера Гремлинов"

ИзображениеИзображение
t800
Experienced
Experienced
 
Сообщения: 855
Зарегистрирован: 19 окт 2015, 14:52
Откуда: Казахстан, Алматинская область
Благодарил (а): 172 раз.
Поблагодарили: 136 раз.

Пред.

Вернуться в Технические вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1

cron