かきくけこうもりのよろず投資日記(旧サイト)
 
このサイトは移転しました。サイト右側のリンクから、新しいブログに移動できます。
 


2006年7月を表示

結局自分で簡易HTMLパーサを作った

HTMLパーサを作らないで正規表現を駆使して証券会社のページを解析しようとしたら、意外と面倒なことに気付きました。証券会社のページをある程度詳しく解析しなければならないケースが結構あるようです。
例えばGMOインターネット証券のサイトでは、取引注文のページで注文内容を入力してSUBMITボタンを押すと、注文確認のページが表示され、そこでパスワードを入力してはじめて注文が発注できるようになっています。注文確認のページにはパスワードとSUBMITボタン以外に入力箇所は表示されていませんが、取引注文ページでの入力内容をサーバーに届けるためのhiddenのinput要素が記述されています。ですがこのhiddenなinput要素は、取引注文ページで入力したものとは微妙に異なっているようなので、実際に注文を発注するには、そのhiddenのinput要素をきちんと読まなければなりません。それを読み込むにはまずform要素がどこにあるかを知る必要があります。formにはclass属性やらaction属性やらmethod属性やら色々あるので、これだけでも正規表現で読み取るのはなかなか面倒です。
そんなわけで泣く泣くHTMLパーサを作っていたら意外とそれなりに役に立ちそうなのが出来ました。Japan_internet_com デベロッパー - Microsoft C#での HTML 構文解析の記事のおかげです(このままの実装だとタグの検索が面倒なので、タグの部分とその後ろのInnerTextをひとつずつオブジェクト化して実装しています)。この記事を読んでいなければ、無理にツリー構造にこだわってしまってドツボに嵌っていたと思います。
他人のHTMLパーサを探してる時間が本当に無駄でした……こんなことならもっと早く作っておけばよかった。ここ数日この件で行ったりきたりだったけど、ようやく先に進みそう。
       ∩
 いな    | | ./二つ   う
 いん    | | | |
 属と   ノ从ハ从    さ
 性聞   .リ ´∀`§
 かこ    X_@X     耳
 |え   U|_____|U
 |の    ∪ ∪
 ! !



7月20日(木) | トラックバック(0) | コメント(0) | 日記 | 管理

EfTidyは日本語を通さないのかも

昨日紹介したEfTidyを早速使ってみました。しかしHTMLの日本語部分が何故か実体参照に置換されてしまいました。エンコード設定のオプションなどもきちんと指定してみたのですが、うまく行きませんでした。本来のHTML Tidyは日本語を通す筈なのに。おかしい。
EfTidyが原因なのか、その下位にあるTidy Libraryが原因なのかがわからなかったので、Tidy LibraryのDLLをDeclare文で直接呼び出すサンプル(http://users.rcn.com/creitzel/tidy/TestTidy.NET.vb)を使って調べてみたのですが、これを利用しても日本語の部分が実体参照に置換されてしまいました。
ライブラリのヘッダファイルを見ると、どうもアジア語圏用のディレクティブがあるようです。実際にライブラリをビルドしたわけではないのでよくわかりませんが、もしかすると、私がダウンロードしてきたライブラリはその設定ディレクティブがオフになった状態でコンパイルされたものなのかも知れません(欧米の人が配布していたものなので)。
そうなると自分の手でライブラリをビルドすればいいのかもしれませんが、それこそわざわざそこまでやって確認するのが無駄に思えてきました。
Japan_internet_com デベロッパー - Microsoft C#での HTML 構文解析という記事を見つけたので、これを参考にして自分でHTMLパーサを作ったほうが良さそうです。
この記事にあるものは、内部がツリー構造化されているような厳密なHTMLパーサとは違って、上から下まで適当に読み下して解析する単純なものです。色々テストしているうちに気付いたのですが、特定のサイトの特定部分のみを切り出すような目的ならば、ツリー構造化されているものよりも、このサンプルにあるような単純なやり方の方が楽なのではないかと思います。
まあいずれにせよ、ブラウザを作るわけじゃないのだから、こんなところに専念するわけにもいかないので、必要になったらプログラムを組むという形で対処しようと思います。
    ┏━┳━━┳━┓
    ┣ヽ  ̄ / (・ω・)┫
    ┣━━╋━╋━┫
    ┣、ハ,,、 \(. \ ノ┫ズコープラモ
    ┗┻━━┻━┻┛

完成図
        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄ ̄



7月19日(水) | トラックバック(0) | コメント(0) | 日記 | 管理

EfTidyというTidy Libraryのラッパーがあるらしい

HTMLDocumentはWebBrowserオブジェクトを使わないと文字列を直接DOMで解析する方法が無い、というわけでゴリゴリと正規表現やら何やらを色々使って証券会社のページを解析することにしました。やってみるとかなり面倒。いきなり証券会社の注文ページを解釈するプログラムを書くのは気が引けたので、まずは信用取引規制銘柄や証券会社固有の規制がある銘柄が示されているテーブルを解釈するプログラムを書きました。でもこれだけでも結構面倒でした。
発注に関しては予めどんな引数が必要なのかをHTMLソースを見て調べておけば、あとは引数をPOSTするだけでいいはずなので、むしろ楽なのかもしれません。ただPOSTの後で返ってきた内容を調べるのとか結構面倒くさそう。
とはいえ、プログラムを書いていくうちに、他人の出所不明のHTMLパーサを使うよりは、自分で書いたHTMLパーサを使ったほうが安心な気がしてきました。多分その方が変なバグがあったときに悩まされずに済みます。でもやっぱり面倒。
で、VB.NETにまともなHTMLパーサのライブラリが無いと嘆いていたのですが、色々探していたらEfTidy: The Tidy Library wrapper - The Code Project - C++ / MFCというのを見つけました。まだ使ってみてませんが、他のHTMLパーサよりも使い物になるかもしれません。
HTMLTidyというのはHTMLのエラーをチェックしたりHTMLをXHTML化したりしてくれる有名なツールです。HTML Tidy Project Pageでこのライブラリーが公開されていて、その中にはHTMLのパーサ機能が含まれています。もともとエラー付きの汚いHTMLを読み込むことを前提に設計されているものなので、多分汚いHTMLでもきちんとパーサとして機能してくれるのではないかと思います。EfTidyはそれのラッパーで、これを介してVB.NETから利用することができるようです。HTMLDocumentとは違ってちゃんとメモリ上にある文字列型のHTMLソースを読み込めるようになっているようです。
これを使ってみようかな~とも思うのですが、そこまでする必要あるのかな~という思いもあって、ちょっと悩み中。そのうちXML化する可能性のあるものにおいて、現段階でわざわざそこまでしてHTMLを解析する必要があるのか?という疑問。まあ、もし正規表現で記述していくのもやってられないくらい面倒くさいHTMLパージング処理が必要になったら考えます。
それにしても、新興は結構やばそうですね。

     [゚д゚]
     /[_]ヽ
      | |
 ■■□■■□◇_◇□□□

     [゚д゚]
     □_]ヽ□
      | |
 ■■_■■_◇_◇□□□

          [゚д゚]
          □_]ヽ□
           | |
 ■■_■■_◇_◇□□□

                 [゚д
                 □_
                  | |
 ■■_■■_◇_◇□□□





 ■■_■■_◇_◇□□□



7月18日(火) | トラックバック(0) | コメント(0) | 日記 | 管理

WebBrowserコントロール使わないとHTMLDocument使えない!

HTTPRequestクラスとHTTPResponseクラスを使ってWEBサイトからHTMLを文字列形式で受信することはできたのですが、ここで問題発覚。HTMLの構造を解析するためにHTMLDocumentを使おうとしたら、このHTMLDocumentはWebBrowserコントロールと連携する形でしか使えないようです。つまり文字列を直接HTMLDocumentに変換して、HTMLDocumentのパーサを利用するというような方法が無いのです。XMLみたいにLoadXMLのようなメソッドがあればいいのですが、そういうものは存在しないようです。
いくらなんでも、他にHTMLパーサみたいなクラスぐらいあるだろ~と思って調べても、見つかりませんでした_| ̄|○。そういうクラスが存在しないということを確認するのに丸一日かかっちゃったよ_| ̄|○_| ̄|○_| ̄|○
でも何でHTMLDocumentよりも単純なHTMLパーサが無いの???
おかげで、自動売買をやってるブログで、axWebBrowserをスレッドではなくタイマーで制御していたり、わざわざ発注専用のアプリケーションを使って引数付きで起動して発注していたり、UWSCを使ってる理由がよくわかりました_| ̄|○。
私の現在の実装では売買シグナルが出る度に発注を別スレッドでやる予定だったので、これは厳しいです。でもaxWebBrowserはコントロールだから、あまりマルチスレッドには向かない感じです(無理というわけではないけど、ちと実装面で不安な部分がある)。
HTMLDocumentを使わないで独自にパーサを作ってやるか、それともaxWebBrowserコントロールを使ってアクセスするか……
色々考えたのですが、結局HTMLDocumentを使わない方向で実装することになりそうです。多分GMOインターネット証券がそのうち発表するであろうAPIはWebAPIでXMLを返してくる形式のものなのではないかと思うので(勘)、HTMLを文字列化したものをパーサに通すという形をとった方が後々楽なのではないかと。
HTMLパーサは誰か他の人が作ったライブラリでもあるだろうと思って色々調べてみたのですが、残念ながらどれも実装面がいまいちな感じでした。きちんとHTMLを解釈してくれないとか、読み込みの段階でエラーが出ちゃったりとか。
ETWrapperはどうやってるんだろうと思って調べてみたら、どうもRubyを使っているようです。私はRubyとか使ったことがないし、VB.NETとの連携の仕方もわからないので、これについてはお手上げです。
自分でHTMLパーサを作るの、何か不安だなあ……
        ∩∧_∧
      l⌒) (´・ω・`)∩   知らんがな!!
      \l⌒)   , ノ
        \__ ノ   知らんがな!   知らんがな!
  ∩∧__∧∩   ∩∧∧∩   ∧∧
   (´・ω・`)/   | (´・ω・`) / (´・ω・`)
  ヽ( ・ω)ノ∩/■\∩.∧___∧∩
   (´・ω・`)l (    ) l( ω・  `)/



7月16日(日) | トラックバック(0) | コメント(0) | 日記 | 管理

とりあえずWEBサイト読み込めるようになった

とりあえずWEBサイトにアクセスするためのプログラムをちょっとだけ書きました。
作ってる最中にVB.NETのオブジェクトの参照関係がおかしくなっちゃったみたいで、System.Web.HttpUtilityを呼び出そうとしても、そんなオブジェクトは存在しない~みたいなエラーが出てきました。どうしてだぁ~?と思って色々弄くっていたところ、オブジェクトブラウザの方で参照の更新をかけると正常な状態に戻りました。
その後HttpWebRequestとかを弄っていたのですが、こういうのを組むのは久しぶりのことなのでてんてこ舞い。エンコードとか引数の渡し方とかをすっかり忘れてしまっています。
そこでまずは難しいことを考えずに、POSTやGETを使ってサイト上の文字列を取得するプログラムを書くことを目的としました。最初はGoogleを使ってテストしていたのですが、GoogleだとPOSTメソッドを受け入れてくれないようなので、POSTメソッドに関してはlivedoorファイナンスのカブログの検索ページでテストしました。カブログのページはGETメソッドで応答するように作られていますが、POSTメソッドも受け入れるようです(というか、大抵のGETメソッドを受け入れるページはPOSTメソッドも同じ引数で受け入れるようにできているのですが)。私が使っているNorton Internet Securityのログを見てみると、一応見た目には引数が無い状態でカブログにアクセスしていて、実際には検索結果が得られているので、多分POSTはうまくいっていると判断。あとは証券会社に実際にユーザーIDとパスワードをぶち込んで送信すればログインできるはずですが、ちょっと怖いのでまだやってません。結局まだPOSTメソッドやGETメソッドで取得したものを文字列として返すだけという状態ですが、まあWEBサイトへのアクセスの肝となる部分は何とかなったと思います。
とりあえず、GMOインターネット証券がAPIを公開するまでは、HTMLをゴリゴリと読み込んで、目的の値が記述されているところをタグの深さから類推するような形になりそうです。現物買い付け余力を囲むtdタグとかにクラス属性とかが設定されていれば読みやすいんだけどなあ。これが嫌だからAPIに期待。
  ______
  |┌‐――┐| |-、
  | |      | | | ]   ザー ……
  | |_/ ̄ ̄ || | |_/
 └ |    |┘-'、
 /lll|||||||lll \|  ||
m ノlll|||||lll`mノ|_||



7月16日(日) | トラックバック(0) | コメント(0) | 日記 | 管理


(3/6ページ)
最初 1 2 >3< 4 5 6 最後