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');
これで問題なくできました。