スクレイピングその後
DESCRIPTION
スクレイピングに関する発表 http://www.slideshare.net/hasegawatomoki/ss-37424274 の続編です。TRANSCRIPT
スクレイピングその後
長谷川 智希
2014/07/28 PHP勉強会#80
自己紹介• 長谷川智希 • デジタルサーカス(株) 副団長CTO • 趣味: Web開発, iOSアプリ開発 • その他趣味: レンタルカート, 電子工作(mbed) …
@tomzoh TOMZOH
デジタルサーカス(株)
• Webサイト開発(PHP, CakePHP, Drupal) •スマホアプリ開発(iOS, Android) •自社サービス (http://appbuilder.jp)
前回までのあらすじ
http://www.slideshare.net/hasegawatomoki/ss-36223911前回資料: スクレイピングのススメ
前回までのあらすじ• 「スクレイピング」とは。
• HTMLScrapingライブラリとTidyを使った実例。
• オチ
スクレイピングとは
これを… こうする
array( (int) 0 => array( 'is-fba' => false, 'shipping' => (int) 257, 'price' => (int) 2001, 'condition' => '中', 'subcondition' => '可', 'seller' => array( 'name' => 'lambdas', 'merchant-id' => 'A3VELMD24S0ERO' ), ),
前回までのあらすじ• 「スクレイピング」とは。
• 手順紹介
• オチ
手順紹介1. HTMLを取得する … file_get_contents(), curl
2. HTMLを整形する … Tidy or not
3. HTMLをパースする … HTMLScraping
4. 情報を取り出す … SimpleXMLオブジェクト
前回までのあらすじ• 「スクレイピング」とは。
• HTMLScrapingライブラリとTidyを使った実例。
• オチ
オチ• 本日ご紹介したHTMLScraping、出展を示そうと数年ぶりに検索、開いてみたら…
WANTED
• 無くなっていました。orz
• 誰かSJISでも使えるパーサ知ってたら教えてください。
スクレイピングその後
スクレイピングその後• LT後のディスカッションや公開したスライドへの反応としていくつかライブラリ教えて頂いた。
• phpQuery
• Guzzle (Goutte)
• QueryPath
• WebDriver
phpQuery
phpQuery
• 「phpQuery is a server-side, chainable, CSS3
selector driven Document Object Model (DOM) API based on jQuery JavaScript Library.」
• DOM要素をjQuery風に選択するPHP用ライブラリ。
https://code.google.com/p/phpquery/
phpQuery こう使う
• composer.jsonを一生懸命書けばComposerでインストール可能。
• jQueryぽく要素を選択。かなりのjQueryぽさ。強烈。
• 「<meta charset="utf-8">宣言だけど実際はSJIS」「閉じタグ無しやタグ入れ子は当たり前」「IDが重複してる」というエグいHTMLに対して全体をUTF-8に変換してあげればパースできた。
• SJISはNGぽい。 • クセの強い書き方に慣れれば使い勝手良さそう。
!!
QueryPath
QueryPath
• 「QueryPath is a PHP library for manipulating
HTML and XML. Think of it as jQuery for the server.」
• HTMLやXMLをjQueryの様に扱うPHP用ライブラリ。
http://querypath.org/
QueryPath こう使うらしい
• インストールはComposerでらくちん。
• jQueryぽく要素を選択。
• 前出のエグいHTMLはライブラリ内部でエラーが出てパースできなかった。
• マンチェスターユナイテッド(日本)の試合日程ページ(*1)もパース出来ず…。
• <html><head><title>foo</title></head><body></body></html>みたいなのはパースできる。(foo → タイトル でもパースできるけど化ける)
• 今回はあきらめた。
http://www.manutd.jp/FixturesAndResults/UnitedFixturesandResults.aspx*1
Guzzle (Goutte)
Guzzle (Goutte)• 「Guzzle is a PHP HTTP client that makes it easy to
work with HTTP/1.1 and takes the pain out of consuming web services.」
• あれ?HTTPクライアントライブラリ?
• 関連してGoutteというのが見つかった。
• Symfony, Zend Framework のコンポネントを使ったラッパライブラリ。Guzzleも使ってる模様。
グ ー ト
https://github.com/fabpot/goutte
Goutte こう使う
• インストールはComposerでらくちん。
• XPathまたはCSSセレクタでノードを選択可能。どちらも使えるのがポイント高。
• eachに無名関数を渡すナウい感じ。
• 前出のエグいHTMLでも前処理無しにそのままパースできた。 • 使い勝手良さそう。これを使い込んでみようと思った。
WebDriver
WebDriver
• 「PHP bindings for Selenium WebDriver 」
• 画面表示の無いブラウザでWebページを表示し、要素を選択しようというアプローチ。
• ちゃちゃっと入れてちゃっと動かすつもりでいたら結構大事だったので今回はあきらめた。
https://code.google.com/p/php-webdriver-bindings/
(php-webdriver-bindings)
まとめ• スクレイピングライブラリ、いろいろある。 • 対象によって使い分けると良いと思う。 • 個人的にはGoutteイチオシ。
• Composerでかんたんインストール
• HTMLへの強度の高さ
• CSSセレクタ & XPathセレクタの両方が使える。
• 情報くださった皆様ありがとうございます!
KeyNote テンプレート: 「大体いい感じになるKeynoteテンプレート「Azusa」作った」http://memo.sanographix.net/post/82160791768
ありがとうございました
PHPerパワーが不足中! 求職中の方、フリーの方お声かけ待ってます!
iOSネイティブアプリ作成Webサービス http://appbuilder.jp
@tomzoh