tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル無限スクロールのwebページ全体把握
記事No12029
投稿日: 2020/05/25(Mon) 10:03
投稿者こんどう
質問内容が直接VB.NETと関係ないかもしれませんが、調べてもわからないのと、後ろの処理をVB.NETで実現するために聞いてます。宜しくお願い致します。
webページで無限スクロールのタイプがありますが、そのページの全体から、必要データをとり出して処理したいのですが、全体を表示させて、ファイル保存しようとしています。

そこで、まず全体を表示させないと、ファイル保存できないので、
【page down】【カーソル下】のキーをずっと押してる必要があります。一番したのページに早く到達する方法はありますか?ショートカットキーとか。VB.NETで出来るならばもちろんその方法が一番です。

1)全体を保存するにはどうすればいいですか?
2)一番したのページを表示させるにはどうすればいいですか?
 (1)が出来なければ)

注)無限スクロールと書きましたが、処理しようとしているページは下があります。キーを押していれば5分程度です。
宜しく御願いします。

[ツリー表示へ]
タイトルRe: 無限スクロールのwebページ全体把握
記事No12030
投稿日: 2020/05/25(Mon) 10:34
投稿者こんどう
追加です。
ctrl+End キーでも、最下ページにはなりません。
読み込んでいるみたいです。

[ツリー表示へ]
タイトルRe: 無限スクロールのwebページ全体把握
記事No12031
投稿日: 2020/05/25(Mon) 10:41
投稿者魔界の仮面弁士
>後ろの処理をVB.NETで実現するために聞いてます。

ブラウザーは限定されていますか?
Chrome や Edge 等が使用されるのか、それとも
IE を使うのか(WebBrowser コントロールや InternetExplorer オブジェクトなど)


> 一番したのページに早く到達する方法はありますか?ショートカットキーとか。
> VB.NETで出来るならばもちろんその方法が一番です。

キーボードショートカットなら、[Ctrl]+[End] で最後には到達します。
VB.NET の System.Windows.Forms.HtmlWindow なら ScrollTo メソッド
JavaScript からなら、window.scroll メソッドなどを使えます。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.htmlwindow.scrollto
https://techacademy.jp/magazine/22793

とはいえ、無限スクロールなページでは、末尾到達時に
追加ロードで続きが生成されることが往々にしてあるので、
何をもって「最後」と判断されるかは、正直、Web サイトによってまちまちです。
そのため、End や scrollTo などを一回呼び出しただけでは、終端にたどり着けず、
追加ロードが終わった時点で、再度、同じ処理を繰り返し呼び出す必要があるでしょう。

ゆえに、どのようなローディング処理が背後で行われているかを解析して判断するか、
あるいは一定時間待機してみて、コンテンツの論理高さが変化しなくなった時点で
ドキュメント末尾に到達した…と判断する方法などが思いつきます。


RPA ツールによっては、ページ末尾かどうかの判定のために
画像判定を採用することがあるようですね。( WinActor など)
https://winactor.biz/samplescenario/2019/12/13_1523.html



厄介なのは、仮想スクロールを利用しているコンテンツの場合です。

このタイプは、スクロール領域の高さをあらかじめ固定で定めておき、
実際にその場所にスクロールが行われた時点で、その場所にコンテンツを
遅延ロードするようなものを指します。
Ctrl+End 一発で最終行に到達はしますが、途中の部分は歯抜けになるので、
このタイプでは、PageDown を繰り返す方法を採用する必要があります。


まぁ要するに、Web ページの構成によって最適な手法が異なるという事です。

[ツリー表示へ]
タイトルRe^2: 無限スクロールのwebページ全体把握
記事No12032
投稿日: 2020/05/25(Mon) 12:02
投稿者こんどう
魔界の仮面弁士さんご回答大変有り難う御座います。
保存するファイルの形態の関係で、fairefoxを使用します。
CTRL+endでは、最後にたどり着けません。まだ読み込んでる感じです。
ページ最後は、特にわかる情報は表示されません。画像も無し。
単にスクロールしなくなるのでわかると言うだけです。

教えてくれた様に、ファイル保存してみて、
スクロールしてそのファイル内容が変わるかを判断するしかないか?
と思いました。

JavaScript全くわかりませんが。

hhttps://techacademy.jp/magazine/22793
この記事実行の仕方が分かりませんが。

