paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonで少し人間味のあるwait関数を作る

クローリングを行うときあらゆる本や記事でサーバ負荷削減のため適度にwaitを挟めと記載があります。

しかしプログラムのビルトイン関数の処理だときっちり同じ間隔になるのでスクリプトだとばれてしまいます。
まあ、ばれても問題ないのですが、少し人間味のある間隔は作れるのかと言うことで今回試してみたいと思います。

私はpythonを少し使えますのでpythonで。

ライブラリ

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