2008年4月26日土曜日

htmlSQLの基本的な使い方

WebスクレイピングのライブラリhtmlSQLの使い方メモ。


スクレイピングの準備

//Snoopyをinclude
include_once("../snoopy.class.php");
//htmlSQLをinclude
include_once("../htmlsql.class.php");

//インスタンス生成(Exampleで使われている"$wsql"という変数名は、昔はWebSQLという名前だった名残り)
$wsql = new htmlsql();


Webページからスクレイピング
if (!$wsql->connect('url', 'http://codedump.jonasjohn.de/')){
 print 'Error while connecting: ' . $wsql->error;
 exit;
}
from Example 1


ローカルにあるファイルからスクレイピング
if (!$wsql->connect('file', 'demo_data.htm')){
 print 'Error while connecting: ' . $wsql->error;
 exit;
}
from Example 2


文字列からスクレイピング
(文字列にconnectするというのも変だが。)
if (!$wsql->connect('string', $some_html)){
 print 'Error while connecting: ' . $wsql->error;
 exit;
}
from Example 6


Queryの実行例
if (!$wsql->query('SELECT * FROM a WHERE $class == "nav_item"')){
 print "Query error: " . $wsql->error;
 exit;
}

// show results:
foreach($wsql->fetch_array() as $row){
 print_r($row);
}
from Example 1
他にも下記のメソッドが使える
  • $wsql->fetch_objects(); //オブジェクトとして取り出す
  • $wsql->get_result_count(); //結果の件数を取得する



WHERE句のバリエーション
  • 要素の属性を指定
    • WHERE $class == "nav_item"
    • WHERE $id == "header"
    • WHERE preg_match("/^http:///", $href)
  • 要素のテキストを指定
    • WHERE preg_match("/^array_/i", $text)
  • 複数の条件(orもできる)
    • WHERE preg_match("/^/snippets/i", $href) and preg_match("/^array_/i", $text)
  • WHERE句無しでもOK
  • WHERE句の中身はeval()で実行して判定される。ユーザーの入力値をそのままWHERE句に入れないように注意。(Never trust user input!



取得データ
  • 取得した各要素について、下記のデータが配列に入っている
    • 各属性
    • タグ名(tagname)
    • テキスト(text)



ユーザーエージェントやリファラの変更方法
$wsql->set_user_agent('MyAgentName/0.9');
$wsql->set_referer('http://www.jonasjohn.de/custom/referer/');
from Example 12


その他
  • httpsのWebページへのアクセスはできない
  • htmlSQLの内部でpreg系の関数を使ってるが、preg系はマルチバイトに対応していない。状況によってはうまく動かないかも。その場合は文字コードをUTF-8にして、u修飾子を付ければ回避できそう。


0 件のコメント:

ブログ アーカイブ

tags