hashin2425
@hashin2425 (早坂 ゆう)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Webスクレイピングにおける「サーバーへの負荷」はどのような基準か?

Discussion

Closed

##質問概要
Webスクレイピングを行う上で「サーバーに過度な負担をかける行為を禁止する」という旨の規約があります。では「過度な負担」とは具体的にはどれくらいの負荷を指すのでしょうか?また、リクエストにインターバルを設ける場合どれほどの時間にセットするのが良いでしょうか?
サーバー管理やスクレイピングに関わっている方々のご意見を伺いたいです。
##やりたいこと
私が現在やりたいと考えているスクレイピングは
・毎日4,000件ほどのリクエスト
・夕方から深夜にかけての6~8時間で処理する
・対象は大規模なサービスを運営しているところのサーバー
・リクエストのインターバルは5~6秒に設定する(予定)
##調べたこと
具体的な基準を探しているときにこのような記事を見つけました。そこには、過去に事件となったスクレイピングでは1秒に1回のリクエストを行っていたと言う記述があります。少なくともこれより負荷の少ない動作にするのが良いのだろうと思いました。

ただ、Librahack事件は一つの目安になると思われます。この事件では、逮捕された者が1秒に1回の頻度で1日2000回のスクレイピングを試みた点について、サーバに負荷をかけたとまではいえないとの見方もあります。
(スクレイピングは違法?3つの法律問題と対応策を弁護士が5分で解説:https://topcourt-law.com/internet_security/scraping-illegal#i-11

3

こんにちは。主にサーバー管理の方をやっている者です。

まず前提として、どの程度のインターバルを入れれば「過度な負担」にならないかという業界的・法的な共通認識はありません(と認識しています)。Qiitaを例にすれば、トップページへのアクセスとフリーワードでの検索ではサーバーやDBにかかる負荷がまるで違うわけで、どちらも10msで返ってくるけれども後者ではDBのCPU使用率が跳ね上がっている、といった状況は考えられます。ですから、それが「過度な負担」にあたるかどうかは中の人しか分からないというのが厳密な回答になるでしょう。

個人的には、世界に向けて公開しているサービスに様々なクローラーがやってくることは当然のことで、たかだか数回/秒程度のアクセスで落ちるならそれはアプリが悪いでしょ、と思っています。百度(Baidu)のクローラーが一時期100回/秒以上のアクセス攻勢をかけてきた1ことはまだ記憶に新しいですが、良し悪しは別としてインターネットとは元来そういうものです。
※ご存知かもしれませんが、Librahack事件ではアプリの出来があまりにも稚拙2だったことがサービスが落ちる原因となりました。あんなことで逮捕された人が気の毒すぎる。

とはいえサービス事業者の立場からしますと、1回/秒だろうが0.1回/秒だろうが「お前のアクセスのおかげでうちのサービスに影響が出るなんて許せん、告訴だ告訴」といった話にもなりかねません。このあたりの兼ね合いとして、

  • 最大でも1回/秒あたりを上限にしておく
  • GETであっても、検索をしているっぽい処理は控えめにする
  • レスポンスタイムを監視しておく。明らかに延びてきたら止める
  • 利用規約はよく読む
  • (できれば)HTTPヘッダに連絡先を書いておく
  • (できれば)Cookieをちゃんと扱って無駄なセッションをいっぱい発行させないようにする

といったことを心がけていただけると非常にありがたいですし、お互いトラブルが起きなくて幸せかなあと思います。

  1. さすがに百度は顰蹙を買って後に謝罪しましたが……

  2. JANOG的にLibrahackを解説する

2Like

@netebakariさんご返信ありがとうございます。

レスポンスタイムが同じでもサーバーリソースへの負荷が同じとは限らないところが盲点でした。ここはバックエンドの処理を想像しながら対処するしかありませんが、覚えておきたいところ…。

また「レスポンスタイムを監視しておく」とのことですが、調べてみるとJavascriptと連携することでレスポンスタイムを監視できそうですね。1 2実際に稼働させてみないと感覚が分かりませんが、明らかにこの数値が変わっていれば停止させるようにしてみます。

After_sending_request.py
navigationStart = driver.window.execute_script("return window.performance.timing.navigationStart")
responseStart = driver.window.execute_script("return window.performance.timing.responseStart")
responseTime = responseStart - navigationStart
print(responseTime) #レスポンスタイムが表示される

ご教授いただいた事を実装し、モラルを守って取り組んでいこうと思います。

(追記)NavigationTimingについての更にわかりやすい記事があったので後から見た方(もとい自分)のために残しておきます。

  1. 参考:How to measure page load time of a website using Selenium-Python

  2. Jsの中身に関するリファレンス:NavigationTiming

3Like

Your answer might help someone💌