بکندباز

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

سلام دوستان. در این مقاله می خوایم یک کد خزنده وب با PHP رو با هم بررسی کنیم. برای مثال صفحه اخبار ورزش 3 رو کروال می کنیم و بعد تک تک صفحات خبری که در اون صفحه قرار دارند. طی کد زیر، عنوان، چکیده، لینک عکس، لینک صفحه خبر، تعداد بازدید پست، تاریخ انتشار، توضیحات خبر و لیست برچست ها را استخراج می کنیم.

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

نصب با composer:

composer require fabpot/goutte

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

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

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

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

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


$news = [];

//صفحه آخرین اخبار ورزش 3
$url = "https://www.varzesh3.com/news";
$crawler = $client->request('GET', $url);

$crawler->filter('.newsbox')->each(function ($node, $i) {
    global $news;
    //گرفتن عنوان خبر
    if ($node->filter('.news-content>a')->count()‎ > 0) {
        $title = $node->filter('.news-content>a>h3')->text()‎;
    } else {
        $title = '';
    }

    //گرفتن لینک صفحه خبر
    if ($node->filter('.news-content>a')->count()‎ > 0) {
        $url = $node->filter('.news-content>a')->attr('href');
    } else {
        $url = '';
    }

    //گرفتن تصویر خبر
    if ($node->filter('.news-cover-box>.news-cover-image>img')->count()‎ > 0) {
        $img = $node->filter('.news-cover-box>.news-cover-image>img')->attr('src');
    } else {
        $img = '';
    }

    //خلاصه خبر
    if ($node->filter('.news-content>.caption')->count()‎ > 0) {
        $caption = $node->filter('.news-content>.caption')->text()‎;
    }

    //تاریخ انتشار
    if ($node->filter('.news-content>.news-data>.date')->count()‎ > 0) {
        $date = $node->filter('.news-content>.news-data>.date')->text()‎;
    }


    //تعداد بازدید پست
    if ($node->filter('.news-content>.news-data>.view')->count()‎ > 0) {
        $view = $node->filter('.news-content>.news-data>.view')->text()‎;
    }



    //بازکردن تک تک صفحات 
    $client2 = new Goutte\Client()‎;
    $crawler2 = $client2->request('GET', $url);

    //توضیحات کامل
    if ($crawler2->filter('.news-content-holder>.news-content>.news-text')->count()‎ > 0) {
        $description = $crawler2->filter('.news-content-holder>.news-content>.news-text')->html()‎;
    } else {
        $description = '';
    }

    //برچسب های نوشته در این آرایه نگه داری می شوند
    global $tags;
    $tags = [];
    $crawler2->filter('.news-footer .tag')->each(function ($node2, $i2) {
        global $tags;
        if ($node2->filter('a span')->count()‎ > 0) {
            $tag = $node2->filter('a span')->text()‎;
        } else {
            $tag = '';
        }

        $tags[] = $tag;
    });

    $news[] = array(
        'title' => $title,
        'url' => $url,
        'img_url' => $img,
        'caption' => $caption,
        'date' => $date,
        'view' => $view,
        'description' => $description,
        'tags' => $tags,
    );
});
zohreh

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*

    روح اله پاسخ

    سلام من میخام داخل هر پست توی کانال تلگرام خودم روی هر پست یک دگمه سفارش بزارم که وقتی روش کلیک شد قسمتی از متن پست(کد محصول) رو برام دایرکت بکنه. نکته اش اینجاست که هر دگمه سفارش کار بخصوصی رو انجام خواهد داد چون کد محصول هر پست باهم فرق داره هربار یه کدمحصول متفاوتی دایرکت باید بشه....اینو چجوری میشه پیاده سازیش کرد

      zohreh پاسخ

      سلام. 

      مسئله شما در کدوم قسمت هست؟ نحوه قرار دادن دکمه زیر پست ها رو می خواید بدونید؟ یا نحوه استخراج کد محصول از متن؟ یا نحوه دایرکت شدنش؟

      کدوم قسمت به مشکل خوردید؟