UiPathで、ファイルをまとめてダウンロード


UiPathでファイルをまとめてダウンロード




とある知り合いが、悩んでいました。

その悩みとは。。。

いま契約している有償サイトが閉鎖することになった。
そのサイトは、業界向けのドキュメントのアーカイブで、ドキュメントはPDF形式で自由にダウンロードできたが、サイトが閉鎖されると参照できなくなるで困る。

そこで、

とりあえず、片っ端からダウンロードしたいが、ドキュメントの数が膨大で人間業でやるのは大変。
バイトにやらせるのもねぇ。。。

との内容。
そこで、ワタシは、
「なあんだ、そんなのRPAにやらせればいいじゃん。」

「え? でも金ないぞ。」

このブログのネタにさせてもらう!
ってコトで、格安で引き受けました。
(それでもイメージとかアップできないので。。。)

てな感じで始まりました。

ポイントは

・とにかく自動でダウンロードしたい
使うのは今回だけなので金はかけたくない
 → 本格的な開発はム~リ~

サイトの方はどうなっているかと言えば
・要求は暗号化されている
・条件指定で検索、1ページ20件まで表示
・結果は表形式(テーブル)表示される
・表中のリンクをクリックするとダウンロードページが表示される

最初は、自動で検索とかも考えていましたが、金はかけたくない』とのことなので、”半自動”と言うことで了解してもらいました。

半自動ダウンロードの仕様

・『金はかけたくない』とのことなので、検索は人が行う
 使っているブラウザは、Chromeなのでソレに固定。
1年分とかをまとめて検索、時系列に古い順にソート、は人にやってもらいます。
 すでに検索済みのページに対してダウンロードを行うとする。
 検索結果のページは、下記のようになる。
  検索結果は、テーブルにサマリーとリンクとして表示される。
  そのリンクをクリックするとダウンロードページに遷移する。

・『金はかけたくない』とのことなので、”力技”実装
 ページは同じフォーマットなので、キホン”タブ”+”Enter”で操作できる。
 テーブルの前に、いくつかのリンクがあるので、ソコを”タブ”で飛ばす。
 テーブル内のリンクまでたどり着いたら”Enter”でダウンロードページ遷移。
  テーブルのリンクまでの”タブ”の数は決まっている。
  次の検索結果リンクは、”タブ”を1つづつ増やせばよい。

 ダウンロードページでは、
  "ダウンロード"のボタンをクリック。
  ”Alt”+”←”の入力で戻る

 以上を20件繰り返し、
 最後まで行ったら、”次のページ”をクリック

 入力は、"TypeInfo"で入力
  ただし、高速化のためStringでまとめで入力しています。
 クリックは、"ClickImage"でボタンイメージを指定

『金はかけたくない』とのことなので。。。やっつけ的な対応

テーブル要素を指定して操作することもできますが、”タブ”操作で対応。
人間ならめんどくさい”タブ”+”Enter”だって、RPAは文句言いませんから。
その上、ページ応答はちゃんとWait処理せず、3秒待って次の処理で対応。
最後のページは20件のドキュメントがなく、端数になりますがソコは人が対応してください!
あまり多くのページをまとめてダウンロードすると問題が発生する(後述)場合があるので、ある程度細切れで対応した方がよいが、StartとMaxの変数名に自分で数値を設定して対応してくれ

それでも実際に実行してみると。。。

・サイトが応答しなくなる
・ダウンロードに失敗する
  ことがある。。。
などナド、サーバー側に起因するような問題がたまに発生します。

かなりクセモノなサイトです。
応答がなくなった場合、途中で止まったりしているのでわかります。
ただし、このときRPAが爆走するので、他のプログラムを止めておいて、プリンタとかも切断しておいたほうが安全です。

厄介なのが、ダウンロードは始まるものの、途中で失敗するケース。
仕方がないので後からオマケで付けた機能ですが、
ダウンロードの失敗があとから見てわかりやすいように、
ページのダウンロード完了でダミーファイルを作成、
後から時刻でファイルをソートしで、
ダミーファイル間に20件のPDFファイルがない場合は、失敗と判断できるようにしました。

つまり20件ごとにダミーファイルが発生するので、その間に20件のドキュメントが無ければ失敗しているので、どれが失敗しているのかは自分で確認して手動で対応してくれ、と、言うことにしました。

ヤレヤレ

