「html sql」で図書館hpにアクセスしてみよう
DESCRIPTION
TRANSCRIPT
「htmlSQL」で図書館HPにアクセスしてみよう
LOCAL PHP部(株)インフィニットループ
ke-tai.org松井 健太郎
ご注意
• タイトルからご推測いただけると思いますが、本発表はネタ要素が強いです
• この発表はフィクションです。実在の事件、団体とは関係あるようで、あまり関係ありません
• ネタにマジレスかっこ悪い!!
自己紹介
• LOCAL PHP部 部長(引退間近)
• (株)インフィニットループ代表
• ソーシャルゲームとかを作ってます
• ke-tai.org管理人
今日の内容
• スクレイピングとは
• htmlSQLとは
• インストール&セットアップ
• サンプルプログラムの解説
• スクレイピングを行う際の注意点
• 実践
• まとめ
岡崎市立中央図書館事件
• 岡崎市立中央図書館のウェブサイトにアクセスを繰り返して、ほかの利用者が閲覧しにくい状態にしたとして、偽計業務妨害で容疑者が逮捕された。(後に不起訴)
• 1秒間に1回アクセスしたら落ちたという図書館側のサーバのスペランカーっぷりと、警察の冷酷な対応が注目され話題に。
• いまスクレイピングがアツい!!
スクレイピングとは
• 英語で「scrape」= 削ることscrape[ scrape[ scrape[ scrape[ skrskrskrskr ipipipip ]]]][[[[III[III[III[III[名名名名]]]](((([[[[副副副副]]]]))))////V[V[V[V[名名名名][][][][形形形形]]]]]]]]…をこするをこするをこするをこする,,,,こすってこすってこすってこすって((((…のののの状態状態状態状態にににに))))するするするする;;;;〈〈〈〈付着物付着物付着物付着物などをなどをなどをなどを〉(〉(〉(〉(…からからからから))))こすりこすりこすりこすり落落落落とすとすとすとす
• ウェブサイトのデータを取得し、必要な部分だけを抽出して利用すること
• 例えば、ページ内のリンクを全て抽出したい、ランキングサイトの上位5番目までのデータを取得したい、など
htmlSQLとは
• PHPで作られたスクレイピング用ライブラリ、Jonas John氏が開発
• HTMLの要素をSQLのように取り出すことができる
• このサイトで興味を持ったASTRODEO -真面目にエロサイトを作ってみた【プログラマ編】http://astrodeo.com/blog/archives/257
インストール&セットアップ
• インストールはすごく簡単
• htmlSQLhtmlSQLhtmlSQLhtmlSQLのののの公式公式公式公式サイトサイトサイトサイトからからからからzipzipzipzipでででで落落落落とすとすとすとすだけだけだけだけhttp://www.http://www.http://www.http://www.jonasjohnjonasjohnjonasjohnjonasjohn.de/lab/.de/lab/.de/lab/.de/lab/htmlsqlhtmlsqlhtmlsqlhtmlsql....htmhtmhtmhtm
• 二二二二つのつのつのつのファイルファイルファイルファイルををををincludeincludeincludeincludeすればすればすればすれば使使使使えるえるえるえるsnoopy.class.snoopy.class.snoopy.class.snoopy.class.phpphpphpphphtmlsqlhtmlsqlhtmlsqlhtmlsql.class..class..class..class.phpphpphpphp
サンプルinclude_once("snoopy.class.php");include_once("htmlsql.class.php");$wsql = new htmlsql();
// URLにににに接続接続接続接続if (!$wsql->connect('url', 'http://codedump.jonasjohn.de/')) {
print 'Error while connecting: ' . $wsql->error;exit;
}
// クエリクエリクエリクエリ実行実行実行実行if (!$wsql->query('SELECT * FROM *')) {
print "Query error: " . $wsql->error; exit;
}
// 結果表示結果表示結果表示結果表示foreach($wsql->fetch_array() as $row) {
var_dump($row);}
array0 =>array(‘属性’ => ‘値’
)
・ ・ ・
使い方の解説
SELECT * FROM * →→→→ 全全全全てのてのてのてのHTMLをををを取得取得取得取得
SELECT text FROM title →→→→ タイトルタグタイトルタグタイトルタグタイトルタグののののtextをををを取得取得取得取得
SELECT href,title FROM a →→→→ 全全全全てのてのてのてのAタグタグタグタグののののhrefととととtitleをををを取得取得取得取得
SELECT * FROM meta WHERE $name == “description” →→→→ metaタグタグタグタグででででname=“description”のものだけをのものだけをのものだけをのものだけを取得取得取得取得
SELECT href FROM a WHERE preg_match(“/^test¥//”, $href) →→→→ aタグタグタグタグででででhrefがががが「「「「test/」」」」からからからから始始始始まるものだけをまるものだけをまるものだけをまるものだけを取得取得取得取得
SELECT href,title FROM a WHERE $class == “list”
属性 タグ名 条件
PHPタグが使える※evalを使っているので注意
==であることに注意(イコール2つ)
注意点(1)
• いざアクセスを開始する前の注意点
• 逮捕されたら困るよね
/ ̄ ̄ ̄\ / _  ̄ ̄\ ヽ |☆| ) /──二二二二二二l ヽ二二二二二/ 丶 /__ | | ひ | │ ノ | | (;;;) | | (⌒)___(⌒) ヽ | ヽ / ̄  ̄\ \_____ノ \__/ / l __| / \ | ⌒ ⌒ | / ヽ____/ /\ │ ■■■■■ │ /| │__丿;;;\_/\_/\ ヽ | (⌒) | / ヽ/|ヽ;;;;;;;;;ノ/ \ 丶/丶 | ___T____ | | | | /;;;;;|/\─ 丶 ヽ l-- l /__ / | |/;;;;;;;/ >__ / | \___ ̄____/;;;;;;ヽ j | | |;;;;;;;/ /|--┌│ | │ / ヽ;;;;;| /⌒l;;;;;;;;;| | │ | |;;;;;/ /│ ││ | │ │ |;;;;;L___/ /;;;;;;;;;| ノ | │ |;;/ / |___|__| │ | / |;;;;;;;;;;;;;;;;;/ /;;;;;;;;;;;| | | |__|;;/ / | │ | |;;;;;;;;;;;;;;/ /;;;;;;;;;;;;;| ノ | \|/ | │ / /;;;;;;;;;/ /;;;;;;;;;;;;;;;;;;| / | / ̄丶 | (⌒(⌒ヾヾ/ /;;;;;;;;;;;;;;;;;;;;;;;;;| / ヽ______彡( ̄ ̄ヽ ̄| | ( ( |ヾ___/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;| /\ /;;;;[__];;;;;;;;;;;彡(二二 ││ / (_(_ノゞゞ|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;| ゝ\\/ ̄|  ̄ ̄巛(____ノ_/ 彡彡 |;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/| (Ο Ο)\_ノ 彡彡∠彡彡彡彡彡彡彡彡彡彡彡彡彡 |;;;;;;;;;;;;;;/ ̄ ̄ ̄ / ( Ο丿 |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ヽ;;;;;/ /  ̄ | │ | / /
注意点(2)
• アクセス頻度は低めにしよう
• 500や503エラーを見るようにしよう
• robots関連の設定を見てみようmeta, robots.txt
if (!preg_match('/^HTTP¥/1¥.1 200 OK/', $wsql->snoopy->response_code)) {
print 'Error status code: ' . $wsql->snoopy->response_code;
exit; // 処理処理処理処理をををを中止中止中止中止するするするする
}
SELECT content FROM meta WHERE $name == “robots“→→→→ 'content' => string 'INDEX,FOLLOW' (length=12)
foreach ($loop => $row) {・・・・・・・・
sleep(2);}
実践(1)
• さて、いざ図書館にアクセス
• 大きな問題に気づいた
• htmlSQLはPOSTできない
検索エンジンなどを見ていて、なんとなく検索結果はGETというイメージがあったが、実際はどれもPOSTだった
実践(2)
• んー・・・
• POSTが使えるように改造するのはそう大変じゃないみたいだが・・・
• 正直別に図書館HPにアクセスしたいわけじゃないし・・・
実践(3)
• 予定を変更して
• 男の子のロマン、エロ画像収集にサンプルプログラムを変更
• 「ふたば★ちゃんねる」から画像を収集するプログラムを作成してみた
• 画像URLを抽出しリスト化するプログラムを作る
• 画像自体のDLは、FlashGet的なツールや、$ wget –i [リスト]で行う。
実践(4)include_once("snoopy.class.php");
include_once("htmlsql.class.php");
$wsql = new htmlsql();
for ($p = 1; $p < 5; $p++) {
// ページページページページにににに接続接続接続接続
if (!$wsql->connect('url', sprintf(http://jun.2chan.net/b/ . '%d.htm', $p))) {
die('Error while connecting: ' . $wsql->error);
}
// ステータスコードステータスコードステータスコードステータスコードををををチェックチェックチェックチェック
if (!preg_match('/^HTTP¥/1¥.1 200 OK/', $wsql->snoopy->response_code)) {
die('Error status code: ' . $wsql->snoopy->response_code);
}
// SQLをををを実行実行実行実行
if (!$wsql->query('SELECT href FROM a WHERE preg_match("/thumb(.*)¥.(jpg|gif|png)/", $text)')) {
die("Query error: " . $wsql->error);
}
// 結果結果結果結果をををを出力出力出力出力
foreach($wsql->fetch_array() as $row) {
if (isset($row['href'])) {
echo $row['href'] . "¥n";
}
}
// スリープスリープスリープスリープ処理処理処理処理
sleep(2);
}
(*゚∀゚)すんごい楽(所要時間10分弱)
動作結果
(;´Д`)
まとめ
• 図書館にアクセスってなに?
• htmlSQLを使うと、スクレイピングをすごく楽に行うことができる
• POSTには対応していないので、検索結果などから切り出すなどの処理は苦手のようだ
• 十分なスリープをいれたり、ステータスコードをみるなど、相手サーバの事を思いやる心が重要
おまけ
• どうやらhtmlSQLは、SEOに使うと便利らしい
htmlSQLでモバイルSEOを簡単にシステムツール化して管理する | 携帯サイトをつくろう。http://www.plusmb.jp/2009/01/30/2378.html
> さらにやってることは、スクレイピングと同じなので、> 使い方によってはもっと色んなことができます。> SEOで言うと結構重要なアレなんかもこれを使えば簡単にできますね。> 具体的には書けないですが、色んな使い方を考えて使ってみて下さい。
会場の中で知っている人がいましたら、こっそり教えて下さい
おまけ(2) スタッフ募集のお知らせ
• 株式会社インフィニットループでは、一緒に楽しんでゲームを作ってくれるスタッフを募集しています
• PHPプログラマActionScriptプログラマサーバエンジニア
• 興味のある方は、直接声を掛けていただくか、HPからお問い合わせください