スクレイピングアプリの設計について考える
前回からC#のSeleniumを使って、webスクレイピングするアプリを作っている。
どのようなアプリかというと。
例えばFacebookでイイねしたり、操作したいとする。どのサービスも似たような感じで、まずトップページへとアクセスして、ユーザー情報を入力してログインする。そして目的のページまで遷移し、データを入れたり取ったりする。
狙っているページのURLを直接指定できれば簡単だが、シングルページで色々やってたり、JSでモーダル表示させてたりとした場合、静的ページだけで構成されている場合とは違い、実際は少し大変である。
例えば、Facebookで友人の投稿にイイね!を押す操作を自動化しようとする。そうするとログイン後のURLは変わらず、ずっと同じ場所にいるのだが、ページ内の要素は常に変化するのが想像できる。各投稿も、常に全ては表示されない。そう見えるけど。下にスクロールしてくと、その度に読み込まれて表示される。なので、スクレイピングする場合も、ページをわざとスクロールしたり、読み込まれるまで待機したりと、人間っぽく操作する必要がある。
監視
自動で動かしてると、Facebook側に見つかってしまう事もある。Facebook側も自動化されたプログラムが人間のフリをして存在するのは嬉しくない。ので。人間ではなくプログラムが動かしていることを、検知するプログラム、が常に監視している。AIという言葉を使うなら。つまり、人間かプログラムかを監視するAIがFacebookに雇われている。
擬態
そこでFacebookのAIにプログラムと見破られないように、僕のプログラムも人間風に振る舞わす事を考えたくなる。例えば、なにも考えずにプログラムを書いて動かすと、すごい速さで動いちゃう。どれくらいかというと、そっちのボタンとこっちのボタンをクリックするのに、瞬きよりも短い時間でできちゃう。なので、Facebookでイイねを押そうとすると、一瞬で何個もイイねを押せる。作った側としては、見ているのは楽しいけども、人間には不可能なので、一瞬で監視に見つかってしまう。
また、人間は寝たり、仕事したり、ご飯を食べたりするので、四六時中イイネすることはできない。そこらへんも監視されていて、一日中、プログラムを動かしていると見つかってしまった経験がある。なので、数分に一回とか、一時間に何回とかして、スマホ依存に見せかけたりする必要がある。
なりすまし
もちろん、人間になりすますアカウントは一つではない。もし、複数のアカウントをもっているなら、交互に複数のアカウントにログインする必要がある。それにより、例えば僕のプログラム同士で会話をしているフリをするかもしれない。だれかが記事をあげると、みんなでシェアされているように見えるかもしれない。これで、イイねを押してくれる友達がいっぱいにみせきれる。
さて、それらを踏まえてアプリの設計をする。実はアプリ開発の経験がないので上手い設計がわからない。
ザックリと整理すると、
- UI
- スケジューラー
- タスク(イイねクリック)
こんな感じかな。アプリ設定やアカウント情報とかあるけど。それはUIに任せることにする。
もう少し考える。UIと内部のプログラムの境界を考えてみる。実際UIはWebやWindowsアプリのようなGUIでも、黒い画面のCUIでも、良い。UIを通して、設定等が内部のプログラムに渡されタスクが実行される。
そう考えると
- UI
- 内部プログラム
webでいうとフロントエンドとバックエンドかな。ただMVCみたいな感じとは違う。。どっちかというとバッチ処理?みたいなものか?(閃いた)
バッチ処理を調べてみると、JavaやらPythonやらでフレームワークが沢山でてきた涙
まだまだ勉強が、必要そうですね。
次回、バッチ処理を調べます。