我正在试用Goutte,这是一个基于Symfony2组件的PHP网络爬虫。我已经成功地以明文和SSL形式检索了Google。但是,我遇到过一个ASP/SSL页面无法加载。
下面是我的代码:
// Load a crawler/browser system
require_once 'vendor/goutte/goutte.phar';
// Here's a demo of a page we want to parse
$uri = '(removed)';
use GoutteClient;
$client = new Client();
$crawler = $client->request('GET', $uri);
echo $crawler->text() . "n";
相反,对于这个站点,上面代码末尾的回显给了我这样的结果:
错误的请求(无效的报头名称)
我可以在Firefox中很好地看到站点,并且可以使用wget --no-check-certificate
检索它的HTML,没有其他选项(例如设置标头或用户代理)。
我怀疑我需要在Goutte中设置一些HTTP头。接下来我应该尝试哪些?
我发现我的浏览器和wget
都在标题中添加了一个非空的用户代理字段,所以我假设Goutte在这里没有设置任何内容。在获取之前将这个头文件添加到浏览器对象中可以修复这个问题:
// Load a crawler/browser system
require_once 'vendor/goutte/goutte.phar';
// Here's a demo of a page we want to parse
$uri = '(removed)';
use GoutteClient;
// Set up headers
$client = new Client();
$headers = array(
'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0',
);
foreach ($headers as $header => $value)
{
$client->setHeader($header, $value);
}
$crawler = $client->request('GET', $uri);
echo $crawler->text() . "n";
这里我复制了我的浏览器代理字符串,但在这种情况下,我认为任何东西都可以工作-只要它被设置。
顺便说一下,我在这里使用了浏览器UA,因为我试图准确地复制浏览器环境来调试这个特定的问题。一旦它工作了,我切换到一个自定义的UA,所以目标站点可以检测它作为一个机器人,如果他们希望(对于这个项目,我不认为有人有)。
我也遇到过这样的问题。
添加User-Agent
标头是不够的。我使用setServerParameter
功能添加了HTTP_USER_AGENT
,效果非常好。
完整的代码如下:
// Load a crawler/browser system
require_once 'vendor/goutte/goutte.phar';
// Here's a demo of a page we want to parse
$uri = '(removed)';
$ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0';
use GoutteClient;
// Set up headers
$client = new Client();
$client->setHeader('User-Agent', $ua);
$client->setServerParameter('HTTP_USER_AGENT', $ua);
$crawler = $client->request('GET', $uri);
echo $crawler->text() . "n";