我正在尝试基于Symfony2组件的PHP网络爬虫Goutte。我已经成功地以纯文本和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 Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', $uri);
echo $crawler->text() . "\n";
相反,对于这个站点,上面代码末尾的回显给了我:
错误请求(标头名称无效)
我可以在Firefox中看到该网站正常,并且使用wget --no-check-certificate
可以使用{{1}}检索其HTML,但没有其他选项(例如,设置标题或用户代理)。
我怀疑我需要在Goutte中设置一些HTTP标头。有没有人想我应该尝试哪些?
答案 0 :(得分:3)
我发现我的浏览器和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 Goutte\Client;
// 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,所以目标网站可以检测它作为机器人,如果他们希望(对于这个项目,我认为没有人)。