UiPathで地道に画像スクレイピング(bing編)

## 概要
UiPathには「データスクレイピング」という機能が搭載されていますが、
今回はこの機能を使わずに、地道なやり方で画像のスクレイピングを実装してみました。

入力ウィンドウからキーワードを入力すると、bing画像検索から検索結果の画像を集めてきてくれます。

![キャプチャ20060302.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/85b560f8-118a-0849-ea67-4029bddf4bc3.png)


## 1.キーワードの受け取り ～ ブラウザから画像検索
#### 入力ダイアログからキーワードを受け取ってディレクトリを作る
![キャプチャ20060406.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/e1240107-bf39-f646-41cd-215b75720d72.png)

[入力ダイアログ]アクティビティでキーワードを変数に格納します。
[ディレクトリを作成]アクティビティでパスを **"[デスクトップのパス]\" + 変数** と指定し、デスクトップにキーワードの名称のディレクトリが作成されるようにします。

#### 画像のURL格納用のリストを作る
リストを使うときは変数を作成するだけではなく、宣言が必要です。
[代入]アクティビティを設置して、

 **右辺値(Value) に New List(Of String)**
 **左辺値(To)に[リストの名前]**

を入れます。まぁ呪文だと思って書いておきましょう。

#### ブラウザ起動→検索→1番目の画像をクリック
![キャプチャ20060409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/1cd86d94-1b83-bb88-e04b-035043e2898d.jpeg)

- bing画像検索をChromeで開きます。
(※検索エンジンとブラウザの組み合わせはいろいろ試してみましたが、今のところbing×Chrome以外はうまくいっていません)

- 誤操作を防ぐためブラウザのウィンドウは最大化しておきましょう。
- 検索ウィンドウにキーワードを入力して検索ボタンを押し、検索結果画面が表示されたら1番目の画像をクリックします。

![キャプチャ20060407.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/86cce1b0-9425-06b7-48f0-e3dac12a9fe0.png)
1番目の画像のセレクターを[要素を選択]で画面上をクリックして選択すると、"parentid"と"src"という属性が編集可能になっています。
このうち"src"はチェックを外し、セレクターから除外します。
srcはこの画像固有のアドレスなので、セレクターに適さないためです。
(それにしてもなぜ最初の画像が"mmComponent_images_2"なんでしょうか？ちょっと前までは"mmComponent_images_1"だったと思うのですが…)

## 2.画像のURLを収集する繰り返し処理
画像のURLをさきほど作ったリストに集める繰り返し処理です。
![繰り返し (前判定).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/acf3fc75-e8c5-07ee-cec0-d4272ea248cc.jpeg)

- 繰り返し処理用のカウンターはとりあえず30に設定しておきます。
(後で説明しますが、30枚の画像が集まるわけではありません。実際にフォルダに格納される画像は30枚より少なくなります)

- [属性を取得]アクティビティでは、URLが入っている属性"src"を指定、
[要素を選択]でブラウザ上の対象の画像を選択します。セレクターは編集しなくても大丈夫です。

- URLをいったんString型の変数に格納してから、[コレクションに追加]アクティビティでリストに追加。

- →キーを押して次の画像に遷移し、カウントアップして次の繰り返しをやります。

※[待機]アクティビティをいくつも挟んでいるのは、このロボットはもともとデモ用に作成したため、動作をゆっくり見せたかったからです。真似しなくていいですよ。

#### 動作確認
ここまで作ったら、上記繰り返し処理の終了後にブレークポイントを置いて
リストにURLが格納されているか確認してみましょう。
ブレークポイントは、アクティビティを右クリック→[ブレークポイントを切り替え]で設定できます。
![キャプチャ20060412.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/476fd909-8bc0-5308-e4d8-1112f25d7b0c.png)


ブレークポイントで止まったら、ローカルウィンドウからURL格納用のリスト"URLList"を選択。
![キャプチャ20060410.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/43557047-5ae3-3f30-92e9-bc3d02d0e27b.png)

中身をメモ帳にコピペしてみると、
![キャプチャ20060411.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/dc7eeab5-52eb-313b-5c72-28575c880da6.png)

URLがいっぱい入っていることが分かります。よさそうです。

## 3.収集したURLにHTTP要求をして、画像ファイルを保存先フォルダに格納する繰り返し処理

- [繰り返し(コレクションの各要素)]アクティビティを設置し、
要素は**"item"**、コレクションは先ほどの**"URLList"**を指定します。

#### HTTP要求
![本体.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/1ea904e9-3db3-0f8d-ec26-86ae59661db1.jpeg)

- [HTTP要求]アクティビティは検索しても最初は出てこないので、[利用可能なパッケージを検索]からUiPath.WebAPI.Activitiesをダウンロードしましょう。

- プロパティは以下のように設定します。このほかはデフォルトのままでいいです。
   - リソースパス :
   "[デスクトップのパス]\" + [キーワードを入れる変数] + "\" + Path.GetFileName(item)
   - エンドポイント : item
   - エラー発生時に実行を継続 : True

- HTTP要求が失敗しても処理が止まってほしくない(次の画像をダウンロードしてほしい)ので、トライキャッチで囲みます。
- HTTP要求に失敗したら、その画像は諦めることにします。Catchesには[繰り返しをコンティニュー]を置いて、次の繰り返しに進んでいきます。
- HTTP要求の成功率は6割~7割くらいです。カウンタを30に設定すると20枚前後の画像がスクレイピングできることになります。URLが長すぎるとか、画像ファイル以外の形式だとかでHTTP要求が失敗しているようです。

## 補足

UiPathのリボンタグの[データスクレイピング]で画像検索をスクレイピングしようとするとこんな風になります。多分このURLってサムネイルのURLですよね。
![キャプチャ20060414.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646975/924e79ac-4821-a524-3d91-cc548dd0fd5a.png)

ここで詰まってしまう人も多いと思いますが、
他の方法でもスクレイピングできるよ！というご紹介でした。