Mekletāji
#5
Nu ko, pamēģināsim "iejūgt" šai problēmā AI.

Ja ar “unikālu adrešu sarakstu” domā URL adreses viena domēna ietvaros (piemēram, visas lapas no
Kods:
example.com
bez dublikātiem), tad PHP var izveidot vienkāršu "crawleri", kas:
  1. Sāk no sākuma URL.
  2. Nolasa lapas HTML.
  3. Atrod visas saites (
    Kods:
    <a href="...">
    ).
  4. Patur tikai tās, kas pieder tam pašam domēnam.
  5. Noņem dublikātus.
  6. Rekursīvi apmeklē vēl neapmeklētās lapas.
Piemērs:
Kods:
<?php $startUrl = "https://example.com"; $visited = []; $queue = [$startUrl]; $domain = parse_url($startUrl, PHP_URL_HOST); while (!empty($queue)) {     $url = array_shift($queue);     if (isset($visited[$url])) {         continue;     }     echo "Pārbauda: $url\n";     $visited[$url] = true;     $html = @file_get_contents($url);     if ($html === false) {         continue;     }     preg_match_all('/href=["\']([^"\']+)["\']/i', $html, $matches);     foreach ($matches[1] as $link) {         $absoluteUrl = $link;         // Relatīvās saites pārvērš absolūtās         if (strpos($link, 'http') !== 0) {             $absoluteUrl = rtrim($url, '/') . '/' . ltrim($link, '/');         }         $host = parse_url($absoluteUrl, PHP_URL_HOST);         if ($host === $domain && !isset($visited[$absoluteUrl])) {             $queue[] = $absoluteUrl;         }     } } echo "\nUnikālās adreses:\n"; foreach (array_keys($visited) as $url) {     echo $url . "\n"; }
Ja mērķis ir tikai savākt unikālas adreses no datubāzes vai masīva, tas ir daudz vienkāršāk:
Kods:
$addresses = [     '/produkti',     '/kontakti',     '/produkti',     '/par-mums' ]; $unique = array_unique($addresses); print_r($unique);


Kods:
<?php $startUrl = "https://kubele.lv"; $visited = []; $queue = [$startUrl]; $domain = parse_url($startUrl, PHP_URL_HOST); function normalizeUrl($url) {     // Noņem #anchor     $url = preg_replace('/#.*$/', '', $url);     // Noņem trailing slash     $url = rtrim($url, '/');     return $url; } while (!empty($queue)) {     $currentUrl = array_shift($queue);     $currentUrl = normalizeUrl($currentUrl);     if (isset($visited[$currentUrl])) {         continue;     }     echo "Skenē: $currentUrl\n";     $visited[$currentUrl] = true;     $html = @file_get_contents($currentUrl);     if ($html === false) {         continue;     }     preg_match_all('/href=["\'](.*?)["\']/i', $html, $matches);     foreach ($matches[1] as $link) {         // Izlaiž mailto:, javascript:, tel:         if (             str_starts_with($link, 'mailto:') ||             str_starts_with($link, 'javascript:') ||             str_starts_with($link, 'tel:')         ) {             continue;         }         // Relatīvās adreses -> absolūtās         if (!preg_match('/^https?:\/\//', $link)) {             if (str_starts_with($link, '/')) {                 $link = "https://$domain$link";             } else {                 $link = $currentUrl . '/' . $link;             }         }         $link = normalizeUrl($link);         $host = parse_url($link, PHP_URL_HOST);         // Tikai viena domēna adreses         if ($host === $domain) {             if (!isset($visited[$link])) {                 $queue[] = $link;             }         }     } } echo "\n=== Unikālās adreses ===\n"; foreach (array_keys($visited) as $url) {     echo $url . PHP_EOL; }[/php]
"Kā cilvēks, kam trūkst pašcieņas, nav dīdzējs, bet nīcējs, tā arī tauta, kurai nav pašapziņas." K.Mīlenbahs
Atbilde
« Vecāks | Jaunāks »


Ziņas šai virtenē
Mekletāji - LvSnor - 2020-07-26 1:44
RE: Mekletāji - LvSnor - 2023-03-19 23:27
RE: Mekletāji - LvSnor - 2025-09-06 15:43
RE: Mekletāji - LvSnor - 2025-09-06 15:46
RE: Mekletāji - LvSnor - 2026-05-30 18:55

Pārlēkt uz:


Users browsing this thread: 1 Guest(s)