さて、データスクレイピングです。
Python等のプログラミング言語で無く、ノンコーディングで出来るということで、RPAの目玉になっているような気配もあります。
確かに簡単にできるときのデータスクレイピングはあっという間です。
自動記録でデータスクレイピング(ウィザード)を使うだけで、データテーブルが出来て、
そのまま、WriteCsvとかで出力できちゃいます。
その後、データテーブル名等を綺麗に変更すれば良いですね。
(そのまま開いて、アタマの0が落ちるのがいやなら、ExcelWriteRange で無く WriteRangeを使えば良いですね)
———————————————–
今回は説明が長いので目次をつけますね
<目次>
0.一番簡単なスクレイピング
表全体からのデータ抽出では上手くいかないケースの見本
1.ヘッダー行がセル結合しているとき
2.表以外に取り込みたいデータがあるとき
3.一つの表に見えて左右に2分割されているとき
1.ヘッダー行がセル結合しているとき
…1列ごとに取り込み
2.表以外に取り込みたいデータがあるとき
…別にGetText(テキストを取得)を使って、必要項目をGetTextして、
スクレイピングした表データを元に、For Next Rowを使い、AddDataRowで1行ずつ新しいデータテーブルに追加していく。
3.一つの表に見えて左右に2分割されているとき
…左右それぞれをスクレイピングして、統合する。
統合には、例えば左のデータテーブルを元にFor Each Rowを使い、右のデータは、行番号を指定して、変数に代入して
やっぱりAddDataRowで足していきます。
———————————————–
参考までにこんな感じですよね。
※ちなみに、ExcelWriteRange と WriteRangeでは出力結果が違います。
特に文字型の数値・日付など。
この辺も今後詳しくご案内しますが、実は単純な出力ならWriteRangeの方が便利だったりします。
勝手に文字型を数値型に変換したりしないので。
(この辺は次回にでも書き込みますね)
表全体からのデータ抽出では上手くいかないケース
でも、結構な頻度で、スクレイピングは一度では出来なかったりします。
たとえば、以下みたいなケースです。
1.ヘッダー行がセル結合しているとき
3.一つの表に見えて左右に2分割されているとき
それぞれ解決方法はこんな感じです。
1. ヘッダー行がセル結合しているとき
1列ごとに取り込むことになります。
データをスクレイピングウィザードで1つめを選んだ後、
「表全体からデータを抽出しますか?」で「いいえ」を選択する
相関するデータを抽出をクリック
※この見本だとヘッダーがダブってしまっています。
(Webの作り方によりけりなんでしょうか?)
ふだんは大丈夫なんですけど、
この場合、最終的には2行目を除外する必要があります。
(ForNextとかで別のテーブルを作るとか)
2列目も同様に繰り返し、処理が終わったら、終了をクリックする。
こんな感じでデータテーブルが出来ます。
——————–
ID,商品名,数量
1000,リンゴ,5
1001,みかん,10
1002,さくらんぼ,3
1003,バナナ,20
——————–
2.表以外に取り込みたいデータがあるとき
別にGetText(テキストを取得)を使って、必要項目の文字データを取得します。
表部分はスクレイピングして、そのデータテーブルを
For Next Rowで、別のデータテーブルを作ります。
※始め、表部分のデータテーブルとそれ以外のデータをSQLで結合出来ないかと思いましたが、
UiPathでは、SQLで何でも出来る訳では無さそうでしたので、ループで。
ちなみにループは結構な高速なので、処理スピードについては気になりませんでした。
手順は少し面倒です。
(1) 最終形のデータテーブルを作る。
方法は色々ありますが、私は一番お手軽な方法として、Excelでデータテーブル用のひな形を作り、インポートしちゃっています。
(2)GetTextで必要項目の文字データを取得します。
(3)データスクレイピングします。(1列ずつ実施。上記と同様です。)
(4)スクレイピングしたデータテーブルを使って、ForNextの処理を回します。
1行ずつ(1)のデータテーブルに追加していきます。
(5)データの追加 AddDataRow(データ行を追加)
For Each Rowの中のアクティビティは、AddDataRow(データ行を追加)です。
◎ArrayRowに以下を入力(DataTableに左から追加されます)
{strKaisya,Row(0).ToString,Row(1),Row(“数量”),”‘”+strKaisyaC,Now.ToString(“yyyyMMdd”)}
●strKaisya…GetTextのデータ
●Row()…スクレイピングしたデータ
(Row(1)でもRow(“列名”)でもどちらでも良い。)
●”‘”+strKaisyaC
※Excel出力する時に、文字型数字の頭の0が落ちるなら、”‘”(シングルクォーテーションをダブルクォーテーションで囲む)
(ただし、ExcelWriteRangeでは無く、WriteRangeなら、頭の0は落ちないです。)
●最後の列は日付(数値型)…意外とあると便利(いつもでは無いですが)
(6)これでデータテーブルが出来上がるので出力したりします。
ちなみに経験上、出力ファイル名の頭にRPAをつけるとハンドリングしやすいように思います。
それから、ファイルの中にスクレイピング日の列を作ると、これまた扱いやすいです。出力方法
WriteCsvやWriteRangeで出力するとこんな感じにでます。
3.一つの表に見えて左右に2分割されているとき
2.に近いですが、2回スクレイピング(表全体からデータ抽出)します。
そしてどちらか項目名が多い方をメインにしてFor Each Rowでデータテーブルに追加していきます。
(1)左右それぞれでスクレイピングする。
(2)項目が多い方のデータテーブルを For Each Rowで回していきます。
その際に、RowNoがカウントできるように、
Assignアクティビティで RowNo = RowNo +1 もセットします。
なお、UiPathのデータテーブル行は0から始まるのでご注意ください。
(3) 2と同様に、メインで無い方のデータを変数に代入します。
str_Kaisya =Dt_Scrape.Rows(RowNo)(2).ToString
※ 元々のAssignは、こんな感じなので、.Rowsの後の数字を 可変のRowNoとします。
str_Kaisya = Dt_Right.Rows(1)(0).ToString
str_Kaisya = Dt_Right.Rows(1)(“会社名”).ToString
うっかりポイント
3のケースでかつ、複数ページにまたがるときは、ページをめくりながら、スクレイピングしていくと、左右それぞれが追加されていきます。
その場合、何度処理しても100件以上のデータがうまく取り込めず??と首をかしげてました。
スクレイピングのときは、件数の上限があり、そこが100件になっていたからでした。
1回のスクレイピングでは100件に満たなかったため、上限100件のままでウィザードを終わらせてしまったため、
気づかず、解決にずいぶん時間がかかってしまいました。
↓目次を作りました。
RPA体験談【目次(主にUiPath)】