真面目にエロサイトを作ってみた」というエントリで紹介されていた、スクレイピングに使われている htmlSQL に興味を持ったので試しに使ってみた。

jonasjohn.de: htmlSQL – a PHP class to query the web by an SQL like language

準備

上記サイトよりダウンロードして解凍した中に入っている “snoopy.class.php” と “htmlsql.class.php” という2つのファイルを使用する PHP からインクルードできるところに入れます。

使い方

実際に Yahoo! のトップページからヤフーニュースのトピックスのニュースタイトルを取ってくるコードを書いてみました。
コードを見てもらえば分かるようにまさに SQL を発行している感じです。

include_once("snoopy.class.php");
include_once("htmlsql.class.php");

$wsql = new htmlsql();

// Yahoo はブラウザに UA によって HTML が変わるので UA を偽装
$wsql->set_user_agent('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)');

// URL で接続
if (!$wsql->connect('url', 'http://www.yahoo.co.jp/')){
    print 'Error while connecting: ' . $wsql->error;
    exit;
}

// SELECT する範囲を指定して、その範囲の a タグのテキスト取得する
$wsql->isolate_content('
    ', '
'); if (!$wsql->query('SELECT text FROM a')){ print "Query error: " . $wsql->error; exit; } // 結果表示 foreach($wsql->fetch_array() as $row){ print_r($row); }

ダウンロードした中にサンプルコードも載っていますので、サンプルを眺めればやりたい事はだいたいできるかと思います。
以下のようなことができます。

全ての h1 タグの内容を取得
SELECT * FROM h1

全ての a タグの内容を取得
SELECT * FROM a

全ての a タグの href とテキストを取得
SELECT href as url, text FROM a

http:// から始まるリンクの a タグの内容を取得
SELECT * FROM a WHERE preg_match(“/^http:?/?//”, $href)

id = ‘header’ のタグの内容を取得
SELECT * FROM * WHERE $id == “header”

“/” から始まるリンクの a タグの内容を取得
SELECT * FROM a WHERE substr($href,0,1) != “/”

class=”nav_item” のタグの内容を取得
SELECT * FROM * WHERE $class == “nav_item”

AND OR などで条件を指定することも可能
SELECT * FROM a WHERE ($href == “foo.htm” and $title == “foo”) or ($title == “bar”)

関連する投稿