C#でスクレイピング
マッシュアップで欠かせない技術の一つにスクレイピングが挙げられる。
WebAPIが提供されていないサイトに対して、HTMLから直接情報を取り出す技術だ。
これには大きく分けて2つの方法がある。
HTMLをテキストとみなし、正規表現で処理する方法と、
HTMLをXHTMLに変換し、そのDOMに対してXPathで処理する方法だ。
こういう分野に強いのはPHPやPerlなどの軽量スクリプト言語だろう。
しかしC#使いだってスクレイピングやってみたい。
というわけで、
http://d.hatena.ne.jp/todesking/20061027/1161879777を参考にやってみた。
ちなみにここでやってるのは上記2つの方法のうちの後者。
・・・うまくいかない。
つかTidyマンドクセー!
HTMLをXHTMLに変換したいだけなのに、オプションがありすぎて意味不明です。
もっと手軽なコンバータはないものか。できればマイクロソフト製で。
・・・やっぱりあった。
Microsoft API and Reference Catalog
InfoPath SDKについてるHTMLtoXHTMLというCOMコンポーネントが使えそうです。
簡単にセットアップ手順を説明するとこんな感じ。
- http://www.microsoft.com/downloads/details.aspx?FamilyId=351F0616-93AA-4FE8-9238-D702F1BFBAB4&displaylang=enをダウンロードしてインストールする。
- 「C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office InfoPath 2003 SDK\Tools」から、次のコマンドを実行する。(COMコンポーネントの登録)「> regsvr32 html2xhtml.dll」
- Visual Studioの任意のプロジェクトの「参照設定」→「参照の追加」→「COM」タブから、「HTML2XHTML 1.0 Type Library」を選択して追加。
あとはHTML2XHTMLを使ってHTMLをXHTMLに変換し、XPath等でいじり倒すのみ!
サンプルとしてGoogleで「C#」を検索した結果ページから、
エントリのタイトルを抽出してみる。
今回は3.5らしくLINQtoXMLでやってみよう。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using HTML2XHTMLLib;
using System.Net;
using System.IO;
namespace ScrapingSample
{
class Program
{
static void Main(string[] args)
{
WebClient wc = new WebClient();
string html = wc.DownloadString("http://www.google.co.jp/search?hl=ja&q=C%23&lr=");
XHTMLUtilities util = new XHTMLUtilities();
string xhtml = util.convertToXHTML(html);
const string XHTML = "{http://www.w3.org/1999/xhtml}";
XDocument xdoc = XDocument.Parse(xhtml);
var query = from a in xdoc.Descendants(XHTML + "a")
where a.Attributes("class").FirstOrDefault(atr => atr.Value=="l") != null
select a;
foreach (var item in query)
{
Console.WriteLine("Title={0}", item.Value);
}
Console.WriteLine("完了しました。");
Console.Read();
}
}
}
出力結果はこんな感じになる。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Title=C# によるプログラミング入門
Title=C Sharp - Wikipedia
Title=Visual C# ホームページ
Title=Visual Studio 2008 Express Editions
Title=@IT:連載 改訂版 C#入門
Title=@IT:特集 私がJavaからC#に乗り換えた10の理由
Title=C#を攻略しよう
Title=C#入門
Title=宇宙仮面の C# プログラミング
Title=C# Tips
完了しました。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
今後の課題としてはHTML2XHTMLの機能の弱さをなんとかすることだろう。
手軽な分、Tidyなんかよりも融通が効かないところがツライ。
GoogleCalendarAPI + LinqToXMLで休日を取得する方法
があまりにも簡単すぎて思わず吹き出した。
LinqToXMLでGoogleCalendarAPIにアクセスし、
2007年1月1日から2008年1月1日までの休日をピックアップしてみる。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;
namespace Sample
{
class Program
{
static void Main(string[] args)
{
string URL =
"http://www.google.com/calendar/feeds/japanese@holiday.calendar.google.com/public/full?start-min=2007-01-01&start-max=2008-01-01";
string ATOM = "{http://www.w3.org/2005/Atom}";
string GOOGLE = "{http://schemas.google.com/g/2005}";
XDocument doc = XDocument.Load(URL);
var query = from entry in doc.Root.Elements(ATOM + "entry")
from when in entry.Elements(GOOGLE + "when")
orderby when.Attribute("startTime").Value
select new {
Title=entry.Element(ATOM + "title").Value,
Date=when.Attribute("startTime").Value
};
foreach (var item in query) { Console.WriteLine("{0}は{1}", item.Date, item.Title); }
Console.Read();
}
}
}
実行結果はこんな感じ。
2007-01-01は元日 2007-01-08は成人の日 2007-02-11は建国記念の日 2007-02-12は振替休日 2007-03-21は春分の日 2007-04-29はみどりの日 2007-04-30は振替休日 2007-05-03は憲法記念日 2007-05-04は国民の休日 2007-05-05はこどもの日 2007-07-16は海の日 2007-09-17は敬老の日 2007-09-23は秋分の日 2007-09-24は振替休日 2007-10-08は体育の日 2007-11-03は文化の日 2007-11-23は勤労感謝の日 2007-12-23は天皇誕生日 2007-12-24は振替休日
かつてRSSフィードを取得するRSS.NETとかあったけど、
LinqToXMLがあれば
XMLで公開されているWeb上のリソースを取得するためのライブラリなんて
もういらなくね?
楽すぎる〜(^0_0^)
「メソッド」の語源
一昔前に流行った「高橋メソッド」の
「メソッド」ですが、英語の語源はギリシャ語の
「メタ・ホドス」でして、
英語で直訳すると「on the load」ってところでしょうか。
つまり「道の上を」進むように、ある規則性に従って物事を進めることなんですね。
なんでこんなことを言い出すかというと、
「メタミドホス」と「メタ・ホドス」似てるなぁと思って。
すんません、ただそれだけ。
※
ちなみに、メタミドホスの語源は
Meth(メタ)=メチルmethyl (-CH3)+
amido(アミド)= amides(-NH2)+
phos(ホス)=phosphoric acid(リン酸)
だそうです。
http://blog.livedoor.jp/aroma_master/archives/51291701.html
日経平均13629円に回復
ちょっと上がってきました。。。
オイラが買った株が利益を出すまではまだまだですが、
それでもやはりうれしいものです。
来年か再来年には売れるぐらいまでに
回復してるかな?

