backendbaz

ساخت خزنده وب با php

سلام دوستان. در این مقاله می خوایم یک کد خزنده وب با PHP رو با هم بررسی کنیم. برای مثال یکی از صفحات دسته بندی دیجی کالا رو کروال می کنیم و بعد تک تک صفحات محصول که در اون صفحه دسته بندی قرار دارند.

برای نوشتن این خزنده از کتابخانه Goutte استفاده می کنیم. برای نصب این کتابخانه از دو روش می تونید استفاده کنید:

نصب با composer:

composer require fabpot/goutte

نصب به صورت دستی

برای نصب، فایل zip زیر را دانلود و در محل نصب extract کنید:

https://github.com/FriendsOfPHP/Goutte/archive/master.zip

پس از نصب در کنار پوشه vendor یک فایل جدید با نام مثلاً index.php ایجاد می کنیم و محتوای کد زیر را در آن قرار می دهیم:

include 'vendor/autoload.php';
$client = new Goutte\Client();

//صفحه دستی بندی مربوط به لپ تاپ
$url = "https://www.digikala.com/search/category-notebook-netbook-ultrabook/";
$crawler = $client->request('GET', $url);

$crawler->filter('.c-listing__items .c-product-box')->each(function ($node, $i) {
    //گرفتن عنوان محصولات
    if ($node->filter('.c-product-box__title>a')->count() > 0) {
        $title = $node->filter('.c-product-box__title>a')->text();
    } else {
        $title = '';
    }

    //گرفتن تصویر محصول
    if ($node->filter('.c-product-box__img.js-product-item>img:not(.c-product-box__fmcg-symbol)')->count() > 0) {
          $img = $node->filter('.c-product-box__img.js-product-item>img:not(.c-product-box__fmcg-symbol)')->attr('src');
     } else {
          $img = '';
     }


    //گرفتن قیمت عادی و ویژه محصول
    if ($node->filter('.c-price__value del')->count() > 0) {
         $regular_price = $node->filter('.c-price__value del')->text();
    }
           
    if ($node->filter('.c-price__value-wrapper')->count() > 0) {
         $price = $node->filter('.c-price__value-wrapper')->text();
         if(isset($regular_price)) {
              $sale_price = $price;
         } else {
               $regular_price = $price;
         }
                
     } else {
           if(isset($regular_price)) {
               $sale_price = 0;
           } else {
               $regular_price = 0;
           }
      }

      //گرفتن لینک صفحه مشخصات محصول
      if ($node->filter('.c-product-box__img.js-product-item')->count() > 0) {
         $url2 = $node->filter('.c-product-box__img.js-product-item')->attr('href');
      } else {
           $url2 = '';
      }

      //بازکردن تک تک صفحات محصول و خزش در صفحات
      $client2 = new Goutte\Client();
      $crawler2 = $client2->request('GET', 'https://www.digikala.com'.$url2);

       //توضیحات محصول
       if ($crawler2->filter('.c-mask__text--product-summary')->count() > 0) {
           $description = $crawler2->filter('.c-mask__text--product-summary')->text();
        } else {
            $description = '';
        }

        //مشخصات محصول در این آرایه نگه داری می شوند
        global $attr;
        //گرفتن مشخصات فنی محصول
        $crawler2->filter('.c-params__list li')->each(function ($node2, $i2) {
            global $attr;
            $attr = [];
            if ($node2->filter('.c-params__list-key span a')->count() > 0) {
                 $key = $node2->filter('.c-params__list-key span a')->text();            
            } elseif ($node2->filter('.c-params__list-key span')->count() > 0) {
                 $key = $node2->filter('.c-params__list-key span')->text();
            } else  {
                 $key = '';
            }
                
            if ($node2->filter('.c-params__list-value span')->count() > 0) {
                 $value = $node2->filter('.c-params__list-value span')->text();
            } else {
                 $value = '';
            } 

            $options = explode( ',' , $value );
        
            $attr[$key] = $options;
                        
       });


       echo $title;
       echo $img;
       echo $url;
       echo $regular_price;
       echo $sale_price;
       echo $description;
       print_r($attr);

}

دیدگاه‌ها (0)

*
*