آموزش ساخت یک web scraper حرفه ای با php ( استخراج اطلاعات سایت )

آموزش ساخت یک web scraper حرفه ای با php ( استخراج اطلاعات سایت )

web scraper حرفه ای با php – تاکنون کلمه خزنده وب یا استخراج اطلاعات صفحه وب را شنیده اید

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


هم چنین با نام web crawler هم شناخته می شود .


کاربرد های Web Scraper

نمایش اطلاعات بورس
نمایش اطلاعات فروشگاه اینترنتی ( دیجیکالا ، مالتینا )
نمایش اطلاعات نیازمندی های آنلاین ( دیوار ، شیپور )
نمایش اطلاعات حساب کاربری
و …


شروع کار با Web Scraper

برای شروع به PHP 7.2 یا بالاتر و کتابخانه html parser با نام paquettg/php-html-parser نسخه 3.1.1 یا بالاتر نیاز دارید .

برای شروع ابتدا کتابخانه را با استفاده از composer نصب کنید .

composer require paquettg/php-html-parser


فایل index.php برای دریافت اطلاعات category دیجیکالا

قبل از چیز بهتر است از کارایی چند دستور باخبر شوید :

loadStr : بارگذاری html از طریق رشته به طور مستقیم .
find : جستجو در میان المنت های مختلف html معادل querySelector جاوا اسکریپت است .
getAttribute : دریافت attribute های html

شرح کارایی اسکریپت پایین : دقت داشته باشید که کد پایین فقط برای دیجیکالا تا زمانی که ساختار صفحه category تغییر نکند قابل اجرا هست .

<!DOCTYPE html>
<html lang="fa">

<head>
    <meta charset="UTF-8">
    <title>Rapidcode.iR - سورس کد</title>
    <link rel="stylesheet" href="static/css/main.css">
</head>

<body>


    <div class="container">
        <a id="introduce" href="https://rapidcode.ir" target="_blank">رپید کد • کتابخانه مجازی برنامه نویسان</a>

        <h1>محصولات دیجیکالا</h1>
        <p>این اسکریپت فقط جنبه آموزشی داشته و هرگونه بهره برداری مالی باید توسط دیجیکالا تایید گردد .</p>




        <?php
        require "vendor/autoload.php";

        use PHPHtmlParser\Dom;

        if (!empty($_POST['crawlUrl'])) {
            $dom = new Dom;
            $raw_html = file_get_contents($_POST['crawlUrl']);
            $dom->loadStr($raw_html);

            $products = $dom->find("ul.c-listing__items.js-plp-products-list li .c-product-box");
            foreach ($products as $product) {
                $title = $product->getAttribute("data-title-fa");
                $link = "https://www.digikala.com{$product->find('.js-product-url')->getAttribute("href")}";
                $thumbnail = $product->find('.c-promotion-box__image img')->getAttribute("src");
                $onsale = "---";
                $rate = "---";


                if (!empty($product->find('.c-promotion__badge.c-promotion__badge--special-sale')[0]))
                    $onsale = $product->find('.c-promotion__badge.c-promotion__badge--special-sale')->outerhtml;

                if (!empty($product->find('.c-product-box__engagement-rating')[0]))
                    $rate = $product->find('.c-product-box__engagement-rating')->outerhtml;

                $price = $product->find('.c-price')->outerhtml;
                $vendor = $product->find('.c-product__main-seller.js-seller-text')->outerhtml;

                echo "<div class=\"product-box\"><div id=\"onsale\">{$onsale}</div><img id=\"thumbnail\" src=\"{$thumbnail}\" alt=\"{$title}\"><h2 id=\"head1\"><a href=\"{$link}\">{$title}</a></h2><div id=\"rating\">{$rate}</div><div id=\"price\">{$price}</div><div id=\"vendor\">{$vendor}</div></div>";
            }
        } else {
        ?>

            <form action="" method="post">
                <input type="url" name="crawlUrl" id="crawlUrl" placeholder="(;">
                <input type="submit" value="ثبت">
            </form>
        <?php
        }
        ?>


    </div>



</body>

</html>


فایل main.css ظاهر بهتر برنامه

.container{
    margin: 0 auto;
    width: 80%;
    text-align: center;
    direction: rtl;
}

#introduce{
    display: block;
    width: 100%;
    font-size: 35px;
    font-weight: bold;
    color: white;
    padding-bottom: 5px;
    background-color: #4CAF50;
    text-decoration: none;
    margin-bottom: 15px;
}


/* Page Style */

.product-box{
    width: 30%;
    margin-left: 1%;
    float: right;
    border: 2px solid #03a9f4;
    margin-bottom: 15px;
}

.product-box #onsale div{
    background-color: mediumslateblue;
    color: white;
}

.product-box #thumbnail{
    width: 90%;
    margin: 5px auto;
}

.product-box #head1{
    font-size: 17px;
    height: 40px;
}

.product-box #head1 a{
    color: #ff9800;
    text-decoration: none;
}

.product-box #rating{
    text-align: left;
    padding-left: 5px;
}

.product-box #price{
    font-weight: bold;
    font-size: 14px;
    color: white;
    margin: 5px 0;
    padding: 5px 0;
    background-color: #4caf50;
    height: 27px;
    overflow-y: scroll;
}

.product-box #vendor{
    text-align: right;
    margin: 3px 10px;
}


خروجی برنامه ( نتیجه )

این پروژه فقط جنبه آموزشی داشته و هیچ گونه منفعت مالی ندارد .

دانلود پروژه دریافت داده های دیجیکالا

پس از دانلود برنامه وارد مسیر اصلی شده و دستور composer install را اجرا کنید .

web scraper حرفه ای با php

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

لیست نظرات

  1. حسام
    حسام

    مرسی از آموزش خوبتون .میشه درباره توییتر هم توضیحی بدید که چطوری میشه مثلا آخرین پست یه آیدی یا تعداد فالور و پست هاش هر چند ساعت یکبار دریافت کرد. حتما باید api توییتر داشته باشیم ( اگر آره میشه آموزشش رو بدید ) یا با curl , file_get_contents و یا web scraper و هر تابعی از این دست هم میشه .؟

    22 اسفند 1401 | 20:08:17
  • حسین باقری
    حسین باقری

    درود ، شما هم می تونید از api استفاده کنید و هم می تونید از کتابخانه های مخصوص php به عنوان web scraper استفاده کنید که session رو هم در داخل خودش ذخیره می کنه و می تونید با اون اطلاعات زیادی از twitter استخراج کنید در آینده شاید در مورد یک همچین موضوعی آموزشی رو منتشر کنم .

    28 اسفند 1401 | 15:19:43
  • reza
    reza

    مرسی از اموزش خوبتون. موفق باشید❤

    07 آذر 1400 | 22:47:13
  • contact us