クローリングを行うときあらゆる本や記事でサーバ負荷削減のため適度にwaitを挟めと記載があります。
しかしプログラムのビルトイン関数の処理だときっちり同じ間隔になるのでスクリプトだとばれてしまいます。
まあ、ばれても問題ないのですが、少し人間味のある間隔は作れるのかと言うことで今回試してみたいと思います。
ライブラリ
randomだけで行います。
環境
ubuntuのpython3.8で行います。
masashi@PC-ubuntu:~$ python3 --version Python 3.8.5
ランダム秒waitする関数作成
使用する関数の動き確認
- random
ランダムの値はrandomを使います。
0〜1までのランダムな値がでます。
整数だけだと規則性が出てしまう可能性があるのでmsecまで仕込みたいというわけです。
>>> random.random() 0.3750366528221827 >>> random.random() 0.9079915001558875 >>> random.random() 0.7066434487326565
- randint
waitの秒数は1〜5秒待つようにrandintを使います。
>>> random.randint(1,5) 3 >>> random.randint(1,5) 4 >>> random.randint(1,5) 4 >>> random.randint(1,5) 1
- round
randomの桁数が多いのでroundで丸めます。
小数点3桁くらいで。
>>> round(random.random(), 3) 0.031 >>> round(random.random(), 3) 0.255 >>> round(random.random(), 3) 0.314
関数作成
上記を組み合わせて作成します。
>>> def Jitter(): ... f = random.random() ... r = random.randint(1,5) ... return round(f+r, 3) ... >>>
関数名のJitterとは「揺らぎ」という意味で電気通信やパケット通信の遅延等に使われる用語です。(単語の本来の意味は知りませんが)
Delayとかだと直訳でつまらないのでネットワーク系で使われる用語にしてみました。
動かしてみる
>>> Jitter() 1.4 >>> Jitter() 4.905 >>> Jitter() 2.091
いいですね。
クローラーの処理に仕込んだテイでループで数回出してみます。
時間計測用にtimeライブラリを使います。
>>> for a in range(10): ... w = time.strftime('%H:%M:%S') ... time.sleep(Jitter()) ... print(w, 'Clicked something link.') ... 13:05:49 Clicked something link. 13:05:50 Clicked something link. 13:05:55 Clicked something link. 13:05:56 Clicked something link. 13:06:01 Clicked something link. 13:06:06 Clicked something link. 13:06:08 Clicked something link. 13:06:11 Clicked something link. 13:06:15 Clicked something link. 13:06:16 Clicked something link.
ちょっと間隔が短くて怪しいかもしれませんが、人が何か考えながらクリック等した様な少し不規則な出力になりました!
小数も出しておけばよかった。
randintの範囲は調整の余地ありですね。
まとめ
うろ覚えですが人間味のある遅延というタイトルで同じような内容の記事をネットで見た記憶があり、探しても見つからなかったので今回書いてみました。
今回はpythonですがshellでも作ってみたいですね。
wgetに仕込んだら自然に見えるかな?
User-Agentでバレるかw