-9

Symfony2 コンポーネントに基づく PHP Web クローラーである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";

代わりに、この 1 つのサイトの上記のコードの最後にある echo は、次のようになります。

不正なリクエスト (無効なヘッダー名)

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_AGENT関数を使用して追加しsetServerParameterたところ、魅力的に機能しました。

完全なコードは次のとおりです。

// 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 に答える