Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

スクレイピングのススメ

4,321 views

Published on

スクレイピングの基本的な考え方、PHPで実装する場合の実装例、注意点など。

後日談は以下。
http://www.slideshare.net/hasegawatomoki/ss-37424274

Published in: Technology
  • Be the first to comment

スクレイピングのススメ

  1. 1. スクレイピングのススメ 長谷川 智希
  2. 2. 自己紹介 • 長谷川智希 • デジタルサーカス株式会社 副団長CTO • iOSアプリ/Web開発 • その他趣味: カート, 電子工作… @tomzoh facebook.com/ hasegawa.tomoki
  3. 3. デジタルサーカス(株) • Webサイト開発(PHP, CakePHP, Drupal) • スマホアプリ開発(iOS / Android) 団員募集中 ­ WE WANT YOU!
  4. 4. 今日のテーマ • スクレイピング (scraping) • HTMLからデータを抜き出す • 検索エンジン、OGP (Open Graph Protocol)、 Twitter Cards、まとめサイト …
  5. 5. scrape 【自動】 1. 〔固い物に〕こする、すれる 2. 〔こすって〕キーキーと音を立てる 3. 〔人が〕節約して暮らす 4. 辛うじてやり通す[成し遂げる] 【他動】 1. 〔∼の表面を〕ゴシゴシこする◆∼をきれいにするために行うもの。 2. 〔表面の〕∼をこすり落とす[取る]◆固い物をゴシゴシとこすり 付けて。 3. 〔固い物にこすって〕∼を擦りむく[傷つける] 4. 〔固い物に〕∼をこすり付ける[こすってキーキーと音を立てる] 5. 〔苦労して〕∼をかき集める[かき寄せる] 6. 《コ》〔データなどを〕取得[収集]する◆特に別のプログラムの 出力から、本来とは異なる用途・形式などでデータを抽出すること。 出展: SPACE ALC http://www.alc.co.jp
  6. 6. 利用例 これを… こうする array( (int) 0 => array( 'is-fba' => false, 'shipping' => (int) 257, 'price' => (int) 2001, 'condition' => '中', 'subcondition' => '可', 'seller' => array( 'name' => 'lambdas', 'merchant-id' => 'A3VELMD24S0ERO' ), ),
  7. 7. HTML
  8. 8. スクレイピングの基本方針 • 文字列として処理する • HTML文字列から正規表現で文字列としてデータ を取り出す 文字列処理 XML処理 • XMLとして処理する • HTML文字列をXMLとしてパースしてDOMツ リーとしてデータを取り出す
  9. 9. どちらの方針がベスト? 文字列処理 • ちょっとした情報を取得するならお手軽。 • 文字列処理だけで完了。PHPの得意領域。 • 複雑な構造の情報を取得するならXMLが便利。 • 文字列処理ではしんどいHTML(idやclassが付い ていないとか…。)でも取得可能。 XML処理 どちらがベストかはケースバイケース
  10. 10. 基本方針 • 文字列として処理する • HTML文字列から正規表現で文字列としてデータ を取り出す 文字列処理 XML処理 • XMLとして処理する • HTML文字列をXMLとしてパースしてDOMツ リーとしてデータを取り出す 今日はこっちのお話
  11. 11. 実装例
  12. 12. 手順 1. HTMLを取得する 2. HTMLを整形する 3. HTMLをパースする 4. 情報を取り出す
  13. 13. 1. HTMLを取得する • 文字列としてHTMLを取得する。 • file_get_contents(‘http://…'); で良い。 • CookieやUserAgent設定をしたい場合は curl を使おう。
  14. 14. 1. HTMLを取得する // HTMLを取得 $contents = file_get_contents('http://www.amazon.co.jp/gp/ offer-listing/4873111870');
  15. 15. 2. HTMLを整形する • 世の中のHTMLは意外と正しくない。 • 閉じタグが無い、タグが入れ子になっている、XML特 殊文字のエスケープがされていない… • そのままXMLとしてパースすることができない • Tidy(タイディ)で整形する。 • PHPでは標準サポート。
  16. 16. 2.HTMLを整形する // Tidy Option $config = array(); // Tidyオブジェクト作成 $tidy = tidy_parse_string($contents, $config, 'shiftjis'); // 整形実行 $tidy->cleanRepair(); // 整形済HTMLを取得 $contents = (string)$tidy;
  17. 17. 3. HTMLをパースする • HTMLをXMLとしてパースする。 • 方法はいろいろ。 • PHP標準 … simplexml_load_file() • HTMLScraping … 文字コードの指定が出来たりして便利。 • Diggin_Scraper などなどその他たくさんの選択肢 • 余談: TidyオブジェクトのままでもNodeを走査すればデータの取 得は可能。 今日はこれ。
  18. 18. 3.HTMLをパースする // スクレイピングオブジェクト初期化 $s = new HTMLScraping('/tmp'); // XMLパースする $data = array( 'body' => $contents, 'headers' => array('content-type' => 'text/html; charset=Shift_JIS',), 'code' => 200, ); try { $xml = $s->getXmlObjectFromContents($data); } catch (Exception $e){ // エラー処理 }
  19. 19. 4. 情報を取り出す • simplexml_load_file()やHTMLScrapingはPHP のSimpleXMLオブジェクトを返す。 • SimpleXMLのメソッドを使って情報を取り出 す。 • xpathが便利。
  20. 20. 4.情報を取り出す // Xpathを使って配列を取得 $items = $xml->xpath('//div[@class="a-row a-spacing-mini olpOffer"]'); // 配列をループして処理する $items = array(); foreach ($items as $item){ $price_xml = $item->xpath('//span[contains(@class, olpOfferPrice")]'); $price = intval(str_replace(',', '', $price_xml[0])); $condition_xml = $item->xpath('//h3[contains(@class, "olpCondition")]'); $condition = trim((string)$condition_xml[0]); : $items[] = array( price => $price, condition => $condition, …); }
  21. 21. まとめ • スクレイピング、難しくはない。 • トライ & エラー的なところはある。 • Webシステムが出来ることがすごく広がる。 • 技術的選択肢として持っておいても良い。 • ただしHTML変更に弱いので選択は慎重に。
  22. 22. 注意点 • 必ずしもTidyをかけるのが良いとは限らない • HTMLに対して前処理するのも良い • <head>∼</head>内をあらかじめ削除してからTidy / パースするとか… • 対象のサイトの利用規約に注意。 • 対象のサイトに負荷をかけない様に。参考: 岡崎図書館事件
  23. 23. ところで … • 本日ご紹介したHTMLScraping、出展を示そう と数年ぶりに検索、開いてみたら…
  24. 24. WANTED • 無くなっていました。orz • 誰かSJISでも使えるパーサ知ってたら教えてく ださい。
  25. 25. KeyNote テンプレート: 「大体いい感じになるKeynoteテンプレート「Azusa」作った」http://memo.sanographix.net/post/82160791768 ありがとうございました @tomzoh facebook.com/hasegawa.tomoki

×