- - PR -
スクレイピング用に簡易ブラウザーを作りたいが、既存のライブラリー等はある?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-02-23 16:00
今まで Web サイトの自動巡回アプリケーションのようなものを、C# から WebBrowser コントロール(IE コンポーネント)を制御することで、実現してきました。(ちなみに WebBrowser の制御にだけなら、相当詳しくなりました。 )
今回、軽さや速さを追求して IE にまったく頼らずに、自前の簡易ブラウザーのようなものを作りたいと思っています。そのほか、たんに、技術的な興味としても IE 以外の方法を知りたいということもあります。ネットで探すと「スクレイピング(scraping)」という分野なのかな?と思いますが、イマイチどのぐらい難しいのかなど、とっかかりが分かりません。 .NET で使える既存のライブラリーがあれば、そのまま使うか、あるいはインターフェースを参考にできればいいな、と思っているのですがなにか良いライブラリーのようなものはあるでしょうか? 以下、参考程度に今思っている要求仕様を書きます。 Web サイトの HTML を解析するのはもちろんですが、その HTML の中にどんなハイパーリンクや form があって、form 内の input 要素に値を設定して submit するなど、Web ブラウザーととしてのひととおりの機能がほしいです。画面(レンダリング)は要らないです。 ケータイサイトのような簡単な HTML の解析で良く、frame などは要らないです。JavaScript なども今のところ要らないのかなと考えています。 そのものズバリでなくても、なにか参考資料程度のサイトや関連情報のご紹介でもあれば助かります。よろしくお願いします。 | ||||||||
|
投稿日時: 2009-02-23 19:08
http://www.atmarkit.co.jp/fdotnet/dotnettips/760ntidy/ntidy.html
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45032&forum=7 | ||||||||
|
投稿日時: 2009-02-23 20:12
todoさん、こんにちは。コメントありがとうございます。
私が悩んでいる点を補足します。ネットで探すと HTML パーサーは良く見かけます。パースして form 要素のオブジェクトは得られるのですが、この form 要素に対して submit メソッドのようなものを呼び出して HTTP のリクエストをして、次のページへ遷移したいのです。このような送信の機能が見つからないのです。 この点、私はスレッドのタイトルで「スクレイピング用」と書きましたが、これはちょっとマズかったかもしれません。「ミニブラウザー」とでも書いたほうが適切だったのかもしれません。そもそもこの分野を指す用語としてなにか検索しやすい用語があるのかを知りたいところです。 ご紹介されたリンク先の、Html Agility Pack は以前にソースコードを見てみたのですが、パーサーだけであり、送信機能がないように思うのです。HtmlWeb クラスに少しあるようですが、上述のような form 要素を使うような機能まではないような感じです。 NTidy のほうはまだ良く見てはいないのですが、名前からしてこれもパーサーが主のような気がするのですが、送信機能も持っているのでしょうか。 | ||||||||
|
投稿日時: 2009-02-23 20:17
さらに補足します。
HTTP 通信は WebRequest/WebClient 機能でやれば良いと思っているので、そのあたりは自前で通信のコードを書けば良いと思っています。通信にのせる HTTP リクエストの電文を構築するのが、自前でやるのは面倒に思っていて、なにか便利なライブラリーとかないものだろうかと思っています。 ただ、パーサーから得られた form オブジェクトなどをもとにして自前で電文を組み立てればそれでいいんでしょうかね。なんだかそういうやりかたでいいような気がしてきました。だからパーサーは多く見かけるけど、送信についてはあまり見かけないのかもしれませんね。 | ||||||||
|
投稿日時: 2009-02-24 09:11
こんにちは
「HTTP のリクエストをして、次のページへ遷移したいのです」だけで あればGETのみ作ればいいので自前でも比較的簡単にできるのでは。。 (パーサー+自前GETで) | ||||||||
|
投稿日時: 2009-02-24 23:09
シンプルなものであれば実現性はあるかもしれません。 しかし、世の中のページにはSubmit時にJavaScriptを実行(onSubmit="hogehoge(); return false;"みたいなもの?)させて、別の隠しFormからSubmitさせるとか意地悪なものもあるので、パースしてSubmitさせるというアプローチは難しいんじゃないかなと思いました。 | ||||||||
|
投稿日時: 2009-02-25 01:23
たしかにそうです。 ただ、最初に書き忘れたのですが、要求仕様としてはほかに、セッション管理もしたくて、したがって cookie も読み書きできることが必要でした。あと GET のほかに POST の場合もあります。 やらないといけないことが結構あって、パーサー以外だとしてもこれを全部自分で作るのがかなり大変そうだな〜、と思っています。 ただ、最初に述べたように、表示(レンダリング)は要りません。 特定のサイト用に作るのでしたら、ゴリゴリ書いていけば良いのかもしれませんが、複数のサイトでも使えるようにするとすると、やはり、簡易ブラウザーのクラスを作ってそれを呼び出して送信(HTTP Request)・受信(HTTP Response)をしたほうが良いと思っています。
とりあえずケータイサイトぐらいの軽いページを対象にしているので JavaScript は要らないです。JavaScript が必要なサイトは WebBrowser (IE コンポーネント)でやりくりすれば良いかなと思っています。(現在、IE コンポーネントを使ってならば、実際にそうやって JavaScript 込みでの制御はできています。) アプリケーションの具体例としては、たとえばこの@IT会議室に自動ログインして、自動的に自分宛のプライベートメッセージの有無をチェックしたり、投稿の新着をチェックしたり、自動的に投稿するなどをするような感じのことをしたいと思っています。この場合、JavaScript は不要なようです。セッション管理は cookie を使って必要となります。(@IT会議室だと atmarkitval という cookie を使うことになるみたいですが。) なお、@IT会議室はあくまでも例です。実際にアクセスしたいのはぜんぜん異なるサイトです。 | ||||||||
|
投稿日時: 2009-02-25 02:36
「HTTPクライアント」になると思います。 cookieはさておいてしまいますが、XMLHTTPを使えばある程度実現できるかもしれません。 あとはHTTPヘッダについても詳しく調べるといいと思います。 http://www.ietf.org/rfc/rfc2068.txt [ メッセージ編集済み 編集者: デューン 編集日時 2009-02-25 02:37 ] |