-9

我正在尝试基于 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没有其他选项(例如,设置标题或用户代理)很好地检索它的 HTML。

我怀疑我需要在 Goutte 中设置一些 HTTP 标头。有没有人知道我应该尝试哪些?

4

2 回答 2

4

我发现我的浏览器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,因此如果目标站点愿意,可以将其检测为机器人(对于这个项目,我认为没有人拥有)。

于 2013-06-18T23:58:00.443 回答
1

我也有这个问题。

添加User-Agent标题是不够的。我添加了HTTP_USER_AGENTusingsetServerParameter功能,它就像一个魅力。

这是完整的代码:

// 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 Goutte\Client;

// 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";
于 2015-08-16T10:15:29.423 回答