PHPでWebスクレイピングをやってみた

前から興味があったけどやったことがなかったPHPでのWebスクレイピング。調べてみると、『PHP Simple HTML DOM Parser』というのがいいらしい(参考:PHP Simple HTML DOM Parserの使用方法 – Webスクレイピング ライブラリ)。
PHP Simple HTML DOM Parser – Browse Files at SourceForge.net

というわけで使ってみることに。まずは上記ページからsimple_html_dom.phpをダウンロードして作成するPHPと同じフォルダに置く。今回のウェブスクレイピングの対象ページははてなブックマークのタグ検索ページ。はてブのタグ検索結果ページのそれぞれのエントリーはsearch-resultというクラスのliタグ内に記述しているようなので、search-resultクラスの要素を取得してforeachでループしたらよさそう。

やってみたら思った以上に簡単にできたので、ちょっといろいろ機能つけくわえてみた。以下、body部分のみ抜粋。

<body>
<?php
// タグの指定
$tag = "";
if( isset($_GET["tag"]) ){
	$tag = $_GET["tag"];
}
// 除外URLの指定
$cut_url = "";
if( isset($_GET["cut"]) ){
	$cut_url = $_GET["cut"];
}
// 指定ユーザー数
$users = 3;
if( isset($_GET["users"]) && is_numeric($_GET["users"])){
	$users = $_GET["users"];
}
?>
<form>
<label>タグ名:<input type="text" name="tag" value="<?php echo $tag; ?>"></label><br>
<label>除外URL:<input type="text" name="cut" value="<?php echo $cut_url; ?>"></label><br>
ブックマーク数:
<select name="users" data-value="<?php echo $users; ?>">
<option value="1">1 user</option>
<option value="3">3 users</option>
<option value="5">5 users</option>
<option value="10">10 users</option>
<option value="50">50 users</option>
<option value="100">100 users</option>
<option value="300">300 users</option>
<option value="500">500 users</option>
</select>
<input type="submit">
</form>
<ul id="hatebu_list">
<?php
require_once 'simple_html_dom.php';

$page_cnt = 0;
$page_step = 40;
$page_last = 160;

if($tag != ""){
	for($page_cnt=0; $page_cnt<=$page_last; $page_cnt+=$page_step){
		$hatebu = file_get_html( 'http://b.hatena.ne.jp/search/tag?safe=off&q=' . urlencode($tag) . '&users=' . $users .  '&of=' .$page_cnt );
	?>
	<?php foreach ($hatebu->find( '.search-result' ) as $e) :?>
	<?php
		$url = $e->find('h3 a', 0)->href;
		if( ($cut_url != "") && (strpos($url, $cut_url) !== false) ){
			continue;
		}
	?>
		<li>
			<a href="<?php echo $url; ?>" target="_blank"><?php echo $e->find('h3 a', 0)->title; ?></a>
			<a href="http://b.hatena.ne.jp<?php echo $e->find('.users a', 0)->href; ?>" target="_blank" class="users"><?php echo $e->find('.users a', 0)->plaintext; ?></a>
		</li>
	<?php endforeach; ?>

	<?php
		$entry_count = count( $hatebu->find( '.search-result' ) );
		$hatebu->clear();
		
		// エントリー数が少なければ抜ける
		if($entry_count < $page_step){
			break;
		}
	}
}
?>
</ul>
<script>
var users = document.getElementsByName('users')[0];
users.value = users.getAttribute('data-value');
</script>
</body>

サンプルページ:スクレイピングテスト

内容としては、タグと除外URLを入力してブックマーク数を指定して送信ボタンを押すとはてなブックマークのタグ検索の結果(最高200件まで)を出力するというもの。除外URLを入力すると、表示させないエントリーを指定できる。

例えば、タグに『ニコニコ動画』、除外URLに『http://www.nicovideo.jp/』と入れると、結果はURLに『http://www.nicovideo.jp/』がURLに入ってないエントリーだけが表示される(前方一致ではなく、URLのどこかに含まれていたら除外する)。

ニコニコ動画&cut=http%3A%2F%2Fwww.nicovideo.jp%2F&users=3

とりあえず、5ページぐらいなら怒られないだろうと思って最初5ページのみを見るようにした。他に影響がでるもんでもないと思うので、XSSとか考えずにコーディングしてます(それ以前にもっとキレイなコードを書くようにしろと怒られそうですが・・・)。

本当、思った以上に簡単にできたので時間があれば何かウェブサービスっぽいものを作ってみたい。

コメント

タイトルとURLをコピーしました