LoginSignup
9
9

More than 5 years have passed since last update.

Goutteでユーザーエージェントを変更する本当の正しいやり方

Last updated at Posted at 2016-04-12

FriendsOfPHP/Goutte: Goutte, a simple PHP Web Scraper

スクレイピングツールとして有名なGoutteでテスト用クローラー作っていて少し引っかかったことです。

  • PHP 7.0.5
  • Goutte 3.1

問題点

もしかしたらバージョンによって異なるのかもしれませんが、ネットで拾った情報で下記のようにしてUAの変更を試みたところ、ちょっとした不具合がありました。

$client = new Client();
$client->setHeader('User-Agent', 'MyUserAgent')->request('GET', 'http://localhost');

これだと、アプリケーション側では変更したUAであるMyUserAgentが取れますが、Webサーバー(nginx)側のログがSymfony2 BrowserKitになってしまいます。

検証

Symfony2 BrowserKitでソースコードを検索すると、該当箇所が見当たります。

symfony/Client.php at 3.0 · symfony/symfony

symfony/src/Symfony/Component/BrowserKit/Client.php
/**
 * Sets server parameters.
 *
 * @param array $server An array of server parameters
 */
public function setServerParameters(array $server)
{
    $this->server = array_merge(array(
        'HTTP_USER_AGENT' => 'Symfony2 BrowserKit',
    ), $server);
}

Client生成時にこれによって初期値がセットされ、どうやらsetHeaderでは上書きされない模様です。

解決策

コンストラクタの引数に渡す方法もありますが、私は頻繁にUAを切り換えて使うので、UAリストを用意しsetUserAgentというメソッドを生やして扱いやすくしました。

MyClient.php
<?php

/**
 * Class MyClient
 *
 * HTTPクライアント
 */
class MyClient extends \Goutte\Client
{
    /**
     * @var array $ua  ユーザーエージェントのリスト
     */
    protected $ua = [
        'pc.chrome' => 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36',
        'sp.safari' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
        'bot.google' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
    ];

    /**
     * ユーザーエージェントを切り替える
     *
     * @param  string  $platform
     * @return MyClient
     */
    public function setUserAgent(string $platform)
    {
        $this->setServerParameters(['HTTP_USER_AGENT' => $this->ua[$platform]]);

        return $this;
    }
}

使い方:

$client = new MyClient();
$client->setUserAgent('pc.chrome')->request('GET', 'http://localhost');

これで問題なくできました。

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9