スクレイピングライブラリPHP と Goutte3系のメモ書き

Guzzle6を使ったスクレイピング その2Guzzle6

この記事は 約5 分で読めます。

最近Webクローラーにハマってます。
今やってるアフィリエイトの事で色々とスクレイピングなどをごにょごにょしてるからであります。

最近ローカルホストXAMPPも最近版に変えてPHPもVer7.0.3に変更したので最新ライブラリを使い放題です。
でも、新しいコードになれないので覚える事ばかりで拾得コストが大きいです(涙

さて本題、Goutteの事を調べてる文献が全然ない。あってもVer違いな事が多くて多くて困ったしてます。
そして、Goutteの事を調べてると必ずと言って良い程Guzzleの事が出てきます。

まずはこの2つの関係性を明らかにしない事にはすっきりしません。

スポンサーリンク

Guzzleとは

Guzzleって言うのは要するにHTTPクライアントなんです。
しかも、めちゃくちゃ使いやすいHTTPクライアントです。
例えばセッションを保持したままクロールしたいとか、どこかの管理パネルにログインしてログインした先の情報を取得したい時などに使えます。

Goutteとは

そしてGoutteとはスクレイピングライブラリ?なんです。
GuzzleでWebを巡回してGoutteで拾ってくると言った使い方が基本のようです。知らんケドwww

Goutteはパラレル接続で高速にWeb上の情報を取得出来て高速なんですがパラレル接続を使わないなら基本的にGuzzleだけで十分らしい。知らんケド

なので、なんでGoutteだけ使いたいのにGuzzleの情報が出てくんだよ!って思うのは違うんですね。
Guzzleの機能も使用してGoutteが動いてると思えば納得納得なんです。

コード的にも簡単ですCSSライクな手法でスクレイピングが出来てしまいます。

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'http://yahoo.co.jp/');
$crawler->filter('a')->each(function ($node) {
 echo $node->text(); // プレーンテキストを取得
 echo $node->attr('href'); // attr->('attribute') で属性取得出来る
});

こんな感じでYahooのリンクテキストだけを取得する事が出来ます。

// eachを使わない場合
$client = new Client();
$crawler = $client->request('GET', 'http://yahoo.co.jp/');
$anchor = $crawler->filter('a');
foreach ($anchor as $key => $value) {
	echo $value->text();
}

で行けちゃうみたいですね。

ログインした先の情報が欲しい場合

// ログイン先の情報を取得
$client = new Client();
$crawler = $client->request('GET', 'https://yahoo.co.jp');
$login  = $crawler->filter('form')->form();
$login['email']    = 'test@test.com';
$login['password'] = 'Password';
$client->submit($login);

非常に簡単でシンプルだね。

404 NOT FOUND – フィリピン移住ブログ でびきんの冒険
英語も話せない私がフィリピンに移住してみた記録

参考記事:PHP と Goutte ではじめる超絶簡単クローラー入門 ログイン編

 PHP と Goutte ではじめる超絶簡単クローラー入門

2017年6月30日追記———————————————————
いざ自分のこの記事をメモ代わりに読んで使おうと思うと思うように使えなかったので追記

Guzzleのセットは出来るんだけど、スクレイピングする時にDOMの拾い方につまずいたのでメモ

http://docs.symfony.gr.jp/symfony2/components/dom_crawler.html
基本的にここでDOMの使い方を理解した。

選択済みのノードのうち最初と最後のノードを選択
$crawler->filter('body > p')->first();
$crawler->filter('body > p')->last();
N番目の要素を取得
$crawler->filter('body > p')->eq(0);
子要素 親要素の取得
$crawler->filter('body')->children();
$crawler->filter('body > p')->parents();
トップへ戻る