20
「htmlSQL」で 図書館HPにアクセスしてみよう LOCAL PHP部 (株)インフィニットループ ke-tai.org 松井 健太郎

「Html sql」で図書館hpにアクセスしてみよう

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: 「Html sql」で図書館hpにアクセスしてみよう

「htmlSQL」で図書館HPにアクセスしてみよう

LOCAL PHP部(株)インフィニットループ

ke-tai.org松井 健太郎

Page 2: 「Html sql」で図書館hpにアクセスしてみよう

ご注意

• タイトルからご推測いただけると思いますが、本発表はネタ要素が強いです

• この発表はフィクションです。実在の事件、団体とは関係あるようで、あまり関係ありません

• ネタにマジレスかっこ悪い!!

Page 3: 「Html sql」で図書館hpにアクセスしてみよう

自己紹介

• LOCAL PHP部 部長(引退間近)

• (株)インフィニットループ代表

• ソーシャルゲームとかを作ってます

• ke-tai.org管理人

Page 4: 「Html sql」で図書館hpにアクセスしてみよう

今日の内容

• スクレイピングとは

• htmlSQLとは

• インストール&セットアップ

• サンプルプログラムの解説

• スクレイピングを行う際の注意点

• 実践

• まとめ

Page 5: 「Html sql」で図書館hpにアクセスしてみよう

岡崎市立中央図書館事件

• 岡崎市立中央図書館のウェブサイトにアクセスを繰り返して、ほかの利用者が閲覧しにくい状態にしたとして、偽計業務妨害で容疑者が逮捕された。(後に不起訴)

• 1秒間に1回アクセスしたら落ちたという図書館側のサーバのスペランカーっぷりと、警察の冷酷な対応が注目され話題に。

• いまスクレイピングがアツい!!

Page 6: 「Html sql」で図書館hpにアクセスしてみよう

スクレイピングとは

