2010年6月アーカイブ

2007年夏にMT4.0を導入してから、一度もアップグレートしていなかった(怖くていじれなかった)のですが、ついにバージョン5(5.02)にアップグレードしました。

5行のコードで、Yahoo!のトピックス一覧を抽出する!使うのは「メモ帳」だけ!

Windowsユーザのみなさん、社会人・学生のみなさん、こんにちわ。
プログラマではないあなたのために、プログラムの面白さを伝えるためにこの記事を書きました。

これから、たった5行のコードでYahoo!のトピックス一覧を抽出してみます。
このプログラムのすごいところは、何もインストールしなくてよいことです。
Windowsとメモ帳だけあれば動きます。

下記のコードをメモ帳に貼り付けて、デスクトップに保存してください。
(IE6,7で動作確認済みです。たぶんIE8でも動きます。)

ファイル名: yahoo.jse

var IE = new ActiveXObject('InternetExplorer.Application');
IE.navigate('http://yahoo.co.jp');
while (IE.busy);
while (IE.document.readyState != "complete");
WSH.Echo(IE.document.getElementById('topicsfb').innerText);


ファイル名が " yahoo.jse.txt " にならないように気をつけてくださいね

jscript01.JPG

保存したら、ダブルクリックします。

02.jpg

すると、、、ほら!!

03.jpg
ね、すごいでしょ?

応用例

株価を取得する
トヨタ自動車の株価をチェックしてみたりとか。


var IE = new ActiveXObject('InternetExplorer.Application');
IE.navigate('http://profile.yahoo.co.jp/fundamental/7203');
while (IE.busy);
while (IE.document.readyState != "complete");
WSH.Echo(IE.document.getElementById('left_col').innerText);

04.jpg

気象庁の天気予報を取得する
明日のデートにそなえたりとか。


var IE = new ActiveXObject('InternetExplorer.Application');
IE.navigate('http://tenki.jp/');
while (IE.busy);
while (IE.document.readyState != "complete");
WSH.Echo(IE.document.getElementById('descriptionEntries').innerText);


05.jpg
どうですか、簡単でしょう?

まとめ

JavaScript(厳密に言うとJScript)で遊んでみました。
Windowsには、このようにメモ帳だけでプログラムを実行できる素晴らしい環境があります。
特別なソフトを入れずとも、すぐプログラムが書けるのです。

これでプログラミングの楽しさを知っていただけたら幸いです。

(くれぐれも悪用しないでくださいね!!)

コマンド1発で、ヤフーのトップページを取得する!

Perlを使うと、たった1行のコード(というかコマンド)でウェブページのHTMLを取得できます。

しかも、LinuxでもWIndowsでも全く同じコマンドで動作します。

Linux系の場合
$ perl -MLWP::Simple -e  " print get 'http://yahoo.co.jp' "


Windowsの場合(コマンドプロンプトで下記を入力)
> perl -MLWP::Simple -e  " print get 'http://yahoo.co.jp' "


実行結果
Wide character in print at -e line 1.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータルサイト。
検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。
あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">
<title>Yahoo! JAPAN</title>
<base href="http://www.yahoo.co.jp/_ylh=X3oDMTB2OHNyYWxqBF9TAzIwNzkxODE5OTkEdGlkA
zEzBHRtcGwDdGFibGU-/">
<style type="text/css">
(以下省略)

取得したHTMLをファイルとして保存したい場合は、下記のようにします。
こうすると、結果を画面に表示する代わりにファイルに保存できます。


perl -MLWP::Simple -e  " print get 'http://yahoo.co.jp'" > yahoo.html
ちなみに">"記号のことを「リダイレクト」といいます。

Perlって素晴らしい!!



【補足1】
LWP::Simpleモジュールが必要です。
上記のget関数は、Perlの標準関数ではなくてLWP::Simpleというモジュールが提供する関数です。
インストール方法は割愛しますが、よく使われるモジュールなのでレンタルサーバなどでは初めから入ってることが多いです。
(Xreaにはインストール済みでした。)

【補足2】
出力結果の1行目に警告が出ちゃってますが、多めに見てあげてください。。。

/**
 * 半角数字→全角数字に置き換えるmodifier
 *
 * @see
 * http://pentan.info/php/smarty/mod_hkana.html
 *
 */
function smarty_modifier_numeric_hantozen($string, $encoding = 'UTF-8')
{
    return mb_convert_kana($string, "N", $encoding);
}

使い方

ファイル名を "modifier.numeric_hantozen.php" にして、Smartyのプラグインディレクトリに保存してください。

テンプレート内で、下記のようにと書くと変換してくれます。

{$number|numeric_hantozen}

参考記事
携帯表示用に文字を全角から半角にする - [Smarty] ぺんたん info
とりあえず解決できたので、以下にその方法を載せておきます。
原因や仕組みはよくわかりません。すいません。。
Ubuntu9.04にWeb::Scraperをインストールしたかったのですが、うまくいきません。

私はPerlが大好きなのですが、CPANモジュールのインストールができないときは何をどうしてよいのかわからず途方にくれてしまいます。

う~ん。。。モダンPerlへの道は険しい。。。

Net::Twitter::Liteを使うとこんなにカンタン!!

