0
我使用的Spatie\Crawler
爬虫软件在一个相当标准的方式,就像这样:我可以将中间件添加到默认的Guzzle 6 HandlerStack中,而不是创建新的堆栈吗?
$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);
我省略了类MyCrawlObserver
为了简洁MyCrawlProfile
的定义,但无论如何,这个工程因为它代表。
我想添加一些中间件,以改变一些请求才制成,所以我加了这个演示代码:
$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());
我不知道现在还有什么其他的事情都是在默认情况下狂饮,我不小心通过创建一个新的HandlerStack
去除成立。饼干?重试机制?其他的东西?我现在不需要这些东西,但是如果我的代码只是修改了现有的堆栈,我会对我的系统的长期可靠性更有信心。
有没有办法做到这一点?据我所知,我正在做的事情as per the manual。
非常奇妙,就是这样 - 谢谢。事实证明,如果我已经阅读了整个页面,我会在文档中发现这一点 - 我认为我得到代码失明':-)' – halfer
它发生了。不用谢 ;) –