https://github.com/spatie/crawler
У меня есть наблюдатель сканирования, как показано ниже:
<?php
namespace App\Observers;
use DOMDocument;
use GuzzleHttp\Exception\RequestException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use Spatie\Crawler\CrawlObserver;
class PageCrawlObserver extends CrawlObserver
{
private $pages =[];
public function willCrawl(UriInterface $uri) {
echo "Now crawling: " . (string) $uri . PHP_EOL;
}
/**
* Called when the crawler has crawled the given url successfully.
*
* @param \Psr\Http\Message\UriInterface $url
* @param \Psr\Http\Message\ResponseInterface $response
* @param \Psr\Http\Message\UriInterface|null $foundOnUrl
*/
public function crawled(UriInterface $url, ResponseInterface $response, ?UriInterface $foundOnUrl = null)
{
$path = $url->getPath();
$doc = new DOMDocument();
@$doc->loadHTML($response->getBody());
$title = $doc->getElementsByTagName("title")[0]->nodeValue;
$this->pages[] = [
'path'=>$path,
'title'=> $title
];
dd($this->pages);
exit;
}
/**
* Called when the crawler had a problem crawling the given url.
*
* @param \Psr\Http\Message\UriInterface $url
* @param \GuzzleHttp\Exception\RequestException $requestException
* @param \Psr\Http\Message\UriInterface|null $foundOnUrl
*/
public function crawlFailed(UriInterface $url, RequestException $requestException, ?UriInterface $foundOnUrl = null)
{
echo 'failed';
}
public function finishedCrawling()
{
echo 'crawled ' . count($this->pages) . ' urls' . PHP_EOL;
foreach ($this->pages as $page){
echo sprintf("Url path: %s Page title: %s%s", $page['path'], $page['title'], PHP_EOL);
}
}
}
Этот код работает! Но я должен поставить команду exit
в конце функции crawled
. В противном случае, он просто загружается вечно, пока не получит сообщение об истечении времени ожидания. Я пытался увеличить время выполнения PHP, но он просто загружается, пока не достигнуто это время, и показывает ошибку тайм-аута.
Мне нужно запустить функцию finishedCrawling
, поэтому я не хочу ставить функцию exit
, как в приведенном выше коде. Есть идеи для этого? Спасибо!