tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWebページ内の文字取得につきまして
記事No16371
投稿日: 2017/12/19(Tue) 07:27
投稿者susu
お世話になります。

Webページ内の文字取得につきまして

度重ね同じ様な質問になり申し訳ありませんが宜しくお願い致します。


概要
Webページ内(各ブラウザーに適応)にマウスポインタを移動⇒クリック⇒範囲選択(Ctrl+A)⇒コピー(Ctrl+C)により文字を取得しています。
それを定期的(webページ内に最初のマウスポインタ位置に移動⇒範囲選択⇒コピー)に繰り返しています。
マウスポインタを移動しないでwebページ内の文字が取得できますと良いのですが見当たりませんでした。

質問
最初の一度だけマウスポインタを移動しますが、その後はマウスを使わないでwebページ内を範囲選択するような方法はありませんでしょうか。

ご教示願えますと幸いであります。

環境
OS:Windows XP/7/8/10  IE 6/11   VB 6.0 VB歴は長いのですが詳しくはありません。

[ツリー表示へ]
タイトルRe: Webページ内の文字取得につきまして
記事No16373
投稿日: 2017/12/19(Tue) 10:37
投稿者魔界の仮面弁士
> OS:Windows XP/7/8/10  IE 6/11   VB 6.0

普通は 8.1 だと思いますが…本当に 8 ですか?
以下、サポートされている組み合わせ。

Windows 2000 ⇒ IE5(標準) / IE5.5 / IE6
Windows XP   ⇒ IE6(標準) / IE7 / IE8
Windows Vista⇒ IE7(標準) / IE8 / IE9
Windows 7    ⇒ IE8(標準) / IE9 / IE10 / IE11
Windows 8    ⇒ IE10(標準)
Windows 8.1  ⇒ IE11(標準)
Windows 10   ⇒ IE11(標準) / Edge(標準)

ゆえに今回のケースでは、IE6 と IE11 のみを対象とするのなら、
 Windows XP + IE6、Windows 7/8.1/10 + IE11
になるはずで、Windows 8 の出番は無さそうですが。


> それを定期的(webページ内に最初のマウスポインタ位置に移動⇒範囲選択⇒コピー)に繰り返しています。
定期的にというのは、Timer イベントを用いて、座標位置からの操作を行って、
IHTMLTxtRange から辿っているということでしょうか。
それともコードでの制御ではなく、手動でマウス操作&コピーしているということでしょうか。

座標位置からのオブジェクト取得としては、
oleacc.dll の AccessibleObjectFromPoint API で IAccessible を得る方法や、
IHTMLDocument2::elementFromPoint メソッドで IHTMLElement を得る方法などがあります。

座標を指定したいのではなく、マウス操作のエミュレーションが目的なら、
SendInput API を使う手もあります。


> webページ内を範囲選択するような方法はありませんでしょうか。
Web ページ内のどこを範囲選択したいのかにもよりますが、
今年7月にやりとりした No16333 との違いが分かりませんでした。
問題点はどこでしょうか?

[ツリー表示へ]
タイトルRe^2: Webページ内の文字取得につきまして
記事No16376
投稿日: 2017/12/19(Tue) 14:48
投稿者susu
魔界の仮面弁士 様 

返答をして頂きましてありがとうございます。

>普通は 8.1 だと思いますが…本当に 8 ですか?
8.1でした。済みませんでした。8 ⇒8.1に訂正させて頂きます。

>ゆえに今回のケースでは、IE6 と IE11 のみを対象とするのなら、
>Windows XP + IE6、Windows 7/8.1/10 + IE11
>になるはずで、Windows 8 の出番は無さそうですが。
済みません。Webページ内(各ブラウザーに適応)での説明に不備がありました。
不備により、大変お手数をお掛けしました。
IE・Web以外のブラウザー(Google Chrome、Mozilla Firefox、Opera ・・・)でも
範囲選択⇒コピー⇒文字の取得できるように(Ctrl+A)(Ctrl+C)のkeybd_event 関数で行っています。

