• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
ウェブから情報をあつめる
 

ウェブから情報をあつめる

on

  • 3,294 views

NAVER まとめを題材に、ウェブから情報を集めるクローラ、スクレイパーの設計について

NAVER まとめを題材に、ウェブから情報を集めるクローラ、スクレイパーの設計について

Statistics

Views

Total Views
3,294
Views on SlideShare
3,166
Embed Views
128

Actions

Likes
6
Downloads
22
Comments
0

5 Embeds 128

http://kawakami.ut-gym.jp 77
http://ut-gym.jp 39
https://twitter.com 8
http://utgym.localhost 3
http://dev.ut-gym.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

ウェブから情報をあつめる ウェブから情報をあつめる Presentation Transcript

  • ウェブから情報をあつめる2012/12/11 1 UT Startup Gym
  • UT Startup Gym とは? アイデアをカタチにするプログラム プロジェクト 企画から実装まで スタートアップ2012/12/11 2 UT Startup Gym
  • スケジュール Keywords: • プログラミング入門 ソーシャルウェブアプリケーション, API, Oct, 12 bot, HTML5 • プラニング リーンスタートアップ, ビジネスプラニン Nov, 12 • プロジェクトスタート グ, HTML, CSS, PHP, javascript • 開発開始 Dec, 12 • 冬季開発合宿 チーム結成, 企画, ディスカッション git, フレームワーク, MySQL, Apache • ウェブデザイン Jan, 13 • 週間報告会 シナリオ, ペルソナ, ワイヤフレーム, サイトマップ, DB スキーム • jQuery, 中間発表 Feb, 13 ゲーミフィケーション, 仮説検証, データマ イニング, アクセシビリティ • 作業会 Mar, 13 レスポンシブデザイン, プレゼンテーショ • リリース会 ン Apr, 132012/12/11 3 UT Startup Gym
  • M D 講師(敬称略) タイトル 要素10 13 飯塚 かんたん Facebook アプリをつくる HTML, CSS, js 21 飯塚 かんたん Twitter アプリをつくる UNIX, vim, PHP 27 川上 かんたん アンケートフォームをつくる MySQL, MVC 11 4 AWS 高山様 サーバを立てよう AWS 10 飯塚・石村 スタートアップの心構え ビジネスプラン、リーンスタートアップ 17 飯塚・佐藤 プロダクトデザイン シナリオ、ペルソナ、ワイヤフレーム 24 お休み(飯塚@ジャカルタ)12 1 ゆーすけべー様 ウェブサービスの企画のコツ 企画プロセス、ウェブサービス運用 8 飯塚 ウェブから情報をあつめる クローラ, XPath, 正規表現 15 プロジェクトキックオフ アンカンファレンス 22 ハッカソン 1 12 石村 ユーザがハマるアプリデザイン ゲーミフィケーション 19 飯塚 かんたん・きれい・便利なウェブデザイン Twitter Bootstrap, Responsive Design, LESS 26 未定 Git 2 2 斎藤 アニメーションをつくる javascript, jQuery 9 ゲスト ゲストスピーカー 16 中間発表 3 作業会 4 13 プレゼンテーション 20 リリース会2012/12/11 4 UT Startup Gym
  • 目次• イントロダクション• ソースコードを取ってくる – PHP file_get_contents($url)• HTML を解析する – 正規表現 – XPath• 自動的で動かす – cron2012/12/11 5 UT Startup Gym
  • クローラってなに?• 自動的にウェブページにアクセスし、データを 収集するプログラム。ロボットとも言う。• これを走らせることを「クローリング」とい う。• スクレイピング=HTMLを解析して、必要な情 報を抜き出すこと。2012/12/11 6 UT Startup Gym
  • クローラとウェブアプリ• いきなり充実したコンテンツのサイトができる• 広告をつければ「サーバに稼いでもらう感覚」を 手っ取り早く味わうことができる2012/12/11 7 UT Startup Gym
  • Spysee2012/12/11 8 UT Startup Gym
  • Bijostagram2012/12/11 9 UT Startup Gym
  • ソースコードを取ってくる• とりあえず名言ページを題材に file_get_contents() の使い方に慣れる2012/12/11 10 UT Startup Gym
  • ソースコードを取ってくる1<?$url = "http://www.meigensyu.com/quotations/view/random";$html = file_get_contents($url);echo $html;2012/12/11 11 UT Startup Gym
  • ソースコードを取ってくる2<?$url = "http://www.meigensyu.com/quotations/view/random/";$html = file_get_contents($url);preg_match(/<div class="text">(.+)</div‟>/, $html, $match);var_dump($match);2012/12/11 12 UT Startup Gym
  • 正規表現• 任意の文字列に対して、指定したパターンに マッチしているかを試す• パーサーではないので、構造を持ったデータに は弱い• 構造を持たないフラットなデータに良い。 – トークナイザ – バリデータ2012/12/11 13 UT Startup Gym
  • 正規表現の例• ^d+$ → 1234 とか 39843452 にマッチ。12 324 とか ff0000 とかにはマッチしない。 – ^: 行頭 – d: 半角数字 – +: 1回以上の繰り返し – $: 行末• ^[A-Z]*(d+)$ → 13 とか ADB1132 にマッチ。し かも、13 とか 1132 が抜き出せる。 – *: 0回以上の繰り返し – (): 抜き出す2012/12/11 14 UT Startup Gym
  • HTML を解析する1• NAVER まとめの記事ページから、写真の URL だけを収集する• とりあえず単一ページで動作2012/12/11 15 UT Startup Gym
  • HTML を解析する1<?$url = "http://matome.naver.jp/odai/2133765614325689001";$res = file_get_contents($url);$dom = @DOMDocument::loadHTML($res);$xml = simplexml_import_dom($dom);$imgs = $xml->xpath("//img[@class=MTMItemThumb]");foreach ($imgs as $img) { echo $img["src"]."n"; //echo "<img src=".$img["src"].">n";}2012/12/11 16 UT Startup Gym
  • XPath• XML や HTML の任意の位置を取得するための式 – プログラミング言語に依らない• XPath エンジンがあれば、XPath を指定して HTML 上の値を簡単に持って来ることができる2012/12/11 17 UT Startup Gym
  • XPath の例• //img[@class=„MTMItemThumb‟] →class属性の値が„MTMItemThumb‟の img 要素 – // は /html/body の短縮形 – @ は属性のこと (@id=, @src=, @href= etc.)• 他にも、様々な表現方法がある2012/12/11 18 UT Startup Gym
  • ブラウザで表示する生成された HTML ファイルをブラウザで表示してみよう。//echo $img[“src”].“n”;echo “<img src=„”.$img[“src”].“‟>n”;$ php hoge.php > piyo.html2012/12/11 19 UT Startup Gym
  • HTML を解析する2• 食べログの検索結果から店名とURL、食べログ 得点を取得する。2012/12/11 20 UT Startup Gym
  • HTML を解析する2<?$url = 食べログ検索結果の URL;$res = file_get_contents($url);$dom = @DOMDocument::loadHTML($res);$xml = simplexml_import_dom($dom);$shops = $xml->xpath("//li[contains(@class,rank)]");foreach ($shops as $shop) { $name = $shop->div[0]->div[0]->div[0]->strong[0]->a; echo "Shop Name: $namen"; echo "URL: ".$name["href"]."n"; $rank = $shop->div[2]->div[0]->p[0]->em; echo "Rank: $ranknn";}2012/12/11 21 UT Startup Gym
  • HTML を解析する3• アルク 英辞郎• 英単語の難度、発音を知りたい• 普通にやると、詰まる – User Agent で制限をかけている※このコードが実行できない場合、PHP むけcURL をインストールすること。$ sudo apt-get install php5-curl2012/12/11 22 UT Startup Gym
  • HTML を解析する3(できない)<?if (isset($argv[1])) { $query = $argv[1]; $res = file_get_contents("http://eow.alc.co.jp/$query/UTF-8/"); // ブラウザでは見られるのに、ソースコードを取得できない $dom = @DOMDocument::loadHTML($res); $xml = simplexml_import_dom($dom); $properties = $xml->xpath(//span[@class="label" and .= "【@】" ]/following-sibling::text()[1]); if (!empty($properties)) { $prop_array = explode("、", $properties[0]); echo "[".$query."] レベル: ".$prop_array[0]." ヨミ: ".$prop_array[1]."n"; } else { echo "結果を取得できませんでした。正しい英単語を入力してください。n"; }}2012/12/11 23 UT Startup Gym
  • HTML を解析する3(できる)<?if (isset($argv[1])) { $query = $argv[1]; $doc = new DOMDocument(); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://eow.alc.co.jp/$query/UTF-8/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //標準出力でなく、文字列として取得 curl_setopt($ch, CURLOPT_USERAGENT, “Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001Firefox/0.10.1” ); //Firefox のふりをしてアクセス $res = curl_exec($ch); curl_close($ch); $dom = @DOMDocument::loadHTML($res); $xml = simplexml_import_dom($dom); $properties = $xml->xpath(//span[@class="label" and .= "【@】" ]/following-sibling::text()[1]); if (!empty($properties)) { $prop_array = explode("、", $properties[0]); echo "[".$query."] レベル: ".$prop_array[0]." ヨミ: ".$prop_array[1]."n"; } else { echo "結果を取得できませんでした。正しい英単語を入力してください。n"; }} else { echo "検索する英単語を入力してください。n";}2012/12/11 24 UT Startup Gym
  • HTML を解析する4• NAVER まとめふたたび• このままだと、1ページ目しか収集できない• 自動で次ページの収集もできないか?2012/12/11 25 UT Startup Gym
  • HTML を解析する4if (isset($argv[1])) { if (preg_match("/http://matome.naver.jp/odai/(d+)$/", $argv[1])) { $url = $argv[1]; $res = @file_get_contents($url); while ($res) { $data = getData($res); foreach ($data["image"] as $image) { echo "<img src=".$image["src"].">n"; } if (!$data["nextPage"]) { $res = null; } else { $res = @file_get_contents($url."?page=".$data["nextPage"]); } sleep(1); } }}つづく... 2012/12/11 26 UT Startup Gym
  • HTML を解析する4function getData ($html) { $dom = @DOMDocument::loadHTML($html); $xml = simplexml_import_dom($dom); $result["image"] = $xml->xpath("//img[@class=MTMItemThumb]"); $pager = $xml->xpath("//div[@class=MdPagination03]"); $result["nextPage"] = null; if (!empty($pager)) { $last_anchor = $pager[0]->a[count($pager[0]->a)-1]; $current_page = $pager[0]->strong; if ($last_anchor + 1 != $current_page) { $result["nextPage"] = $current_page + 1; } } return $result;} 2012/12/11 27 UT Startup Gym
  • cron• 定期的にプログラムを実行• とても簡単• コマンドラインで動くプログラムをその まま使える2012/12/11 28 UT Startup Gym
  • cron$ vim crontab.txt# フルパスで記述すること# 毎日 4 時 12 分に実行12 4 * * * php /home/user/crawl_user_page.php# 毎分実行* * * * * php /home/user/crawl_top_page.php >>/home/user/log.txt$ crontab < crontab.txt # ジョブの登録$ crontab –l # 登録されたジョブの確認$ crontab –e # ジョブの編集$ crontab –r # ジョブの全消去2012/12/11 29 UT Startup Gym
  • 自動でプログラムを動かす<?$article = getRSS();$res = @file_get_contents($article->link);while ($res) { $data = getData($res); foreach ($data["image"] as $image) { echo "<img src=".$image["src"].">n"; } if (!$data["nextPage"]) { $res = null; } else { $res = @file_get_contents($url."?page=".$data["nextPage"]); } sleep(1);} つづく...2012/12/11 30 UT Startup Gym
  • 自動でプログラムを動かすfunction getData ($html) { $dom = @DOMDocument::loadHTML($html); $xml = simplexml_import_dom($dom); $result["image"] = $xml->xpath("//img[@class=MTMItemThumb]"); $pager = $xml->xpath("//div[@class=MdPagination03]"); $result["nextPage"] = null; if (!empty($pager)) { $last_anchor = $pager[0]->a[count($pager[0]->a)-1]; $current_page = $pager[0]->strong; if ($last_anchor + 1 != $current_page) { $result["nextPage"] = $current_page + 1; } } return $result;} つづく... 2012/12/11 31 UT Startup Gym
  • 自動でプログラムを動かすfunction getRSS() { $xml = simplexml_load_file("http://matome.naver.jp/feed/topic/1Luvh"); $items = array(); foreach ($xml->channel->item as $item) { $items[] = $item; } shuffle($items); return $items[0];}2012/12/11 32 UT Startup Gym
  • ワーク• 何かできそうな気がして来ませんか?• 自分が面白そうと思うサイトから情報を集めて くる。• 複数サイトからの情報を組み合わせていると GOOD。(マッシュアップ)2012/12/11 33 UT Startup Gym