UiPathのプログラミング内容

  1. System.Activities.Statements.Sequence // 全体をシーケンスで作成
  2. {
  3.  
  4. UiPath.Core.Activities.WindowScope // 検索結果のブラウザ(Chrome)にアタッチ
  5. {
  6.  
  7. System.Activities.Statements.While // ページ数分のループ
  8. Condition: 処理済みページ数 <= ページ数
  9. Body:
  10. {
  11. System.Activities.Statements.Sequence // ページ毎の処理
  12. {
  13.  
  14. System.Actuvities.Statements.Assign
  15. テーブルカウント = 1 // テーブル処理数
  16. System.Activities.Statements.While // 1ページ20件まで処理
  17. Condition: テーブルカウント <= 20
  18. Body:
  19. {
  20.  
  21. System.Activities.Statements.Sequence // 1件のダウンロード処理
  22. {
  23.  
  24. UiPath.Core.Activities.TypeInfo // 頭のいくつかのリンクをスキップ
  25. "[k(tab)][k(tab)][k(tab)][k(tab)][k(tab)][k(tab)][k(tab)]"
  26.  
  27. System.Actuvities.Statements.Assign
  28. タブカウント = 0
  29.  
  30. System.Actuvities.Statements.Assign
  31. テーブル選択文字列 = ""
  32.  
  33. System.Activities.Statements.While // テーブルの処理レコード数の"タブ"を加算
  34. Condition: ダウンロード数 <= 20
  35. Body:
  36. {
  37. System.Activities.Statements.Sequence // タブのダウンロード処理
  38. {
  39. System.Actuvities.Statements.Assign
  40. タブカウント < テーブルカウント
  41.  
  42. System.Actuvities.Statements.Assign
  43. テーブル選択文字列 = テーブル選択文字列 + "[k(tab)]"
  44.  
  45. System.Actuvities.Statements.Assign
  46. タブカウント = タブカウント + 1
  47. }
  48. }
  49. System.Actuvities.Statements.Assign
  50. テーブル選択文字列 = テーブル選択文字列 + "[k(enter)]"
  51.  
  52. UiPath.Core.Activities.TypeInfo
  53. テーブル選択文字列
  54.  
  55. System.Actuvities.Statements.Delay
  56. 3秒待つ // 3秒待ってる間に切り替わるハズ
  57.  
  58. UiPath.Core.Activities.ClickImage
  59. "ダウンロード"ボタン // ダウンロードボタンをクリック
  60.  
  61. System.Actuvities.Statements.Delay
  62. 3秒待つ // 3秒待ってる間にダウンロードが始まるハズ
  63.  
  64. UiPath.Core.Activities.SendHotKey
  65. "Alt"+"←" // 前ページに戻る
  66.  
  67. System.Actuvities.Statements.Delay
  68. 3秒待つ // 3秒待ってる間に切り替わるハズ
  69.  
  70. System.Actuvities.Statements.Assign
  71. テーブルカウント = テーブルカウント + 1
  72. }
  73. }
  74. }
  75.  
  76. // 1ページ、20件のダウンロードが終わった
  77. UiPath.Core.Activities.ClickImage
  78. "次のページ"ボタン // 次のページボタンをクリック
  79.  
  80. System.Actuvities.Statements.Assign
  81. ダミーファイル名 = XXX + 処理済みページ数
  82.  
  83. UiPath.Core.Activities.CreateFile
  84. ダミーファイル名で作成
  85.  
  86. System.Actuvities.Statements.Delay
  87. 1秒待つ // 1秒くらい待たないとよくないみたいだ
  88.  
  89. System.Actuvities.Statements.Assign
  90. 処理済みページ数 = 処理済みページ数 + 1
  91. }
  92. }
  93. }

※ "{}"は、入れ子を示しやすくするためのものです。



もう一つ、我々は当たり前と思っていたことでしたが。。。
RPAを実行している間はパソコンが使えない!

「えー! そーなのー!!」

飯食ってる間とか、出かけている時とか、帰るときに実行してくれ、
と、言うことで対応してもらいました。
なかなか小規模な方など、PCが1台しかないなんてケースは要注意ですね。

思い込みは、システム屋の地雷である。
久々に感じました。





Have a Happy Hucking!!

Lightning Brains

コメント

このブログの人気の投稿

Linuxシステムコール、メッセージキューの使い方

Linuxシステムコール、共有メモリの使い方

Linuxシステムコール、セマフォの使い方