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(' ', ' ', $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楽だぁ。