Przejdź do głównej treści
Grafika przedstawia ukryty obrazek

Jak napisać bota w PHP do skanowania internetu

Jak napisać bota w PHP do skanowania internetu

Boty internetowe (ang. web crawlers, spiders) są programami, które automatycznie przeszukują strony internetowe w celu zbierania danych, np. do wyszukiwarek, monitorowania cen, analizy treści czy badania konkurencji. W tym artykule pokażę, jak stworzyć prostego bota w PHP, który potrafi pobierać strony i analizować zawarte w nich linki.

1. Wymagania wstępne

Aby napisać bota w PHP, potrzebujesz:

  • Serwera z zainstalowanym PHP (np. lokalnie XAMPP, MAMP, lub serwer VPS),
  • Podstawowej znajomości PHP,
  • Dostępu do internetu,
  • Opcjonalnie: bazy danych (np. MySQL) do przechowywania wyników.

2. Co będzie robił nasz bot?

Bot:

  • Otrzyma adres startowy (URL),
  • Pobierze zawartość strony,
  • Przeszuka stronę w poszukiwaniu linków,
  • Zachowa unikalne linki i przejdzie do kolejnych podstron,
  • Ograniczy głębokość skanowania (aby uniknąć pętli lub przeciążenia serwera).

3. Podstawowy kod bota w PHP

<?php

$visited = [];
$maxDepth = 2;

function crawl($url, $depth = 0) {
    global $visited, $maxDepth;

    if (isset($visited[$url]) || $depth > $maxDepth) {
        return;
    }

    echo "Skanuję: $url\n";
    $visited[$url] = true;

    $html = @file_get_contents($url);
    if ($html === false) {
        echo "Nie można pobrać strony: $url\n";
        return;
    }

    // Parsowanie linków
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $links = $doc->getElementsByTagName('a');

    foreach ($links as $link) {
        $href = $link->getAttribute('href');
        if (strpos($href, 'http') === 0) {
            crawl($href, $depth + 1);
        }
    }
}

// Start
$startUrl = "https://example.com";
crawl($startUrl);

?>

4. Wyjaśnienie kodu

  • $visited — tablica śledząca, które strony zostały już odwiedzone,
  • crawl() — funkcja rekurencyjna odwiedzająca stronę i analizująca linki,
  • file_get_contents() — funkcja PHP do pobierania zawartości strony (można zastąpić cURL),
  • DOMDocument — wbudowana klasa PHP do parsowania HTML i znajdowania tagów <a>.

5. Ulepszenia

Aby bot był bardziej zaawansowany:

  • Użyj cURL z nagłówkami User-Agent,
  • Dodaj obsługę robots.txt (czy bot ma prawo skanować stronę),
  • Zapisuj wyniki do bazy danych (MySQL, SQLite),
  • Wprowadź opóźnienie (sleep) między żądaniami, aby nie obciążać serwera,
  • Dodaj obsługę kodowania URL i błędów HTTP,
  • Filtruj tylko linki z tej samej domeny, jeśli chcesz skanować tylko jeden serwis.

6. Legalność i etyka

Zawsze sprawdzaj plik robots.txt witryny, który wskazuje, co wolno skanować. Nie każdy serwis zgadza się na automatyczne pobieranie treści. Nie obciążaj nadmiernie serwerów. Używaj botów etycznie i zgodnie z prawem.

7. Przykład z użyciem cURL i user-agenta

function getPageContent($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'MyPHPBot/1.0 (+https://mybot.example.com)');
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

Zamień file_get_contents($url) na getPageContent($url) dla większej kontroli.

8. Realizacja w Koseven Framework na Minion_Task

Użycie Koseven Framework (lekkiego forka Kohana 3.3) oraz wbudowanego Minion_Task i Request::factory to bardzo dobra decyzja do realizacji modularnego i dobrze zarządzanego bota skanującego internet.

Cel:

Stworzyć bota w Koseven, który:

  • będzie uruchamiany z konsoli przez Minion_Task,
  • wykorzysta Request::factory() do pobierania stron,
  • będzie analizował zawartość i szukał linków (np. <a href="">),
  • będzie ograniczał głębokość rekursji,
  • będzie pamiętał odwiedzone adresy.

Struktura projektu:

application/
    classes/
        Task/
            Crawl.php   ← Nasz bot jako zadanie Minion

Plik: application/classes/Task/Crawl.php

<?php defined('SYSPATH') OR die('No direct script access.');

class Task_Crawl extends Minion_Task {

    protected $_visited = [];
    protected $_max_depth = 2;
    //domyślne opcje url i depth
    protected $_options = [
        'url' => 'https://example.com',
        'depth' => 2,
    ];

    protected function _execute(array $params) {
        $url = $params['url'];
        $this->_max_depth = (int) ($params['depth']);

        Minion_CLI::write("Rozpoczynam skanowanie od: $url\n");

        $this->crawl($url, 0);
    }

    protected function crawl($url, $depth) {
        if (isset($this->_visited[$url]) || $depth > $this->_max_depth) {
            return;
        }

        Minion_CLI::write("[$depth] Odwiedzam: $url");
        $this->_visited[$url] = true;

        try {
            $response = Request::factory($url)
                ->method(Request::GET)
                ->execute();

            $body = $response->body();

        } catch (Exception $e) {
            Minion_CLI::write("Błąd przy pobieraniu $url: " . $e->getMessage());
            return;
        }

        // Parsowanie HTML
        if (!empty($body))
        {
            libxml_use_internal_errors(true);
            $dom = new DOMDocument();
            @$dom->loadHTML($body);
            libxml_clear_errors();

            $links = $dom->getElementsByTagName('a');

            foreach ($links as $link) {
                $href = $link->getAttribute('href');

                // Tylko pełne linki http(s)
                if (strpos($href, 'http') === 0) {
                    $this->crawl($href, $depth + 1);
                }
            }
        }
    }
}

Jak uruchomić bota?

Z terminala w katalogu projektu Koseven:

php index.php --task=crawl --url=https://example.com --depth=2

Możliwe rozszerzenia:

  1. Ograniczenie do jednej domeny:
$start_host = parse_url($this->_defaults['url'], PHP_URL_HOST);
$current_host = parse_url($href, PHP_URL_HOST);
if ($current_host !== $start_host) continue;
  1. Zapis wyników do pliku:
file_put_contents(APPPATH.'logs/visited.txt', implode(PHP_EOL, array_keys($this->_visited)));
  1. Opóźnienie między żądaniami:
sleep(1); // między crawlami
  1. Zapisanie danych do bazy danych (ORM):
    Utwórz model np. Model_Url i w metodzie crawl() zapisuj dane:
$url_model = ORM::factory('Url');
$url_model->url = $url;
$url_model->save();

Podsumowanie

Boty w PHP to proste, ale potężne narzędzia. Można je wykorzystać do monitorowania stron, analizy SEO, pobierania danych czy budowania wyszukiwarek. Kluczem do sukcesu jest etyczne i rozważne podejście oraz dobre filtrowanie i zabezpieczenia przed zapętleniem.

Dzięki Koseven i Minion:

  • masz skrypt uruchamialny z konsoli,
  • możesz przetwarzać parametry z CLI,
  • skanujesz dynamicznie strony dzięki Request::factory,
  • kod jest czysty, rozdzielony logicznie, i łatwo go rozszerzać.
17 maja 2025 10

Kategorie

programowanie

Tagi

koseven php

Dziękujemy!
()

Powiązane wpisy


Informacja o cookies

Moja strona internetowa wykorzystuje wyłącznie niezbędne pliki cookies, które są wymagane do jej prawidłowego działania. Nie używam ciasteczek w celach marketingowych ani analitycznych. Korzystając z mojej strony, wyrażasz zgodę na stosowanie tych plików. Możesz dowiedzieć się więcej w mojej polityce prywatności.