>定期的にというのは、Timer イベントを用いて、座標位置からの操作を行って、
>IHTMLTxtRange から辿っているということでしょうか。
はい、定期的はTimerで行っています。
IHTMLTxtRangeの使用はしていません。

最初の始めの一回だけ手動でWebページ内をクリックしてその座標位置を同じ位置で繰り返しクリック操作して行っています。
クリックした座標位置は変わりなく一定ですのでマウスを使わない方法で範囲選択できないものかと考えています。

>座標を指定したいのではなく、マウス操作のエミュレーションが目的なら、
>SendInput API を使う手もあります。
間違っていましたら済みません。
SendInput APIを使いますとWebページ内をクリック(関数)しないで仮想的(クリックしたのと同じ)⇒範囲選択できるものと考えてよいのでしょうか。
ブラウザー(IE、Google Chrome、Mozilla Firefox、Opera ・・・)でもWebページ内でも取得できますでしょうか。

IE・WebではSendMessage(ハンドル, WM_GETTEXT, Len(txt), ByVal txt)で文字テキストを取得しています。
              ↓ 訂正 2017/12/21
IE・WebではWebBrowser1.document.body.innerTextで文字テキストを取得しています。

IE・Web以外のブラウザー(Google Chrome、Mozilla Firefox、Opera ・・・)でも文字テキスト取得を考えkeybd_event 関数にしました。

>> webページ内を範囲選択するような方法はありませんでしょうか。
>Web ページ内のどこを範囲選択したいのかにもよりますが、
ページ内の文字テキストに当たる部分を取得します。
>今年7月にやりとりした No16333 との違いが分かりませんでした。
>問題点はどこでしょうか?

>『どこを選択するのか』を定めておく必要があるでしょうね。
前回はどこも選択しないで文字テキストを取得できないものかと思っていましたが、
>(自作ブラウザーまで含めた、あらゆるブラウザーに対応するというのは流石に無理なので)

今回はページ内で取得する文字テキスト部分を一度、手動でクリックして座標位置を取得⇒範囲選択⇒テキスト文字得取します。
後は定期的に手動でクリックした同じ座標位置にマウス⇒移動⇒クリック⇒範囲選択を繰り返しています。
座標位置は決まっていますのでクリックしない方法で範囲選択できますとマウスを使用する必要がなくなります。
必要がなくなりますとソフトの実行に関係なくマウスを使うことができるるようになるかと思い今回の質問とさせてもらいました。

度々、お世話になり感謝申し上げます。

[ツリー表示へ]
タイトルRe^3: Webページ内の文字取得につきまして
記事No16377
投稿日: 2017/12/19(Tue) 16:17
投稿者魔界の仮面弁士
> IE・Web以外のブラウザー(Google Chrome、Mozilla Firefox、Opera ・・・)でも
> 範囲選択⇒コピー⇒文字の取得できるように(Ctrl+A)(Ctrl+C)のkeybd_event 関数で行っています。
なるほど。


> 最初の始めの一回だけ手動でWebページ内をクリックしてその座標位置を同じ位置で繰り返しクリック操作して行っています。
クリック選択をプログラムから行うとしたら、このあたりでしょうか。

(案1) SendInput API
(案2) mouse_event API
(案3) IUIAutomationSelectionPattern インターフェイスの Select メソッド

ただ、ドラッグ選択となると、COM の UI Automation では対応しきれなさそうなので、
Win32 API での対応が必要かもしれません。
http://tercel-tech.hatenablog.com/entry/2015/04/30/121613


> SendInput APIを使いますとWebページ内をクリック(関数)しないで仮想的(クリックしたのと同じ)⇒範囲選択できるものと考えてよいのでしょうか。
SendInput は、マウスおよびキーボードの操作をエミュレートする API ですね。

