Les sites Web explorés ne s’insèrent pas dans ma table SQL | Robot d’exploration PHP

la programmation


J’ai créé un robot d’exploration Web PHP, puis créé une table MySQL appelée “dex” comme dans index, puis je me suis connecté à la base de données via PDO et j’ai modifié le code pour “INSÉRER” les sites Web qui ne sont pas déjà explorés dans la table, ” UPDATE” pour les sites Web explorés et qui utilise les hachages d’URL comme indicateur ou “identifiant” pour les liens. Le terminal affiche tous les liens et liens qui leur sont liés, l’instruction if fonctionne parfaitement et il n’y a pas d’erreurs majeures, alors pourquoi n’insère-t-il pas les données dans la table “dex” ? chaque fois que je vérifie la table après le processus, je ne trouve que la ligne que j’ai insérée manuellement pour tester l’instruction if pour “UPDATE” ou “INSERT”. que puis-je faire pour résoudre ce problème et insérer la date de récupération du robot ?

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>

Chenille :

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

Ce que j’ai essayé :

au début, j’ai essayé différents liens qui m’ont donné une valeur vide, ce qui a entraîné des erreurs et des avertissements, puis j’ai modifié les liens et commencé à écrire l’instruction if “UPDATE”, “INSERT” et j’ai commencé à écrire spécifiquement le PDO d’insertion pour le tester. lorsque j’ai exécuté le fichier à l’aide de la commande php, j’ai obtenu les résultats escomptés en termes d’apparence dans le terminal, mais j’ai ensuite vérifié sur le tableau et découvert que rien n’avait été inséré. Je souhaite les insérer pour les utiliser dans mon moteur de recherche et les rendre consultables par requête.

Solution 1

Au lieu de tout développer à partir de zéro, pourquoi n’utilisez-vous pas un analyseur existant comme Documentation HTML DOM simple[^] ?

Celui-ci fonctionne très bien et vous fera gagner des heures de développement. Le reste est simple – la file d’attente des liens à traiter, etc. Je diviserais également le robot d’exploration et l’analyseur en deux scripts distincts – un pour l’exploration et le second pour l’analyse et l’extraction des URL.

コメント

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