ほんとに5行のコードでつぶやけてしまいました。
#!/usr/bin/perl
use Net::Twitter::Lite;
use utf8;
my $nt = Net::Twitter::Lite->new(username => 'DQNEO', password => 'hoge');
my $result = eval { $nt->update('ついったー!!') };
warn "$@\n" if $@;
Net::Twitter::Lite バンザイ!!

13行のコードで、Yahoo!Japanのトピックス一覧を取得する!

PerlでHTML取得・解析したいときはLWP::UserAgentとHTML::TreeBuilderというのを使うと簡単にできます。
LWP::UserAgentを使うと、Webページの取得ができます。
HTML::TreeBuilderを使うと、HTMLのDOM解析ができます。

この2つのモジュールを使って、Yahoo!Japanのトピックス一覧を取得してみましょう。
コメント行と空行を除くとたったの13行です。

use strict;
use warnings;
use LWP::UserAgent;
use HTML::TreeBuilder;

# urlを指定する
my $url = 'http://www.yahoo.co.jp';

# IE8のフリをする
my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";

# LWPを使ってサイトにアクセスし、HTMLの内容を取得する
my $ua = LWP::UserAgent->new('agent' => $user_agent);
my $res = $ua->get($url);
my $content = $res->content;

# HTML::TreeBuilderで解析する
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);

# DOM操作してトピックの部分だけ抜き出す。
# <div id='topicsfb'><ul><li>....の部分を抽出する

my @items =  $tree->look_down('id', 'topicsfb')->find('li');
print $_->as_text."\n" for @items;                          

実行結果↓↓

$ perl get_parse.pl

岡田氏ら11閣僚の再任内定
都知事「菅新内閣は極左」
主力級の種牛5頭 感染シロ
鳥獣駆除の2人 撃たれて死亡写真
イスラエル 新たに支援船だ捕写真NEW
はやぶさ地球へ 異例の人気写真
エトオ「日本が最も危険」
看護師アイドル「採血が快感」写真
今日の話題(40件)
一覧
をを!超かんたん!!

解説

主にHTML::TreeBuilderを解説します。

parse
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);
$contentには、HTMLを文字列として格納したものが入ります。
必ずしもLWPを使う必要はなく、ローカルファイルを読み込んだものでもOKです。
ここまではお約束なので覚えてしまいましょう。


find, look_down, as_text
my @items =  $tree->look_down('id', 'topicsfb')->find('li');
print $_->as_text."\n" for @items;
↑をわかりやすく書くとこう↓です。
my $elm  = $tree->look_down('id', 'topicsfb');
my  @list =  $elm->find('li');
for my $li (@list) {
    print $li->as_text."\n"
} 

$tree->look_down('id', 'topicsfb') 
「HTML文書中で、id属性がtopicsfbである要素を取得せよ」です。
JavaScriptのdocument.getElementByID('topicsfb') とほぼ同じものです。

$elm>find('li');
「その要素の中のli要素のリストを取得せよ」です。
JavaSciptのelement.getElementsByTagName('li')とほぼ同じものです。

$li->as_text 
「その要素に含まれるテキスト文字列を取得せよ」です。
JavaSciptのelement.innerTextとほぼ同じものです。


このlook_down, find, as_textという3つのメソッドだけ覚えればたいていのことはできます。
(実はHTML::Elementというオブジェクトのメソッドです)
公式ドキュメントを見ると他にもごちゃごちゃといっぱいメソッドがありますが、最初は覚える必要ありません(キッパリ)

メッソドチェーン (jQuery的なアレ)
look_down,find, as_textは任意のHTML要素に対して実行できます。
また、戻り値はHTML要素を返します。
つまり、jQueryのようにメソッドチェーンをつなげてDOM要素を探索していくことができるのです。

print $tree->look_down('id', 'spotlight_mainfb')->find('ul')->find('li')->as_text;

# 結果
「女編集者、松方弘子28歳独身」
・・・働きマン?

レンタルサーバでも動く

Web::Scraperというモダンなモジュールもあるようですが、HTML::TreeBuilderの方がインストールが簡単です。
(私が使っているXreaレンタルサーバではデフォルトで入っていました。)

参考になった記事

補足1

Webページを取得するだけなら1行でできます!
簡単!たった1行のコードでWebページを取得するPerlスクリプト - DQNEO起業日記

補足2

いろんな方が補足記事を書いてくださったので、ご紹介いたします。
ツッコミありがとうございます!

HTML::TreeBuilder のメソッドを覚えるには人生はみじかすぎる件について

Tatsuhiko Miyagawa の HTML::Selector::XPath をつかえば、 use HTML::Selector::XPath 'selector_to_xpath'; print selector_to_xpath('#topicsfb li'), "\n"; # => //*[@id='topicsfb']//li のように、簡単に CSS Selector から XPath を生成することができる。

知りませんでした!ありがとうございます。

[PHP]簡単!たった6行のコードで HTML取得&解析をするPHPスクリプト
PHPだと6行ですか!すごい!

[perl] たった*行のコードでHTML取得&解析をしたい場合はWeb::Scraperが便利
コードが短い!
ありがとうございます。
ただ、Web::Scraperは私のようなPerl初心者にはインストールが難しかったです。。

補足3

いろいろ試行錯誤してWeb::Scraperをインストールできたので記事を書いてみました。
誰かのお役に立てば幸いです。

人気記事

このアーカイブについて

このページには、2010年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2010年5月です。

次のアーカイブは2010年7月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近の人気記事