[ad_1]
Saya sudah membuat web crawler PHP lalu membuat tabel MySQL bernama “dex” seperti pada indeks, lalu saya sambungkan ke database melalui PDO dan tweak kodenya ke “INSERT” website yang belum dirayapi ke dalam tabel tersebut, ” UPDATE” untuk situs web yang dirayapi, dan menggunakan hash URL sebagai indikator atau “id” untuk tautan. Terminal menampilkan semua tautan dan tautan yang terkait dengannya, pernyataan if berfungsi dengan baik dan tidak ada kesalahan besar, jadi mengapa tidak memasukkan data ke dalam tabel “dex”? setiap kali saya memeriksa tabel setelah proses saya hanya menemukan baris yang saya sisipkan secara manual untuk menguji pernyataan if untuk “UPDATE” atau “INSERT”. apa yang dapat saya lakukan untuk memperbaiki masalah ini dan memasukkan tanggal pengambilan crawler?
Tes.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>
Perayap:
<?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); ?>
Apa yang saya coba:
pada awalnya saya mencoba tautan berbeda yang memberi saya nilai kosong yang mengakibatkan kesalahan dan peringatan kemudian saya mengubah tautan dan mulai menulis pernyataan “UPDATE”, “INSERT” if dan mulai secara khusus menulis sisipan PDO terlebih dahulu untuk mengujinya. ketika saya mengeksekusi file menggunakan perintah php saya mendapatkan hasil yang diinginkan dalam hal tampilannya di terminal tetapi kemudian saya memeriksa tabel dan menemukan bahwa tidak ada yang dimasukkan. Saya ingin memasukkan ini untuk digunakan di mesin pencari saya dan membuatnya dapat dicari berdasarkan kueri.
Solusi 1
Daripada mengembangkan semuanya dari awal kenapa tidak menggunakan parser yang sudah ada Dokumentasi HTML DOM sederhana[^] ?
Yang ini bekerja dengan sangat baik dan akan menghemat waktu pengembangan Anda. Sisanya mudah – antrian tautan untuk diproses, dll. Saya juga membagi crawler dan parser dalam dua skrip terpisah – satu untuk perayapan dan yang kedua untuk parsing dan mengekstraksi URL.
[ad_2]
コメント