
あるWEBサービスにログインして、
一覧表示画面を表示した後の処理を自動化できないか模索しています。
その一覧表中に、
「ログ出力」というリンクテキストを上から順番にクリックしていきたいのです。
実際にはクリックすると、自動的に IDがファイル名のcsvファイルが自動ダウンロードされるので、
機械的に次々クリックすればファイル名の重複もなくあとで特定も出来るようになっています。
UWSCでそんな処理できますか?
欲を言えば、
「ログ出力」が20回出てきた後、右下の「次の20件 >>」をクリックすると、
ページが変わるのでまた「ログ出力」を順番に20箇所クリック・・・を次のページが無くなるまで繰り返したいです。
(何ページあるか分からないので手動でも構わないのですが)
アドバイス頂ければ幸いです。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ご質問者が投稿されたスクリプトをみると「記録モード」で記録したものを利用して作成されているようです。
もちろんそのような方法もありますが、低レベル関数はできるだけ避けたほうが良いと思います。
インターネットに接続している場合、「予期しないポップアップが出る」などということはよくあることです。低レベル関数だと、「起動している当該アプリにそのコマンドを適用したい」といった細かい設定は困難です。単純に「キーボードのキーを送出する」といった動きになってしまいます。
その結果「予期しないポップアップにコマンドを送る」などということになりかねないからです。
前回のサンプルに続き、EXCELにIEの画面テキストを貼り付けるサンプルを作成してみました。
EXCELを起動し、最小化してタスクトレイに入れた状態にしてから、UWSCを起動してください。
このサンプルの動作は、
①「教えて!goo」の「コンピュータ・テクノロジー」のカテゴリの質問一覧ページにIEでアクセスし、CTRL+AおよびCTRL+Cでテキストを取得
②EXCEL画面を表示し、シートを追加して、テキストを貼り付け
③IEに戻り「次の結果→」をクリック、①に戻り「次の結果→」がなくなったら終了
という動きをするものです。
従って
(1)URLを「あるWEBサービス」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)EXCELを起動し、最小化してタスクトレイに入れた状態からスタート
とすれば、ご希望の動作になるのではないかと思いますが、EXCELとIEを組み合わせるならUWSCではなく、VBAで記述したほうがよいような気もします。
なお、
>リンクがなくなったテキストのみの「次の20件 >>」になったら終了する
>のが理想です
一応対応したつもりですが、実際動かしてみないとわかりません。
IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
SLEEP(0.2)
IE2EXCEL()
flag0 = 1
While true
IF flag0 = 0 Then Break
KeyWordClick(IE,"次の結果→",Flag0)
Wend
MsgBox ("終了しました")
Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend
Procedure KeyWordClick(IE, KeyWord,Var Flag)
flag = 0
a_tag = IE.Document.getElementsByTagName("a")
For i=0 to GETOLEITEM(a_tag)-1
COM_ERR_IGN
If ALL_OLE_ITEM[i].innerText = KeyWord Then
flag = 1
ALL_OLE_ITEM[i].Click()
BALLOON("次ページへのリンクを見つけました。遷移します。")
BusyWait (IE)
BALLOON()
IE2EXCEL()
BREAK
EndIf
COM_ERR_RET
Next
Fend
procedure IE2EXCEL()
While true
ID0=GETID(" - Internet Explorer")
if id0>0 then break
SLEEP(0.2)
Wend
SLEEP(0.2)
CTRLWIN(ID0,MAX)
CTRLWIN(ID0,ACTIVATE)
SLEEP(0.2)
MOUSEORG(ID0)
BTN(LEFT,CLICK,84,15,300) //IEのウィンドウの上部枠をクリック(実際の画面にあわせてクリック位置を調整する)
SLEEP(0.2)
SENDSTR(0,"")
While true
IF GETSTR(0)<>"" then break
SCKEY(ID0,VK_CTRL,A,C)
SLEEP(0.2)
WEND
While true
ID1=GETID("- Excel")
if id1>0 then break
SLEEP(0.2)
Wend
SLEEP(0.2)
CTRLWIN(ID1,MAX)
CTRLWIN(ID1,ACTIVATE)
SCKEY(ID1,VK_SHIFT,VK_F11)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,VK_HOME)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,V)
SLEEP(0.3)
Fend
EXCELに貼り付けするのではなく、HTMLをそのまま保存する方法もありますが、当該ページのリンクの記述方法によっては取得したHTMLが正しく機能しない場合もあります。以下はC:\ログ出力というフォルダを作成しておけば、そのフォルダに上記のEXCELに貼り付ける内容をそのままページ毎にHTMLで、LOG1,html、LOG2.html・・・というように保存するスクリプトです。
(1)URLを「あるWEBサービス」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)「C:\ログ出力\」の部分を実際に保存するフォルダ名に変更する
を実施してご利用ください。
No = 0
IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
SLEEP(0.2)
No=No+1
save_html(IE,No)
flag0 = 1
While true
IF flag0 = 0 Then Break
KeyWordClick(IE,"次の結果→",Flag0,No)
Wend
MsgBox ("終了しました")
Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend
Procedure KeyWordClick(IE, KeyWord,Var Flag,var No)
flag = 0
a_tag = IE.Document.getElementsByTagName("a")
For i=0 to GETOLEITEM(a_tag)-1
COM_ERR_IGN
If ALL_OLE_ITEM[i].innerText = KeyWord Then
flag = 1
ALL_OLE_ITEM[i].Click()
BALLOON("次ページへのリンクを見つけました。遷移します。")
BusyWait (IE)
BALLOON()
No=No+1
save_html(IE,No)
BREAK
EndIf
COM_ERR_RET
Next
Fend
Procedure save_html(IE,No)
BaLLOON("LOG"+No+".htmlを保存中です。")
body = IEGetSrc(IE, "BODY")
body= replace(body,'//','https://')
body= replace(body,'https:https://','https://')
f_Name ="Log"+No+".html"
fid0=fopen("c:\ログ出力\"+F_Name,F_WRITE8)
FPUT(fid0,body,F_ALLTEXT)
FCLOSE(fid0)
BaLLOON()
fend
この投稿サイトでは「"」が変換されてしまうので、「'」で記述してあります。上記スクリプトの「'」は全て「"」に置換してからご利用ください。
保存されたHTMLを開いたらが文字化けする場合は「エンコード」を「UTF-8」にしてくださいい。
No.1
- 回答日時:
UWSCのサンプルを作成してみました。
このサンプルは①「教えて!goo」の「コンピュータ・テクノロジー」のカテゴリの質問一覧ページにIEでアクセスし、
②「プログラミング」という文字列を含むリンクをクリックして、
③何らかの処理を行う
④さらに②と③を繰り返し「プログラミング」というリンクがなくなったら「次の結果→」をクリックし、
⑤さらに②③④を繰り返し、「次の結果→」がなくなったら終了
という動きをするものです。
ご質問者のいう「あるWEBサービス」のHTMLソースが不明ですので何ともいえませんが、ダウンロード処理は「単なるリンク」ではない気もしますし、クリックすれば、保存するか開くかといったダイアログも表示される気がします。それらの処理はご質問者が自作する前提ですが、
(1)URLを「あるWEBサービス」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)「プログラミング」を「ログ出力」に、その行のfalseをtrueに書き換える。
(4)「ここから」「ここまで」の行を自作のダウンロード用の処理に書き換える
を実施すれば、一応ご希望の処理は可能だと思われます。
なお、動作をチェックするなら、「ログ出力①」「ログ出力②」の行をコメントアウトすれば、一覧画面が次々に表示される状態を再現できます。
IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
Log_Output (IE) //ログ出力①
KeyWordClick(IE,"次の結果→")
MsgBox ("終了しました")
Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend
Procedure KeyWordClick(IE, KeyWord)
flag = 0
While True
If flag = 1 Then break
If IELINK(IE, KeyWord, 1, True) Then
BusyWait (IE)
BALLOON("次ページへ遷移しました。続行します。")
Sleep(2)
BALLOON()
Log_Output (IE) //ログ出力②
Else
flag = 1
EndIf
Wend
Fend
Procedure Log_Output(IE)
flag = 0
cnt = 0
While True
If flag = 1 Then break
cnt = cnt + 1
BALLOON("処理中です")
Sleep(2)
BALLOON()
IF IELINK( IE,"プログラミング",cnt,false) then
BusyWait (IE)
BALLOON("ここでDownLoad処理") //ここから
Sleep(2)
BALLOON() //ここまで
Else
flag = 1
EndIf
Wend
Fend
こんなに早く作っていただいてありがとうございます!
内容を確認・考察していたためお礼が遅くなりました。すみません。
頂いたソースでテストしたら、ちゃんと動作しました。
しかし実際にテストしてみて問題点が分かりました。
・「ログ出力」をクリックした後、別の画面が遷移する場合が多く、この手順だと駄目だという事が分かりました。
・「次の20件 >>」でページが変わっていくと最終的に無くなるのではなく、リンクの外れた「次の20件 >>」が表示されることが分かりました。
それで方針を変える事にしました。
・WEBページをめくりながらExcelにテキスト貼り付けするだけで良しとする事にします。
・貼り付けた表にIDがあり、ダウンロードしたファイル名と紐づけられるのでダウンロードは後で手動で必要なファイルのみ行います。
細かい問題点などがあります。
詳細が長くなるため補足に書かせていただきます。
長くなって申し訳ありませんが、可能な限りアドバイス頂けると嬉しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(クラウドサービス・オンラインストレージ) firestorage_androidスマホでダウンロードできない 1 2022/10/25 08:18
- HTML・CSS トリミングで表示した画像をクリックで元どおりにしたい 3 2022/12/16 18:49
- Windows 8 動画の再生とタイトルの変更方法を教えてください。 3 2022/08/01 14:51
- 画像編集・動画編集・音楽編集 musescore3.5 で再生時、ページスクロールしない 1 2022/11/07 19:29
- Chrome(クローム) 入力フォームの履歴を消したい 2 2023/06/29 13:02
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- その他(IT・Webサービス) 毎回ログインがめんどい 11 2023/07/17 15:31
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- オープンソース AWSドメイン名でApacheテスト・ページを表示させる方法を教えて下さい。 1 2023/04/26 15:59
このQ&Aを見た人はこんなQ&Aも見ています
-
【UWSC】WEBページ内コピーしたものをExcelで値で貼り付けするには?
その他(プログラミング・Web制作)
-
UWSCで特定のChromeのタブをアクティブにする方法
その他(プログラミング・Web制作)
-
UWSCで特定の文字をクリックする方法
その他(プログラミング・Web制作)
-
-
4
【UWSC】HTML内のある部分を抽出したいのですが・・・
その他(プログラミング・Web制作)
-
5
UWSCでオンクリックのボタンを押したい
その他(プログラミング・Web制作)
-
6
UWSC 非アクティブウィンドウへのキー入力
その他(ソフトウェア)
-
7
UWSCについて
その他(プログラミング・Web制作)
-
8
(UWSC)エクセルのセルの値を読み込むには?
その他(プログラミング・Web制作)
-
9
UWSCの終了の仕方
その他(プログラミング・Web制作)
-
10
uwsc webページ内のテキストボックス
その他(プログラミング・Web制作)
-
11
UWSCのIE操作でプルダウンを選択する方法
その他(プログラミング・Web制作)
-
12
UWSCを使用して、ドロップダウンリストを操作
フリーソフト
-
13
UWSCの待機コマンドについて
その他(ソフトウェア)
-
14
UWSCで指定のフォルダを開きたい。
その他(ソフトウェア)
-
15
UWSCでhtmlソースの文字列を取得したいです
その他(プログラミング・Web制作)
-
16
【UWSC】エクセルのセルの値をブラウザに貼り付ける操作。セルの値の判別方法について。
その他(プログラミング・Web制作)
-
17
UWSCに詳しい方簡単なテキスト入力方法を教えてください
その他(プログラミング・Web制作)
-
18
(UWSC) 「#32770」の意味わかりますか?
その他(プログラミング・Web制作)
-
19
UWSCで値のみコピーするには?
Visual Basic(VBA)
-
20
UWSCで変数をキー入力
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
TV出力ポートをOFFにすれば良い...
-
cout と cerrの違い
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
Accessのテーブルからcsv出力す...
-
Windows Formアプリからコンソ...
-
【UWSC】WEBページ中の特定文字...
-
ACCESS クエリ→フォーム...
-
coutで出力した文字を消去する...
-
C#でアクセス権限の取得方法が...
-
VBAで出力したCSVファイルの先...
-
VBAでテキスト出力時のスペース...
-
エクセルで英字と数字を組み合...
-
ListViewの複数選択について
-
【VBA】PDFを2in1で出力したいです
-
VBA レジストリの値の読み方に...
-
クリスタルレポートで印刷時に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
MMDでavi出力が出来ない
-
コンセントの電力は入力と出力...
-
Windows Formアプリからコンソ...
-
Accessのテーブルからcsv出力す...
-
プログラムについての質問です...
-
VBAのExecメソッドで画面を非表...
-
cout と cerrの違い
-
アクセスでエクセルに出力する...
-
COBOLのMOVEで桁数が異なる場合
-
C# 標準出力のencodingをutf8に...
-
CRC16計算について
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
TV出力ポートをOFFにすれば良い...
-
C#でアクセス権限の取得方法が...
-
【UWSC】WEBページ中の特定文字...
-
KEYENCEのシーケンスプログラム...
-
【ExcelVBA】最終行の取得で困...
-
ListViewの複数選択について
おすすめ情報
それで方針を変える事にしました。
・WEB全ページ全体をコピーしてExcelに値で貼り付け
これをWEBページをめくり、ExcelでShift+F11で新規シート作って貼付けを繰り返します。
・貼り付けた表にIDがあり、ダウンロードしたファイル名と紐づけられるのでダウンロードは後で手動で必要なファイルのみ行います。
・「あるWEBサービス」は事前に開いておきAlt+Tabでウィンドウ切替のみにします。
例えばこんな感じです。※もっと上手な方法があったらご教授ください。
KBD(VK_ALT,DOWN)
KBD(VK_TAB,CLICK,100)
ACW(GETID("タスクの切り替え","MultitaskingViewFrame"),0,0,1920,1040,0)
KBD(VK_ALT,UP,100)
ACW(GETID("WEBCAS e-mail - Internet Explorer","IEFrame"),0,0,1920,1040,0)
・IEに切り替えたら、Ctrl+A→Ctrl+Cで全選択コピー
例えばこんな感じです。※もっと上手な方法があったらご教授ください。
KBD(VK_CTRL,DOWN,1360)
KBD(VK_A,CLICK,203)
KBD(VK_C,CLICK,469)
KBD(VK_CTRL,UP,16)
・Excelに切り替えてセルA1の場所で右クリック→値で貼り付け
例えばこんな感じです。※もっと上手な方法があったらご教授ください。
KBD(VK_ALT,DOWN)
KBD(VK_TAB,CLICK,100)
ACW(GETID("タスクの切り替え","MultitaskingViewFrame"),0,0,1920,1040,0)
KBD(VK_ALT,UP,32)
ACW(GETID("テスト.xlsx - Excel","XLMAIN"),-8,-8,1936,1056,0)
BTN(RIGHT,CLICK,64,250,297)
BTN(LEFT,CLICK,141,346,94)
・Shift+F11 で新規シート作成
例えばこんな感じです。※もっと上手な方法があったらご教授ください。
KBD(VK_SHIFT,DOWN,1250)
KBD(VK_F11,CLICK,453)
KBD(VK_SHIFT,UP,93)
分からないのは、
IEページ右下にある「次の20件 >>」リンクをクリックする方法です。
リンクがなくなったテキストのみの「次の20件 >>」になったら終了するのが理想ですが、
単に FOR文で100回繰り返すだけでも仕方ないと思っています。
長くなりましたが以上です。