新しい記事を書きました。以下も併せてご覧くださいませ。
自分のサイトをセルフ スクレイピングするときにハマったことがあったのでメモしておきます。直感に従い、PHP の Goutte(グット)というライブラリを使わせていただきました。
Goutte の基本的な説明や使い方は以下のページが詳しいのでご参照ください。
- WebスクレイピングライブラリGoutteで遊んでみる – hnwの日記
- Webスクレイピングを行う(Goutte)[PHP] – Build Insider
- FriendsOfPHP/Goutte ・ GitHub
どちらも良い記事です。が、ユーザー エージェント(UA)の設定ができませんでした。筆者が何かをミスったのかも知れない。Goutte が更新されたのかも知れない。とにかく書いてある方法ではダメでした。
Goutte でユーザー エージェントを設定する
require_once 'goutte.phar'; use Goutte\Client; $client = new Client(); // UserAgent Setting $client->setHeader('User-Agent', 'Googlebot-Video/1.0');
このように書いたら OK でした。
結局、海外のサイトを見て解決しました。正しい日本語情報は見つけられませんでした。検索すると上位に表示される Qiita の書き方もダメです。Google 先生も常に正しいとは限らない。先生は道を指し示すだけ。答えは教えてくれない。
Goutte で video タグの src 属性と poster 属性を取得する
$post = $client->request('GET', 'http://example.com/hoge.html'); $videos = $post->filter('video')->each(function( $node ){ return array( 'thumbnail_loc' => $node->attr('poster'), 'content_loc' => $node->attr('src') ); }); $vtitle = $post->filter('.video-title')->each(function( $node ){ return array( 'title' => $node->text() ); });
10行目以降は、「video-title」クラスを持つ要素のテキスト ノードを取得しています。CSS セレクタ風に書けます。
Goutte で XML をパースする
「Goutte は XML/HTML パーサー」と いたるところに書いてあるので、XML も普通にパースできるかと思ったのですがダメでした。XML をパースするなら、前回の記事に書いた simplexml_load_file() 関数を使いましょう。
ダメだったコードも晒しておきます。なぜダメなのか分からない。
意図した通りにならない PHP コード
$sitemap = $client->request('GET', 'http://designhack.slashlab.net/post-sitemap.xml'); $urls = array(); $urls = $sitemap->filter('loc')->each(function( $node ){ return $node->text(); });
結果は空っぽ。$urls は空です。そもそも filter(‘loc’) で loc タグを拾えてないみたい。Goutte で XML をパースするときは何か約束があるのかも知れない。探したけど見つかりませんでした。
Goutte 以外でスクレイピング(PHP)
筆者は Goutte に不満はありません。でも他の選択肢があったって いいじゃない。
phpQuery
- スクレイピング/DOM操作をjQuery風に行う(phpQuery) – Build Insider
- phpquery – phpQuery – jQuery port to PHP – Google Project Hosting
jQuery が好きな筆者には垂涎。のはずですが、残念ながら 2009年の 5月以降、更新がありません。更新がないからといって使えないわけじゃない。
PHP Simple HTML DOM Parser
Goutte と双璧を成す二大巨頭の一角。情報が多いという点では使いやすいかも知れません。
自分で確かめたわけじゃないけど、こういう情報を出されると弱い。決して鵜呑みにしたわけじゃないよ、でも今回は Goutte さんにしようかな。誰に言い訳してるのか分からない。
あとがき
今回、記事を書くにあたってスクレイピングについて色々調べたのですが、思った以上にドロドロした世界でした。スクレイピングが悪いわけじゃない、その結果を さも自分の手柄のように公開しちゃダメだろwww って情弱の筆者は考えていました。でもスクレイピング自体が違法だった時代もあったのですね。
2009年の記事です。件の法改正は 2010年(平成 22年)施行です。
正直、まったく意味不明で理解できませんが…… スクレイピングが複製に当たるなら、ブラウザで表示しただけでも複製なんじゃ ないですかね。やってることは一緒だ。でも意味不明で理解できないことも、法律なら仕方ない。法律は守ろう。コンプライアンスて素敵やん。
Pingback: [PHP]Goutte を使い倒すためのメモ | Design Hack and Slash