Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PHPで街を育てる

via. http://wordpress.rauru-block.org/index.php/1558

空前のMyMiniCityブームですが、ようやく工場が建ち始めました。

で、いきなり本題。http://blog.kawadash.in/junzou/myminicity-rubyとかhttp://wordpress.rauru-block.org/index.php/1558に倣って、myminicitygrower.phpを書いてみました。
HTML要素の取り回しはやはりSimpleXMLが楽なんですが、はてなのページはHTML4.01 Transitionalらしいので、一度XHTMLに変換することにしました。その際、tidy拡張モジュールでも良かったんですが面倒だったwので、http://www.rcdtokyo.com/ucb/で公開されているHTMLParserを使わせてもらいました。

で、目的のコードは以下のような感じで手抜きまくりです;-)

<?php
error_reporting(E_ALL);
/**
 * @see http://www.rcdtokyo.com/ucb/contents/i000799.php
 */
require_once('HTMLParser.class.php');
require_once('HTTP/Request.php');

define('HATENA_URL', 'http://twitter.g.hatena.ne.jp/keyword/MyMiniCity%e9%83%a8');
define('SLEEP_TIME', 3);
function sendRequest($url) {
    $request = new HTTP_Request($url);
    $response = $request->sendRequest();
    if (PEAR::isError($response)) {
        return false;
    }
    return $request->getResponseBody();
}

$doc = sendRequest(HATENA_URL);
if (!$doc) {
    die('request failed');
}

$parser = new HTMLParser();
$parser->setRuleFile('./xhtml1-transitional_dtd.inc.php');
$parser->setRoot('html', array('lang' => 'ja'));
$parser->setGenericParent('body');
$parser->parse($doc);
$doc = $parser->dump('utf-8');

// HTMLの微調整とゴミ取り
$doc = mb_ereg_replace('&nbsp;', ' ', $doc);
$doc = mb_ereg_replace('\x1c', '', $doc);

$xml = new SimpleXMLElement($doc);
foreach ($xml->xpath('//div[@class="section"]//td[2]/a') as $element) {
    $url = $element[0];
    if (!preg_match('#http://.*#', $url)) {
        continue;
    }
    echo "request : $url ... ";
    echo (sendRequest($url) ? 'OK' : 'FAILED') . "\n";
    sleep(SLEEP_TIME);
}

まあ、


それでまあ、ここまで作ってから思ったんだけど、MyMiniCity って、実は単に GET でアクセスするだけじゃ駄目で、flash だか javascript だかで変なことしなきゃいけなかったりしない? なんかこのスクリプト走らせても人口増えてないような気がするんだが…

と思うので、効果は期待しないでください;-)

うーん。XPath楽だぁ。

追記(2007/12/24 16:55)

続きは「PHPで街を育てる」の続き - Do You PHP はてなで。