• 英語で「scrape」= 削ることscrape[ scrape[ scrape[ scrape[ skrskrskrskr ipipipip ]]]][[[[III[III[III[III[名名名名]]]](((([[[[副副副副]]]]))))////V[V[V[V[名名名名][][][][形形形形]]]]]]]]…をこするをこするをこするをこする,,,,こすってこすってこすってこすって((((…のののの状態状態状態状態にににに))))するするするする;;;;〈〈〈〈付着物付着物付着物付着物などをなどをなどをなどを〉(〉(〉(〉(…からからからから))))こすりこすりこすりこすり落落落落とすとすとすとす

• ウェブサイトのデータを取得し、必要な部分だけを抽出して利用すること

• 例えば、ページ内のリンクを全て抽出したい、ランキングサイトの上位5番目までのデータを取得したい、など

Page 7: 「Html sql」で図書館hpにアクセスしてみよう

htmlSQLとは

• PHPで作られたスクレイピング用ライブラリ、Jonas John氏が開発

• HTMLの要素をSQLのように取り出すことができる

• このサイトで興味を持ったASTRODEO -真面目にエロサイトを作ってみた【プログラマ編】http://astrodeo.com/blog/archives/257

Page 8: 「Html sql」で図書館hpにアクセスしてみよう

インストール&セットアップ

• インストールはすごく簡単

• 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

Page 9: 「Html sql」で図書館hpにアクセスしてみよう

サンプル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(‘属性’ => ‘値’

)

 ・ ・ ・

Page 10: 「Html sql」で図書館hpにアクセスしてみよう

使い方の解説

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つ)

Page 11: 「Html sql」で図書館hpにアクセスしてみよう

注意点(1)

• いざアクセスを開始する前の注意点

• 逮捕されたら困るよね

       / ̄ ̄ ̄\      / _      ̄ ̄\      ヽ |☆|         )      /──二二二二二二l      ヽ二二二二二/   丶      /__             |      |    ひ    |    │     ノ          |    |    (;;;)          |    |                      (⌒)___(⌒)    ヽ           |    ヽ                    / ̄       ̄\     \_____ノ  \__/                   /            l         __|       /  \                   |  ⌒    ⌒    |        / ヽ____/   /\                 │ ■■■■■    │       /| │__丿;;;\_/\_/\ ヽ                |    (⌒)       |      /  ヽ/|ヽ;;;;;;;;;ノ/ \   丶/丶               |   ___T____      |      |   | | /;;;;;|/\─       丶              ヽ   l-- l      /__      /   | |/;;;;;;;/  >__  /   |               \___ ̄____/;;;;;;ヽ      j  | | |;;;;;;;/  /|--┌│ |   │               / ヽ;;;;;|     /⌒l;;;;;;;;;|      | │ | |;;;;;/  /│ ││ |   │              │  |;;;;;L___/  /;;;;;;;;;|     ノ  | │ |;;/  / |___|__| │   |              /   |;;;;;;;;;;;;;;;;;/  /;;;;;;;;;;;|     |  |  |__|;;/ /        |   │             |   |;;;;;;;;;;;;;;/  /;;;;;;;;;;;;;|     ノ  |  \|/         |    │            /   /;;;;;;;;;/  /;;;;;;;;;;;;;;;;;;|    /  |              / ̄丶 |          (⌒(⌒ヾヾ/   /;;;;;;;;;;;;;;;;;;;;;;;;;|   /    ヽ______彡( ̄ ̄ヽ ̄|  |         (  (   |ヾ___/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|  /\   /;;;;[__];;;;;;;;;;;彡(二二 ││ /          (_(_ノゞゞ|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|  ゝ\\/ ̄|      ̄ ̄巛(____ノ_/              彡彡 |;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/| (Ο Ο)\_ノ         彡彡∠彡彡彡彡彡彡彡彡彡彡彡彡彡    |;;;;;;;;;;;;;;/ ̄ ̄ ̄ /  ( Ο丿 |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|                      ヽ;;;;;/      /    ̄   |               │                      | /      /

Page 12: 「Html sql」で図書館hpにアクセスしてみよう

注意点(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);}

Page 13: 「Html sql」で図書館hpにアクセスしてみよう

実践(1)

• さて、いざ図書館にアクセス

• 大きな問題に気づいた

• htmlSQLはPOSTできない

検索エンジンなどを見ていて、なんとなく検索結果はGETというイメージがあったが、実際はどれもPOSTだった

Page 14: 「Html sql」で図書館hpにアクセスしてみよう

実践(2)

• んー・・・

• POSTが使えるように改造するのはそう大変じゃないみたいだが・・・

• 正直別に図書館HPにアクセスしたいわけじゃないし・・・

Page 15: 「Html sql」で図書館hpにアクセスしてみよう

実践(3)

• 予定を変更して

• 男の子のロマン、エロ画像収集にサンプルプログラムを変更

• 「ふたば★ちゃんねる」から画像を収集するプログラムを作成してみた

• 画像URLを抽出しリスト化するプログラムを作る

• 画像自体のDLは、FlashGet的なツールや、$ wget –i [リスト]で行う。

Page 16: 「Html sql」で図書館hpにアクセスしてみよう

実践(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分弱)

Page 17: 「Html sql」で図書館hpにアクセスしてみよう

動作結果

(;´Д`)

Page 18: 「Html sql」で図書館hpにアクセスしてみよう

まとめ

• 図書館にアクセスってなに?

• htmlSQLを使うと、スクレイピングをすごく楽に行うことができる

• POSTには対応していないので、検索結果などから切り出すなどの処理は苦手のようだ

• 十分なスリープをいれたり、ステータスコードをみるなど、相手サーバの事を思いやる心が重要

Page 19: 「Html sql」で図書館hpにアクセスしてみよう

おまけ

• どうやらhtmlSQLは、SEOに使うと便利らしい

htmlSQLでモバイルSEOを簡単にシステムツール化して管理する | 携帯サイトをつくろう。http://www.plusmb.jp/2009/01/30/2378.html

> さらにやってることは、スクレイピングと同じなので、> 使い方によってはもっと色んなことができます。> SEOで言うと結構重要なアレなんかもこれを使えば簡単にできますね。> 具体的には書けないですが、色んな使い方を考えて使ってみて下さい。

会場の中で知っている人がいましたら、こっそり教えて下さい

Page 20: 「Html sql」で図書館hpにアクセスしてみよう

おまけ(2) スタッフ募集のお知らせ

• 株式会社インフィニットループでは、一緒に楽しんでゲームを作ってくれるスタッフを募集しています

• PHPプログラマActionScriptプログラマサーバエンジニア

• 興味のある方は、直接声を掛けていただくか、HPからお問い合わせください