2017-04-06 68 views
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

回答

1
$stack = HandlerStack::create(); 

代替

$stack = new HandlerStack(); 
$stack->setHandler(new CurlHandler()); 

这一点很重要,因为create()增加了额外的中间件,尤其是对重定向。

+0

非常奇妙,就是这样 - 谢谢。事实证明,如果我已经阅读了整个页面,我会在文档中发现这一点 - 我认为我得到代码失明':-)' – halfer

+1

它发生了。不用谢 ;) –

相关问题