GoutteでHTTPリクエストなしに文字列からスクレイプする方法
PHP 5.3のWebスクレーパーとしてGoutte 1.0.6
を使っています。
一度訪問したサイトのHTMLをファイルキャッシュなどに格納しておき、2回目からはファイルキャッシュからHTMLを文字列として変数に読み込み、その内容をスクレイピングするような動作をさせています。
$client = new Goutte\Client;
$is_cached = false;
if ($cache_data = $cache->get($url)) {
$crawler = $client->request('GET', '');
$crawler->clear();
$crawler->addHtmlContent($cache_data, 'cp932');
$is_cached = true;
}
else {
$crawler = $client->request('GET', $url);
$status = $client->getResponse()->getStatus();
if (($status != 200) && ($status != 304 )) {
return array(status => $status);
}
}
のようなコードにしていますが、キャッシュがヒットした場合、空のGET
をさせることでCrawler
オブジェクトを得て、いったんスクレイプ対象のHTMLを$crawler->clear()
で捨ててから改めて$crawler->addHtmlContent($cache_data, 'cp932');
でHTMLを食べさせるというアドホックなコードになっています。
実際には無駄なHTTPリクエストが発生しておりますので、改善できないかと考えています。
Goutte
を使ったスクレイピングで、HTTPリクエストなしでスクレイピングできるcrawler
オブジェクトを生成させる方法をご存知の方は、ご教示いただけないでしょうか。
(投稿後すぐに自己解決したので一時ここに解決法を載せていましたが、回答の方に転記してこちらの記述を削除しました。)