マウスポインターが移動するのが都合が悪いのであれば、
GetCursorPos で元の位置を取得しておいてから、クリック完了後に
SetCursorPos なり SendInput なりで元の座標に戻すといった対応で凌ぐとか。


> ブラウザー(IE、Google Chrome、Mozilla Firefox、Opera ・・・)でもWebページ内でも取得できますでしょうか。
目的によっては、Selenium を利用できるかもしれません。

http://www.dn-web64.com/archives/web/vba-selenium/
http://www.atmarkit.co.jp/ait/articles/1408/21/news103.html

[ツリー表示へ]
タイトルRe^4: Webページ内の文字取得につきまして
記事No16378
投稿日: 2017/12/19(Tue) 17:00
投稿者susu
魔界の仮面弁士 様

度重ね返答をして下さいましてありがとうございました。

>(案1) SendInput API
>(案2) mouse_event API
>(案3) IUIAutomationSelectionPattern インターフェイスの Select メソッド

以前より考えての問題でした。対策方法は全く分りませんでした。

案1〜案3は初めてです。情報提供により何を調べて試すれば良いか知る事ができました。

SendInput、GetCursorPos、SetCursorPos 、SendInput

時間はかかると思いますが、挑戦してみます。

貴重な情報を提供してもらい心より感謝申し上げます。

[ツリー表示へ]
タイトルRe^5: Webページ内の文字取得につきまして
記事No16379
投稿日: 2017/12/19(Tue) 18:03
投稿者魔界の仮面弁士
> 案1〜案3は初めてです。情報提供により何を調べて試すれば良いか知る事ができました。
> SendInput、GetCursorPos、SetCursorPos 、SendInput

具体例としてはこのあたり。

http://hanatyan.sakura.ne.jp/vb6/mouse02.htm
http://hanatyan.sakura.ne.jp/vb6/mouse04.htm

[ツリー表示へ]
タイトルRe^6: Webページ内の文字取得につきまして
記事No16380
投稿日: 2017/12/19(Tue) 18:50
投稿者susu
魔界の仮面弁士 様

度重ね返答をして頂きましてありがとうございました。

大変申し訳ありません。
まだ、基本的な事がよく分っていないところがありましたので、ご質問致します。

概要
実際はGetCursorPosで元の位置を取得してマウスポンターを最初にクリックした座標位置に移動し、
クリックしていました。そしてSetCursorPosでマウスポンターを戻していました。

質問
プログラム起動でマウスポンターの移動中およびクリック中にマウスを手動で動かすと重なり影響を受け正常でない時がありました。
マウスポンターを移動しない及びWebページ内をクリックしないで座標位置で範囲選択できますとマウスには全く影響は受け
ないと思われますが、そのようなことは出来ないと考えてよいでしょうか。
mouse_eventでクリックする以上、手動中のマウスに影響を受けなくするのは不可能と考えてよいでしょうか。
もし不可能でしたら従来の方法で手動中マウス移動、クリックしても影響を受けずらい方法に改善したいと思います。

[ツリー表示へ]
タイトルRe^7: Webページ内の文字取得につきまして
記事No16381
投稿日: 2017/12/19(Tue) 20:51
投稿者魔界の仮面弁士
> IE・Web以外のブラウザー(Google Chrome、Mozilla Firefox、Opera ・・・)でも

セキュリティ上の都合で、ほとんどのブラウザーは意図的に、
外部プログラムから制御可能なインターフェイスが設けられていないと聞いています。

なので、ユーザー操作のエミュレーションや UI Automation で凌ぐしか無いでしょう。
(Web データのスクレイピングだけなら、HTTP の通信内容を読み取るという手もありますが)

外部からの制御ではなくブラウザ自体の機能ということであれば、
[F12]キーなどからの開発者用ツールのコンソールから
DOM による範囲選択が可能です。この場合、選択範囲の仕様としては
 (1) W3C Range + Mozilla Selection
 (2) Microsoft TextRange
の 2 種類があります。(それが今回の要件には合うかどうかは別として)