下の事を、test.JS ファイルとかに書き込んで、
希望のサイトを表示させた状態で、
Firefoxから、下のスクリプトを起動させる
とか言う方法で実行するのでしょうか?
全くわからずの、想像なのですが。


<html lang="ja">
<head>
<meta charset=”utf-8″>
<title>ページ最下部へ移動する</title>
<script>
function test(){
var elementHtml = document.documentElement;
var bottom = elementHtml.scrollHeight - elementHtml.clientHeight;
window.scroll(0, bottom);
}
</script>
</head>
<body>
<input type="button" onclick="test();" value="最下部へ移動するボタン">
<div style="height:1234px;">ページ</div>
<p>最下部へ移動しました。</p>
</body>
</html>

[ツリー表示へ]
タイトルRe^3: 無限スクロールのwebページ全体把握
記事No12033
投稿日: 2020/05/25(Mon) 16:01
投稿者魔界の仮面弁士
> fairefoxを使用します。
『Firefox』ですかね。手元に用意が無いので試せませんが…。

VB から AxMozillaBrowser を使っているのか、
VB から Firefox を操作しようとしているのか、
それとも Firefox の操作は手動で、保存後の解析を VB で行おうとしているのかはさておき。


> CTRL+endでは、最後にたどり着けません。まだ読み込んでる感じです。
読み込み終わって、ページが追加されたら、
もう一度 CTRL+END しなおす必要があると思います。
自動化する場合は、何をもって「最後まで読み込まれたか」を定義する必要がありますね。


> 単にスクロールしなくなるのでわかると言うだけです。
ローディングが一定時間発生しなくなったら…ですかね。
広告等が定期的にローディングされるようなサイトだと、通信先の判定も必要になるかもしれませんが。


> JavaScript全くわかりませんが。
HTML DOM の操作が行えれば、言語は何でも良いですよ。
JavaScript はそのための有力な選択肢の一つですね。


> この記事実行の仕方が分かりませんが。

VB から呼び出す前に、一時的にテストするだけなら、
ブラウザーの開発ツールを起動して、コンソールから
scoll メソッドや scrollTop を操作するコードを実行すれば OK です。
https://developer.mozilla.org/ja/docs/Tools

手動でもっと簡単に呼び出せるようにするなら、「ブックマークレット」にしておくのが良いでしょう。


ページ全体のスクロールの場合は、window オブジェクトの
scrollBy メソッドもしくは scrollTo (あるいは scroll) メソッドのいずれかを用います。
https://developer.mozilla.org/ja/docs/Web/API/Window/scrollBy
https://developer.mozilla.org/ja/docs/Web/API/Window/scrollTo

scrollBy は「指定された量だけ、現在の位置からスクロールさせる」ためのものです。
scrollTo と scroll は同じ意味で、「特定の座標までスクロールさせる」ためのものです。


ページ全体ではなく、ページの一部のみがスクロールするような Web ページの場合、
親コンテナとなるボックス要素に対して、scrollTop プロパティを書き換えるようにします。
https://syncer.jp/Web/API_Interface/Reference/IDL/Element/scrollTop/

たとえば、ページの一部だけスクロールするサンプルとして
https://demo.syncer.jp/1403/
がありますが、これを例とすると、ブラウザーの開発ツールから、
コンソール(Chrome や IE でも構わない)上で下記を実行すれば OK です。

document.getElementById("hoge").scrollTop = 0;  // 一番上が表示された状態
document.getElementById("hoge").scrollLeft = 0;  // 一番左まで表示された状態
document.getElementById("hoge").scrollTop = 100000000;  // 目一杯下までスクロールした状態
document.getElementById("hoge").scrollLeft = 120;  // 右方向に120pxスクロール


ページ全体がスクロールするようなサイト、たとえ Facebook などでは、
window.scrollBy(0, 100000000);
を呼び出します。※指定可能な上限値はブラウザーによって異なります。


いずれの場合も、即座に次のコンテンツがロードされるので、
この処理を繰り返し呼び出す必要があるでしょう。

自動操作で繰り返す際には、終端の無いサイト構成の場合に備えて、
処理回数あるいは処理時間に制限を持たせておくと良いかもしれません。


また、上記以外の選択肢としては、UI Automation を用いてスクロール操作を
行う方法が思い当たりますが、手元に Firefox が無いため、実際に可能か否かは未検証です。

[ツリー表示へ]