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

More Related Content

Viewers also liked

Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用
Lumin Hacker
 

Viewers also liked (8)

Frame mediainformation
Frame mediainformationFrame mediainformation
Frame mediainformation
 
調査報道を変えたデータジャーナリズムの衝撃 (2013年6月)
調査報道を変えたデータジャーナリズムの衝撃 (2013年6月)調査報道を変えたデータジャーナリズムの衝撃 (2013年6月)
調査報道を変えたデータジャーナリズムの衝撃 (2013年6月)
 
国内外のNPOメディアの主要事例を紹介ーー社会を変える情報発信のヒント
国内外のNPOメディアの主要事例を紹介ーー社会を変える情報発信のヒント国内外のNPOメディアの主要事例を紹介ーー社会を変える情報発信のヒント
国内外のNPOメディアの主要事例を紹介ーー社会を変える情報発信のヒント
 
ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)
ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)
ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)
 
第3回Webスクレイピング勉強会@東京 happyou.info
第3回Webスクレイピング勉強会@東京 happyou.info第3回Webスクレイピング勉強会@東京 happyou.info
第3回Webスクレイピング勉強会@東京 happyou.info
 
Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用
 
クローリングしにくいものに挑戦 公開用
クローリングしにくいものに挑戦 公開用クローリングしにくいものに挑戦 公開用
クローリングしにくいものに挑戦 公開用
 
PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門
 

Similar to スクレイピングのススメ

Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29
Yuki Higuchi
 
20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...
20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...
20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...
Shoei Takamaru
 

Similar to スクレイピングのススメ (20)

エンジニアがプロダクト育成を始めるまでにやったこと
エンジニアがプロダクト育成を始めるまでにやったことエンジニアがプロダクト育成を始めるまでにやったこと
エンジニアがプロダクト育成を始めるまでにやったこと
 
超絶UXを実現したい!小規模Web制作会社でもフロントエンドのスキルを磨く方法と実践 【根性論と精神論編】 先生:桟 義雄
超絶UXを実現したい!小規模Web制作会社でもフロントエンドのスキルを磨く方法と実践 【根性論と精神論編】 先生:桟 義雄超絶UXを実現したい!小規模Web制作会社でもフロントエンドのスキルを磨く方法と実践 【根性論と精神論編】 先生:桟 義雄
超絶UXを実現したい!小規模Web制作会社でもフロントエンドのスキルを磨く方法と実践 【根性論と精神論編】 先生:桟 義雄
 
勉強会のこちら側とあちら側
勉強会のこちら側とあちら側勉強会のこちら側とあちら側
勉強会のこちら側とあちら側
 
iPhone/Android アプリをまとめて省エネ開発する技術
iPhone/Android アプリをまとめて省エネ開発する技術iPhone/Android アプリをまとめて省エネ開発する技術
iPhone/Android アプリをまとめて省エネ開発する技術
 
ユーザーに愛されるソフトを作りたい!!
ユーザーに愛されるソフトを作りたい!!ユーザーに愛されるソフトを作りたい!!
ユーザーに愛されるソフトを作りたい!!
 
rails-developers-meetup-day4
rails-developers-meetup-day4rails-developers-meetup-day4
rails-developers-meetup-day4
 
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
IT業界とソフトウェア技術者を取り巻く今日の様相と荒波の将来への船出
 
Web勉強会(HTML+CSS+JS入門の入門)
Web勉強会(HTML+CSS+JS入門の入門)Web勉強会(HTML+CSS+JS入門の入門)
Web勉強会(HTML+CSS+JS入門の入門)
 
SwiftによるiOS開発再入門
SwiftによるiOS開発再入門SwiftによるiOS開発再入門
SwiftによるiOS開発再入門
 
Stargazer Meetup #1
Stargazer Meetup #1Stargazer Meetup #1
Stargazer Meetup #1
 
はじめてのiOSアプリ開発 Swift対応版
はじめてのiOSアプリ開発 Swift対応版はじめてのiOSアプリ開発 Swift対応版
はじめてのiOSアプリ開発 Swift対応版
 
趣味プログラマの先輩からのアドバイス
趣味プログラマの先輩からのアドバイス趣味プログラマの先輩からのアドバイス
趣味プログラマの先輩からのアドバイス
 
20230226ゆるあさ.pdf
20230226ゆるあさ.pdf20230226ゆるあさ.pdf
20230226ゆるあさ.pdf
 
Digital Business and Agile
Digital Business and AgileDigital Business and Agile
Digital Business and Agile
 
Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29
 
Drupal on bluemix20150902
Drupal on bluemix20150902Drupal on bluemix20150902
Drupal on bluemix20150902
 
Drupal on vagrant-aws
Drupal on vagrant-awsDrupal on vagrant-aws
Drupal on vagrant-aws
 
Drupal si 20160704
Drupal si 20160704Drupal si 20160704
Drupal si 20160704
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見る
 
20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...
20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...
20170622 Heroku Meetup #17 スタートアップのインフラ選び 高丸翔英 How to choose infrastracture...
 

More from Tomoki Hasegawa

More from Tomoki Hasegawa (20)

Reading php terminal-gameboy-emulator
Reading php terminal-gameboy-emulatorReading php terminal-gameboy-emulator
Reading php terminal-gameboy-emulator
 
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMSDrupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
 
とある受託ベンダの開発環境
とある受託ベンダの開発環境とある受託ベンダの開発環境
とある受託ベンダの開発環境
 
iOS Developers Conference Japan 2016
iOS Developers Conference Japan 2016iOS Developers Conference Japan 2016
iOS Developers Conference Japan 2016
 
エンジニアのお祭り
エンジニアのお祭りエンジニアのお祭り
エンジニアのお祭り
 
tvOSでWebSocketを使う
tvOSでWebSocketを使うtvOSでWebSocketを使う
tvOSでWebSocketを使う
 
「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side
 
tvOSネイティブアプリを作る
tvOSネイティブアプリを作るtvOSネイティブアプリを作る
tvOSネイティブアプリを作る
 
「これを買っている人はこれも買っています」実装してみた
「これを買っている人はこれも買っています」実装してみた「これを買っている人はこれも買っています」実装してみた
「これを買っている人はこれも買っています」実装してみた
 
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMSDrupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
 
TestFlightみたいなのを自作する
TestFlightみたいなのを自作するTestFlightみたいなのを自作する
TestFlightみたいなのを自作する
 
PHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するPHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知する
 
PUSH通知証明書作成ツールを作った
PUSH通知証明書作成ツールを作ったPUSH通知証明書作成ツールを作った
PUSH通知証明書作成ツールを作った
 
PHPカンファレンス福岡に 行ってきた
PHPカンファレンス福岡に 行ってきたPHPカンファレンス福岡に 行ってきた
PHPカンファレンス福岡に 行ってきた
 
CakePHP3ウォークスルー
CakePHP3ウォークスルーCakePHP3ウォークスルー
CakePHP3ウォークスルー
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
 
PHPerのためのSwift入門
PHPerのためのSwift入門PHPerのためのSwift入門
PHPerのためのSwift入門
 
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
 
Swiftのプロパティオブザーバを使い倒す
Swiftのプロパティオブザーバを使い倒すSwiftのプロパティオブザーバを使い倒す
Swiftのプロパティオブザーバを使い倒す
 
3 auto layout tips
3 auto layout tips3 auto layout tips
3 auto layout tips
 

Recently uploaded

Recently uploaded (10)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 

スクレイピングのススメ