大抵のブラウザは前者をサポートしているはずですが、IE6 は後者しか使えません。
といっても、IE8 未満はそもそも開発者ツールを装備していないのですけれども。


> プログラム起動でマウスポンターの移動中およびクリック中にマウスを手動で動かすと重なり影響を受け正常でない時がありました。
マウス操作だけでなく、キーボード操作(Ctrl + A や Ctrl + C)もあるので、
今の仕様ではいずれにせよ、ユーザー操作による割り込みには弱いですね。

ユーザーがクリップボード操作した場合や、
タッチ操作やペン入力の割り込みもありえるかも。


> mouse_eventでクリックする以上、
mouse_event は 1 回分の指定しか行えないので、
移動からのクリックやドラッグなどといった連続リクエストの場合は、
それらをまとめて送出可能な SendInput の方が良いかもしれません。


> 手動中のマウスに影響を受けなくするのは不可能と考えてよいでしょうか。
クリックを無視させたり、カーソル移動可能範囲を制限することならできるのですが、
エミュレーションの方も制限されてしまうことになるので、あまり意味は無さそうです。
http://hanatyan.sakura.ne.jp/vb6/mouse03.htm


> Webページ内をクリックしないで座標位置で範囲選択できますと
マウス操作無しとなると、UI Automation / MSAA ぐらいかと想像します。
(あとは先述の DOM 操作ぐらい)
https://www.ka-net.org/blog/?p=4628
https://msdn.microsoft.com/en-us/library/windows/desktop/hh707386.aspx


この場合 Chrome では、chrome://accessibility の画面から、
HTML 要素まで辿れるようモード設定する必要があります。

Opera や Firefox は普段使っていないため、
どこまでサポートされているか把握していません。
Firefox はサポートしていそうな印象を持っていますが…実際どうでしょうね。

サポート状況は、Inspectツールで調査できます。
http://www.atmarkit.co.jp/ait/articles/1404/03/news004.html


ただし座標指定という点が中々厄介です。

UIAutomationClient を参照設定して見てみると、
CUIAutomation オブジェクトの ElementFromPoint メソッドでは、
引数が ByVal pt As tagPOINT になっていました。
VB6 は、ユーザー定義型の値渡しを認めていませんので、
このメソッドは VB6 から直接呼び出すことができないはずです。

ElementFromPoint を利用可能な言語を経由するとか、
低レベル COM API で無理矢理呼び出す…という手を考えましたが
難易度が跳ね上がるので、あまり現実的ではなさそうです。
ウィンドウの子孫要素をナビゲートして、各要素の座標を
調査して回ることは出来るかもしれませんが、この場合は
実行効率が問題になりそう。

[ツリー表示へ]
タイトルRe^8: Webページ内の文字取得につきまして
記事No16382
投稿日: 2017/12/19(Tue) 22:11
投稿者susu
魔界の仮面弁士 様

度重ね質問の返答をして頂きまして、ありがとうございました。

各質問の回答をして頂きまして感謝申し上げます。
> IE・Web以外のブラウザー(Google Chrome、Mozilla Firefox、Opera ・・・)でも
> プログラム起動でマウスポンターの移動中およびクリック中にマウスを手動で動かすと重なり影響を受け正常でない時がありました。
> mouse_eventでクリックする以上、
> IE・Web以外のブラウザー(Google Chrome、Mozilla Firefox、Opera ・・・)でも
> プログラム起動でマウスポンターの移動中およびクリック中にマウスを手動で動かすと重なり影響を受け正常でない時がありました。
> Webページ内をクリックしないで座標位置で範囲選択できますと

各質問毎の詳細な解説、特徴、注意点及び該当リンク先は知らない事ばかりでした。
少でも解説等について理解、納得できるように明日からじっくり勉強していきたいと思います。

いつも、お手数をお掛けしまして本当に申し訳ありませんでした。

心より感謝申し上げます。本当にありがとうございました。

[ツリー表示へ]