<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta name="keywords" content="php,tidy,スクレイピング,API,Webサービス" />
- <meta name="description" content="phpによるスクレイピング処理入門" />
- <title>phpによるスクレイピング処理入門:はてなブックマークの情報を取得</title>
- <link href="style.css" rel="stylesheet" type="text/css">
- </head>
- <?php
- define(INIT_URL , "http://b.hatena.ne.jp/");
- // proxyを利用する場合は 1 / 利用しない場合は0
- $use_proxy = 0;
- $proxy_host = 'proxy.example.com';
- $proxy_port = 8080;
- $no_proxy = array(
- 'localhost', // localhost
- '127.0.0.0/8', // loopback
- );
- include('proxy.php');
- function get_html($url){
- $rdata = http_request($url);
- $data = mb_convert_encoding($rdata['data'],"utf-8","auto");
- return ($data);
- }
- function dump_nodes_title(tidyNode $node, &$urls = NULL) {
- $urls = (is_array($urls)) ? $urls : array();
- if(isset($node->id)) {
- // ここからが実際のスクレイピング処理と思ってよいでしょう。
- // $node->id が Aタグだったら
- if($node->id == TIDY_TAG_A) {
- // $node->id に class属性がセットされていれば
- if (isset($node->attribute['class'])){
- // $node->id の class属性値がbookmarkだったら
- if (stristr ($node->attribute['class'] ,"bookmark") !==FALSE){
- // <a href="http://ryouchi.seesaa.net/">りょーち</a>
- // の場合、「りょーち」の文字を取得するには、
- // $node->child[0]->value
- // http://ryouchi.seesaa.net/ の文字を取得するには、
- // $node->attribute['href']
- // $urls にtitle,linkの連想配列として、タイトルとリンクを格納
- $urls[] = array("title" => $node->child[0]->value ,"link" =>$node->attribute['href']);
- }
- }
- }
- // ここまでが実際のスクレイピング処理と思ってよいでしょう。
- }
- // 更に子供のノードが存在すれば、再帰的にdump_nodes_title()を繰り返す
- if($node->hasChildren()) {
- foreach($node->child as $c) {
- dump_nodes_title($c, $urls);
- }
- }
- // 連想配列をリターン
- return $urls;
- }
- echo '<a href="'.INIT_URL.'">'.INIT_URL.'</a><br />';
- // INIT_URLで指定されたHTMLファイルを取得して$dataに格納
- $data = get_html(INIT_URL);
- // Tidy関数で整形する際のおまじない。
- $config = array('indent' => TRUE,
- 'output-xhtml' => TRUE,
- 'wrap' => 200);
- // 取得したHTMLファイルの内容をUTF-8の文字コードで$configで
- // 指定した設定で、tidyオブジェクトを作成
- $tidy = tidy_parse_string($data, $config, 'UTF8');
- // cleanRepairで整形
- $tidy->cleanRepair();
- // 作成したtidyオブジェクトのbody要素の内容をdump_nodes_title()に渡す
- // $urlsにはtitle,linkのペアの配列が格納されている。
- $urls = dump_nodes_title($tidy->body());
- echo '<div align="left"><ul>';
- // 取得されたurlsをforeachで回す
- foreach ($urls as $item){
- // $item['link'] / $item['title'] を出力
- echo '<li><a href="'.$item['link'].'" target="_blank">'.$item['title'].'</a>';
- }
- echo '</ul></div>';
- ?>
- </body>
- </html>
-