スクレイピングその後

27
スクレイピングその後 長谷川 智希 2014/07/28 PHP勉強会 #80

Upload: tomoki-hasegawa

Post on 27-Jun-2015

2.064 views

Category:

Software


0 download

DESCRIPTION

スクレイピングに関する発表 http://www.slideshare.net/hasegawatomoki/ss-37424274 の続編です。

TRANSCRIPT

Page 1: スクレイピングその後

スクレイピングその後

長谷川 智希

2014/07/28 PHP勉強会#80

Page 2: スクレイピングその後

自己紹介• 長谷川智希 • デジタルサーカス(株) 副団長CTO • 趣味: Web開発, iOSアプリ開発 • その他趣味: レンタルカート, 電子工作(mbed) …

@tomzoh TOMZOH

Page 3: スクレイピングその後

デジタルサーカス(株)

• Webサイト開発(PHP, CakePHP, Drupal) •スマホアプリ開発(iOS, Android) •自社サービス (http://appbuilder.jp)

Page 4: スクレイピングその後

前回までのあらすじ

http://www.slideshare.net/hasegawatomoki/ss-36223911前回資料: スクレイピングのススメ

Page 5: スクレイピングその後

前回までのあらすじ• 「スクレイピング」とは。

• HTMLScrapingライブラリとTidyを使った実例。

• オチ

Page 6: スクレイピングその後

スクレイピングとは

これを… こうする

array( (int) 0 => array( 'is-fba' => false, 'shipping' => (int) 257, 'price' => (int) 2001, 'condition' => '中', 'subcondition' => '可', 'seller' => array( 'name' => 'lambdas', 'merchant-id' => 'A3VELMD24S0ERO' ), ),

Page 7: スクレイピングその後

前回までのあらすじ• 「スクレイピング」とは。

• 手順紹介

• オチ

Page 8: スクレイピングその後

手順紹介1. HTMLを取得する … file_get_contents(), curl

2. HTMLを整形する … Tidy or not

3. HTMLをパースする … HTMLScraping

4. 情報を取り出す … SimpleXMLオブジェクト

Page 9: スクレイピングその後

前回までのあらすじ• 「スクレイピング」とは。

• HTMLScrapingライブラリとTidyを使った実例。

• オチ

Page 10: スクレイピングその後

オチ• 本日ご紹介したHTMLScraping、出展を示そうと数年ぶりに検索、開いてみたら…

Page 11: スクレイピングその後
Page 12: スクレイピングその後

WANTED

• 無くなっていました。orz

• 誰かSJISでも使えるパーサ知ってたら教えてください。

Page 13: スクレイピングその後

スクレイピングその後

Page 14: スクレイピングその後

スクレイピングその後• LT後のディスカッションや公開したスライドへの反応としていくつかライブラリ教えて頂いた。

• phpQuery

• Guzzle (Goutte)

• QueryPath

• WebDriver

Page 15: スクレイピングその後

phpQuery

Page 16: スクレイピングその後

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/

Page 17: スクレイピングその後

phpQuery こう使う

• composer.jsonを一生懸命書けばComposerでインストール可能。

• jQueryぽく要素を選択。かなりのjQueryぽさ。強烈。

• 「<meta charset="utf-8">宣言だけど実際はSJIS」「閉じタグ無しやタグ入れ子は当たり前」「IDが重複してる」というエグいHTMLに対して全体をUTF-8に変換してあげればパースできた。

• SJISはNGぽい。 • クセの強い書き方に慣れれば使い勝手良さそう。

!!

Page 18: スクレイピングその後

QueryPath

Page 19: スクレイピングその後

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/

Page 20: スクレイピングその後

QueryPath こう使うらしい

• インストールはComposerでらくちん。

• jQueryぽく要素を選択。

• 前出のエグいHTMLはライブラリ内部でエラーが出てパースできなかった。

• マンチェスターユナイテッド(日本)の試合日程ページ(*1)もパース出来ず…。

• <html><head><title>foo</title></head><body></body></html>みたいなのはパースできる。(foo → タイトル でもパースできるけど化ける)

• 今回はあきらめた。

http://www.manutd.jp/FixturesAndResults/UnitedFixturesandResults.aspx*1

Page 21: スクレイピングその後

Guzzle (Goutte)

Page 22: スクレイピングその後

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

Page 23: スクレイピングその後

Goutte こう使う

• インストールはComposerでらくちん。

• XPathまたはCSSセレクタでノードを選択可能。どちらも使えるのがポイント高。

• eachに無名関数を渡すナウい感じ。

• 前出のエグいHTMLでも前処理無しにそのままパースできた。 • 使い勝手良さそう。これを使い込んでみようと思った。

Page 24: スクレイピングその後

WebDriver

Page 25: スクレイピングその後

WebDriver

• 「PHP bindings for Selenium WebDriver 」

• 画面表示の無いブラウザでWebページを表示し、要素を選択しようというアプローチ。

• ちゃちゃっと入れてちゃっと動かすつもりでいたら結構大事だったので今回はあきらめた。

https://code.google.com/p/php-webdriver-bindings/

(php-webdriver-bindings)

Page 26: スクレイピングその後

まとめ• スクレイピングライブラリ、いろいろある。 • 対象によって使い分けると良いと思う。 • 個人的にはGoutteイチオシ。

• Composerでかんたんインストール

• HTMLへの強度の高さ

• CSSセレクタ & XPathセレクタの両方が使える。

• 情報くださった皆様ありがとうございます!

Page 27: スクレイピングその後

KeyNote テンプレート: 「大体いい感じになるKeynoteテンプレート「Azusa」作った」http://memo.sanographix.net/post/82160791768

ありがとうございました

PHPerパワーが不足中! 求職中の方、フリーの方お声かけ待ってます!

iOSネイティブアプリ作成Webサービス http://appbuilder.jp

@tomzoh