Я использую программное обеспечение Spatie\Crawler
crawler довольно стандартным образом, например:
$client = new Client([ RequestOptions::COOKIES => true, RequestOptions::CONNECT_TIMEOUT => 10, RequestOptions::TIMEOUT => 10, RequestOptions::ALLOW_REDIRECTS => true, ]); $crawler = new Crawler($client, 1); $crawler-> setCrawlProfile(new MyCrawlProfile($startUrl, $pathRegex))-> setCrawlObserver(new MyCrawlObserver())-> startCrawling($url);
Я пропустил определение классов MyCrawlProfile
для MyCrawlObserver
для краткости, но в любом случае это работает так, как оно есть.
Я хочу добавить некоторое промежуточное программное обеспечение, чтобы изменить некоторые запросы до их создания, поэтому я добавил этот демонстрационный код:
$stack = new HandlerStack(); $stack->setHandler(new CurlHandler()); $stack->push( Middleware::mapRequest(function (RequestInterface $request) { echo "Middleware running\n"; return $request; }) ); $client = new Client([ RequestOptions::COOKIES => true, RequestOptions::CONNECT_TIMEOUT => 10, RequestOptions::TIMEOUT => 10, RequestOptions::ALLOW_REDIRECTS => true, 'handler' => $stack, ]); // ... rest of crawler code here ...
Однако он попадает на первое препятствие – он разрушает корень сайта ( /
), который на самом деле является перенаправлением Location
, а затем останавливается. Оказывается, теперь я пропускаю RedirectMiddleware
несмотря на то, что не убрал его намеренно.
Итак, моя проблема исправлена, добавив также:
$stack->push(Middleware::redirect());
Интересно, какие другие вещи настроены по умолчанию в Guzzle, которые я случайно удалил, создав новый HandlerStack
. Печенье? Механизмы повторного запуска? Другие вещи? Мне сейчас не нужны эти вещи, но я был бы более уверен в долговечности моей системы, если бы мой код просто изменил существующий стек.
Есть ли способ сделать это? Насколько я могу судить, я делаю вещи в соответствии с руководством .