お金は銀行に預けるな 金融リテラシーの基本と実践 (光文社新書)
- 作者: 勝間和代
- 出版社/メーカー: 光文社
- 発売日: 2007/11/16
- メディア: 新書
- 購入: 28人 クリック: 510回
- この商品を含むブログ (516件) を見る
シフトしようかなと思った。
一ヶ月前の日経のコラムにも、
長期的に見た場合アクティブ型の投信が
インデックス型を上回ることはなかなか難しいとあったし。
そうなると諸費用の安いインデックスが断然有利ですよね。
年利4、5%ぐらいで上等、10%は良すぎ
という目標設定の目安にも納得。
オススメの本です。
LINQいい感じです。
Visual Studio 2005で開発したWebサイトをVisual Studio 2008に移行して
.NET Framework3.5の恩恵を受けています。
当然LINQも使うぜ。というか非常に便利です。
特に便利だと感じたのはADO.NETと相性の良さです。
今まではテーブル結合後のデータを取得するために
データセットにテーブルアダプターの定義を増やしていましたが、
LINQだと単一テーブルのデータアダプターで取得した
テーブル同士を結合できるので、
ちょっと名称を取りたい、なんてときに便利。
Application Architecture for .NETの概要
連載:アプリケーション・アーキテクチャ設計入門 - @ITより抜粋。
2003年の記事だが内容は今も有効。
ユーザー・インターフェイス・コンポーネント
- 特徴
- 役割
データの入力時には以下の処理をする。
データの出力時には以下の処理をする。
- 推奨
Windowsアプリケーションの場合
Webアプリケーションの場合
モバイルアプリケーションの場合
(Office製品をUIとする)ドキュメントの場合
-
- ドキュメント・ベースのユーザー・インターフェイスにおいても、入力データの検証には注意が必要である。データ型を限定するだけでなく、データをチェックしてエラーを表示する機能を実装する場合も多いだろう。