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.

クローラを作る技術と設計 (毎週のハンズオン勉強会資料)

シス創勉強会資料

  • Be the first to comment

クローラを作る技術と設計 (毎週のハンズオン勉強会資料)

  1. 1. クローラを作る技術と設計<br />PHP でやるお(^ω^)<br />
  2. 2. 目次<br />スクレイピングの技術<br />XPath<br />正規表現<br />サーバーの設計<br />
  3. 3. XPath<br />XML や HTML の任意の位置を取得するための式<br />XPathエンジンがあれば、 XPathを指定して HTML 上の値を簡単に持ってこれる<br />
  4. 4. XPath<br /><?php<br />$url = 'http://www.nicovideo.jp/';<br />libxml_use_internal_errors(true);<br />$doc = new DOMDocument();<br />$doc->loadHTML(file_get_contents($url));<br />libxml_clear_errors();<br />$xpath = new DOMXPath($doc);<br />foreach ($xpath->query('//a') as $node) {<br /> echo $node->textContent . "n";<br />}<br />
  5. 5. XPath<br />練習<br />ニコニコ動画の動画再生数とコメント数をスクレイピングしてみよう<br />
  6. 6. 正規表現<br />任意の文字列に対して、指定したパターンにマッチしているかを試す<br />パーサーではないので、構造を持ったデータには弱い<br />構造を持たないフラットなデータに良い。<br />トークナイザ<br />バリデータ<br />オートマトンを描くと理解しやすい<br />
  7. 7. 正規表現<br />$reg = '/As?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+z/u';<br />if (!preg_match($reg, $str)) {<br /> throw new Exception('URL is invalid!');<br />}<br />1<br />s<br />-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#<br />s<br />1<br />1<br />A<br />://<br />z<br />http<br />2<br />2<br />2<br />← これは優先順位<br />X<br />
  8. 8. 正規表現<br />練習<br />Apache のログファイルから、 IP アドレス別アクセス数を出してみよう<br />
  9. 9. クローラの設計<br />リクエスト時にクロールする<br />定期的にクロールする<br />ジョブキューを使う<br />
  10. 10. リクエスト時にクロールする<br />2<br />インターネット<br />1<br />ウェブサーバ<br />3<br />
  11. 11. 定期的にクロールする<br />インターネット<br />データベースサーバ<br />ウェブサーバ<br />クローラサーバ<br />
  12. 12. ジョブキューを使う<br />インターネット<br />データベースサーバ<br />データ<br />ウェブサーバ<br />job<br />job<br />job<br />クローラサーバ<br />
  13. 13. プロセス管理<br />cron<br />daemon<br />
  14. 14. cron<br /><ul><li>定期的にプログラムを実行
  15. 15. とても簡単
  16. 16. コマンドラインで動くプログラムをそのまま使える</li></li></ul><li>cron<br />$ vim crontab.txt<br />12 4 * * * php /home/user/crawl_user_page.php<br />34 5 * * * php /home/user/crawl_top_page.php<br />$ crontab < crontab.txt<br />
  17. 17. daemon<br />バックグラウンドで起動するプログラム<br />親プロセスを持たない<br />起動方法、終了方法を準備する必要がある<br />daemon 用にプログラムを書かなければいけない<br />
  18. 18. daemon<br />require_once("System/Daemon.php");<br />System_Daemon::setOptions(array(<br /> 'appName' => 'crawler'<br />));<br />System_Daemon::start();<br />while (true) {<br /> …<br />System_Dameon::iterate(5);<br />}<br />System_Daemon::stop();<br />

×