لا يتم إدراج مواقع الويب التي تم الزحف إليها في جدول SQL الخاص بي | زاحف الويب PHP


لقد قمت بإنشاء زاحف ويب PHP ثم قمت بإنشاء جدول MySQL يسمى “dex” كما في الفهرس، ثم قمت بالاتصال بقاعدة البيانات من خلال PDO وقمت بتعديل الكود إلى مواقع الويب “INSERT” التي لم يتم الزحف إليها بالفعل في الجدول، ” UPDATE” لمواقع الويب التي يتم الزحف إليها، وتستخدم تجزئات URL كمؤشر أو “معرف” للروابط. تعرض المحطة جميع الروابط والروابط المتعلقة بها، وعبارة if تعمل بشكل جيد ولا توجد أخطاء كبيرة، فلماذا لا تقوم بإدراج البيانات في جدول “dex”؟ في كل مرة أتحقق فيها من الجدول بعد العملية، أجد فقط الصف الذي أدخلته يدويًا لاختبار عبارة if لـ “UPDATE” أو “INSERT”. ما الذي يمكنني فعله لإصلاح هذه المشكلة وإدراج التاريخ الذي يسترده الزاحف؟

اختبار.html:

<a href="https://google.com"></a>
<a href="https://www.yahoo.com/"></a>
<a href="https://www.bing.com/"></a>
<a href="https://duckduckgo.com/"></a>

الزاحف:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$start = "http://localhost/deepsearch/test.html";

$pdo = new PDO('mysql:host=127.0.0.1;dbname=deepsearch', 'root', '');

$already_crawled = array();
$crawling = array();

function get_details($url) {
    $options = array('http'=>array('method'=>"GET", 'headers'=>"User-Agent: howBot/0.1\n"));
    $context = stream_context_create($options);

    // Suppress warnings for HTML parsing errors
    libxml_use_internal_errors(true);

    $doc = new DOMDocument();
    @$html = @file_get_contents($url, false, $context);

    // Load HTML content and check for parsing errors
    if ($doc->loadHTML($html)) {
        if (!empty($titleElements)) {
            $title = $titleElements->item(0);
            $title = $title->nodeValue;
        } else {
            $title = "";
        }
        
        $description = "";
        $keywords = "";
        $metas = $doc->getElementsByTagName("meta");
        for ($i = 0; $i < $metas->length; $i++) {
            $meta = $metas->item($i);

            if ($meta->getAttribute("name") == strtolower("description")) {
                $description = $meta->getAttribute("content");
            }
            if ($meta->getAttribute("name") == strtolower("keywords")) {
                $keywords = $meta->getAttribute("content");
            }
        }

        return '{"Title": "'.str_replace("\n", "", $title).'", "Description": "'.str_replace("\n", "", $description).'", "Keywords": "'.str_replace("\n", "", $keywords).'", "URL": "'.$url.'"}';
    } else {
        // Handle the parsing error
        echo "HTML parsing error: " . libxml_get_last_error()->message . "\n";
        return ''; // Return an empty string or handle the error as needed
    }
}
function follow_links($url)
{

    global $pdo;
    global $already_crawled;
    global $crawling;

    $options = array('http' => array('method' => "GET", 'headers' => "User-Agent: howBot/0.1\n"));
    $context = stream_context_create($options);

    $doc = new DOMDocument();
    @$doc->loadHTML(@file_get_contents($url, false, $context));

    $linklist = $doc->getElementsByTagName("a");

    foreach ($linklist as $link) {
        $l = $link->getAttribute("href");

        if (substr($l, 0, 1) == "/" && substr($l, 0, 2) != "//") {
            $l = parse_url($url)["scheme"] . "://" . parse_url($url)["host"] . $l;
        } else if (substr($l, 0, 2) == "//") {
            $l = parse_url($url)["scheme"] . ":" . $l;
        } else if (substr($l, 0, 2) == "./") {
            $l = parse_url($url)["scheme"] . "://" . parse_url($url)["host"] . dirname(parse_url($url)["path"]) . substr($l, 1);
        } else if (substr($l, 0, 1) == "#") {
            $l = parse_url($url)["scheme"] . "://" . parse_url($url)["host"] . parse_url($url)["path"] . $l;
        } else if (substr($l, 0, 3) == "../") {
            $l = parse_url($url)["scheme"] . "://" . parse_url($url)["host"] . "/" . $l;
        } else if (substr($l, 0, 11) == "javascript:") {
            continue;
        } else if (substr($l, 0, 5) != "https" && substr($l, 0, 4) != "http") {
            $l = parse_url($url)["scheme"] . "://" . parse_url($url)["host"] . "/" . $l;
        }

        if (!in_array($l, $already_crawled)) {
            $already_crawled[] = $l;
            $crawling[] = $l;

            $details = json_decode(get_details($l));
            echo $details->URL . " ";

            $rows = $pdo->query("SELECT * FROM dex WHERE url_hash='" . md5($details->URL) . "'");
            $rows = $rows->fetchColumn();

            $params = array(':title' => $details->Title, ':description' => $details->Description, ':keywords' => $details->Keywords, ':url' => $details->URL, ':url_hash' => md5($details->URL));

            if ($rows > 0) {
                echo "UPDATE" . "\n";
            } else {

                if (!is_null($params[':title']) && !is_null($params[':description']) && $params[':title'] != '') {

                    $result = $pdo->prepare("INSERT INTO dex (title, description, keywords, url, url_hash) VALUES (:title, :description, :keywords, :url, :url_hash)");
                    $result= $result->execute($params); 


                    //if ($result) {
                    //    echo "Inserted successfully.\n";
                    //} else {
                    //    echo "Insertion failed.\n";
                    //    print_r($stmt->errorInfo());
                    //}
                }
            }


            //print_r($details)."\n";
            //echo get_details($l)."\n";
            //echo $l."\n";
        }

    }
    array_shift($crawling);
    foreach ($crawling as $site) {
        follow_links($site);
    }
}




follow_links($start);
//print_r($already_crawled);
?>

ما حاولت:

في البداية جربت روابط مختلفة أعطتني قيمة فارغة مما أدى إلى حدوث أخطاء وتحذيرات، ثم قمت بتغيير الروابط وبدأت في كتابة عبارة if “UPDATE” و”INSERT” وبدأت في كتابة إدراج PDO على وجه التحديد أولاً لاختباره. عندما قمت بتنفيذ الملف باستخدام الأمر php، حصلت على النتائج المقصودة فيما يتعلق بالشكل الذي كان من المفترض أن يبدو عليه في الوحدة الطرفية ولكن بعد ذلك راجعت الجدول واكتشفت أنه لم يتم إدراج أي شيء. أريد إدراجها لاستخدامها في محرك البحث الخاص بي وجعلها قابلة للبحث عن طريق الاستعلام.

الحل 1

بدلاً من تطوير كل شيء من الصفر، لماذا لا تستخدم المحلل اللغوي الموجود مثل وثائق HTML DOM بسيطة[^] ؟

هذا يعمل بشكل جيد للغاية وسيوفر لك ساعات من التطوير. الباقي سهل – قائمة انتظار الروابط للمعالجة وما إلى ذلك. لقد قمت أيضًا بتقسيم الزاحف والمحلل اللغوي إلى نصين منفصلين – أحدهما للزحف والثاني لتحليل عناوين URL واستخراجها.

コメント

タイトルとURLをコピーしました