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:
- 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;
- Zapis wyników do pliku:
file_put_contents(APPPATH.'logs/visited.txt', implode(PHP_EOL, array_keys($this->_visited)));
- Opóźnienie między żądaniami:
sleep(1); // między crawlami
- Zapisanie danych do bazy danych (ORM):
Utwórz model np.Model_Url
i w metodziecrawl()
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ć.