क्रॉल की गई वेबसाइटें मेरी SQL तालिका में सम्मिलित नहीं हो रही हैं | PHP वेब क्रॉलर


मैंने एक PHP वेब क्रॉलर बनाया है और फिर इंडेक्स के रूप में “डेक्स” नामक एक MySQL तालिका बनाई है, फिर मैंने पीडीओ के माध्यम से डेटाबेस से कनेक्ट किया और कोड को “INSERT” वेबसाइटों में बदल दिया जो पहले से ही तालिका में क्रॉल नहीं हुई हैं, ” अद्यतन” उन वेबसाइटों के लिए है जिन्हें क्रॉल किया जाता है, और लिंक के लिए संकेतक या “आईडी” के रूप में यूआरएल हैश का उपयोग किया जाता है। टर्मिनल उनसे संबंधित सभी लिंक और लिंक दिखाता है, यदि कथन पूरी तरह से काम करता है और कोई बड़ी त्रुटि नहीं है, तो यह डेटा को “डेक्स” तालिका में क्यों नहीं डालता है? जब भी मैं प्रक्रिया के बाद तालिका की जांच करता हूं तो मुझे केवल वह पंक्ति मिलती है जिसे मैंने “अद्यतन” या “सम्मिलित करें” के लिए if कथन का परीक्षण करने के लिए मैन्युअल रूप से डाला था। मैं इस समस्या को ठीक करने और क्रॉलर द्वारा पुनर्प्राप्त की गई तारीख डालने के लिए क्या कर सकता हूं?

Test.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);
?>

मैंने क्या प्रयास किया है:

सबसे पहले मैंने अलग-अलग लिंक आज़माए, जिससे मुझे एक खाली मान मिला, जिसके परिणामस्वरूप त्रुटियां और चेतावनियां हुईं, फिर मैंने लिंक बदल दिए और “अपडेट”, “इंसर्ट” इफ़ स्टेटमेंट लिखना शुरू कर दिया और इसका परीक्षण करने के लिए पहले विशेष रूप से इन्सर्ट पीडीओ लिखना शुरू कर दिया। जब मैंने कमांड php का उपयोग करके फ़ाइल को निष्पादित किया तो मुझे इच्छित परिणाम मिले कि यह टर्मिनल में कैसा दिखना चाहिए था, लेकिन फिर मैंने टेबल पर जाँच की और पाया कि कुछ भी नहीं डाला गया था। मैं इन्हें अपने खोज इंजन में उपयोग करने के लिए सम्मिलित करना चाहता हूं और उन्हें क्वेरी द्वारा खोजने योग्य बनाना चाहता हूं।

समाधान 1

स्क्रैच से सब कुछ विकसित करने के बजाय आप मौजूदा पार्सर का उपयोग क्यों नहीं करते सरल HTML DOM दस्तावेज़ीकरण[^] ?

यह बहुत अच्छी तरह से काम करता है और आपके विकास के घंटों को बचाएगा। बाकी सब आसान है – प्रक्रिया आदि के लिए लिंक की कतार। मैं क्रॉलर और पार्सर को भी दो अलग-अलग स्क्रिप्ट में विभाजित करूंगा – एक क्रॉलिंग के लिए और दूसरा यूआरएल को पार्स करने और निकालने के लिए।

コメント

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