某事件に関連して、自分がクローラーにスリープ時間を入れる際に考えていることを晒してみる。
私はクローラーを作る時は、YahooとかGoogleくらいの規模のサイトが相手なら3〜5秒スリープ(Googleにはたまに怒られる)、中規模のサイトは15秒スリープ、普通にブラウザで見るだけで「重いなぁ」と感じるようなサイトや、日にPVが1万もなさそうな小規模のサイトは20〜30秒スリープしてピークタイムと思しき時間は処理を止める設定にしていました。
また、実行する時間帯を気にしなくても良く、且つ1日に行ないたいリクエスト数が少ない場合は、夜中のうちに走らせることが多いです。1日1000reqでいいならAM2時から15秒スリープで走らせれば明け方には処理が終了します。寝る前にキックして、朝起きたら終わってるというのが1つのパターンです。日本のサービスならその時間帯はサーバの負荷はスカスカのはずなので、相手から嫌がられることもないかなぁと思います。
キャッシュサーバや明らかに静的コンテンツと思われる対象の場合は気にせず1秒スリープすることもあります。相手がリクエスト数を規約で定めている場合はそれに従うようにしています。
あと、岡崎の某事件が起きてからはなんとなく怖くなって、最低ラインを10秒に変えたりしました・・・
けっこう長めにインターバル取ってますが、10秒間隔を開けても1つのサイトに対して1日8000回くらいはリクエストできるわけですし、同時に他のサイトに対してもクロールをしかけているので、個人で使う分にはこの速度でそれほど困ることはありません。
リアルタイム性を求めていたり、頻繁に更新される情報を余さず取りたい場合(株とかFXとか)、1つのサイトから余程大量の情報を抜きたい場合を除けば、同一サイトに大量のリクエストを集中させないといけないケースってあまりないですしね。
ところで、クローラーというのは何秒くらいスリープするのが常識的なのでしょうか。今回の事件に関するTweetを見ていると「1秒に1リクエストくらい大したことない」という意見を多く見かけましたが、私は自分自身がサーバ管理者をやっていた経験上、「場合によっては1秒はちょっと重いかなぁ」と思ってしまったりします。
1台のサーバでさばけるリクエストはサーバの機能や処理内容によって大きく変わります。例えば小さい静的ファイルなら秒間数百リクエストでも帯域さえ間に合えば1つのサーバで余裕でさばけます。
計算処理が入ったりDBが絡むようなページではさばける数は大きく下がります。私が見てきたサイトの中では、3〜5req/secが限度という重い機能も多く存在していました。
もしそういった重い機能に対して1秒1度のリクエストをしてしまうと、1人でそのサーバの1/3〜1/5の能力を占有してしまうことになります。それってどうなんでしょう。かごにポケットティッシュが入っていて「ご自由にお持ちください」と書いてあったから、中に入っているティッシュを全部1人でもらっちゃったとか、牛丼屋で丼が真っ赤に染まるまで紅生姜を入れたとか、「別に悪いことじゃないけど、ちょっと遠慮しません?」という行為のように私は思ってしまいます。
また、ピークタイムにクローラをしかけると、それまではちゃんと結果を返せていたサーバの限界を超えさせてしまう場合があります。混んでる時間帯にコンビニで80円切手を1枚買った後、「領収書ください。あと、宛名もお願いします」と言うのが言いづらいように、混んでる時間に「1秒1リクエストするからちゃんと結果返してください」というのも考えものだなぁと思えます。
それに世の中にはいろんな形のサーバが存在します。
・使用できるリソースが制限されている共用サーバ
・ADSLの細い上り回線を使っている自宅サーバ
・古いシステムでLIKE検索が走るとCPU使用率がしばらく100%になることがあるサーバ
・特定の時間帯にやたら重くなるサーバ
・時々、くじらが出てくるサーバ
・時々、人大杉と言われるサーバ
こういったサーバに対しても1秒1リクエストするのは問題ないものでしょうか。(ちなみに人大杉のとこはキャッシュサーバが用意されてるので、そこに対しては1秒スリープで情報を取りに行くことがあります。あと、クジラは向こうでAPIの制限変えてるのでそれを守った上でギリギリまで使おうという感じでやってます)
どの程度のリクエストなら相手のサーバにとって大したことがないのか、その判断はけっこう難しいものです。難しいからこそ「まぁ、1秒スリープすれば大丈夫だろう」という考えをするよりは、可能な限り長めにインターバルを取っておいたり、ピークタイムと思われる時間はリクエストを控えるなど、相手のサーバに気遣いをするのが礼儀正しいクローラーなんじゃないかなぁと思います。
私がそういう考え方をしてしまうのは、おそらくクローラーのせいで何度か突発の仕事をする羽目になったことがあるせいです。世の中には行儀の悪いクローラーが存在するもので、サーバ管理者が頭を痛める原因にもなっています。
例えば名前は伏せておきますが、昔、とある検索サイトのクローラーが猛威をふるった時期があって、私はちょうどその時に200万PVをさばいているサーバの管理をしていました。あの時は焦りました。それまでピークタイムでも90%弱で収まっていたCPU使用率が全サーバで100%に到達してbusy画面が多発。しかもIPは複数だったと記憶しています。
サービス産業にとってbusy画面を返すというのは、ユーザを失望させてしまい、PVの減少や(クローラーのアクセスは当然PVには加算されない)評判の低下に繋がります。あの時は「このクローラー作ったヤツは百度くらい死ね」と思いました。
それから、10年以上昔に700万円くらいで作られたシステムの管理(たまに様子を見に行ったり、不具合を直したり)をする仕事をしたことがあります。作り直した方が良いのでしょうが、安く見積もってもリプレースには500万はかかるし、相手はとてもそんな金額捻出できそうもない。そんなシステムでも、日に数万程度のPVをさばいてそれなりに商売になっていました。
ところがある日、クローラーらしきリクエストが来て、1日のPVが10万を超えてしまうことがありました。平時の2倍以上です。
そのシステムはリクエストを受けるたびにDBのUPDATEが走ることになっていたので(なんでそんなことをしていたのか不明。でも、そう作られてしまっているんだから仕方ない)、クローラーが来た日は体感でもちょっと重いなぁと感じるような影響が出ていました。
そのクローラーはその後も月に1回くらい現れ、1日〜2日ほどかけて全ページをクロールしていました。しばらくは放置していましたが、最終的にはそのクローラーのIPを禁止する対応を行うことになりました。その作業は私がやったのだけど、当然、有料です。確か何かのついでに行った時にやったので、料金は3000円しか請求しませんでしたが(やり方教える時間含めても30分で終わったし)、まともな会社に依頼した場合はいくら取られるか知りません。
世の中にはそういうシステムも存在するわけです。それらの出来の悪いサービスに対して遠慮なくクロールして向こうの管理者が泣くことになった時「そんな古いシステム使ってるからダメなんだろ」とは私には言えません。
さて、この話はあくまえ私がクローラーを作る時の考えで、クローラー作者はすべからくこうあるべきだみたいな話ではありませんし、何かガイドライン的なものを見てたどり着いた考えでもありません。
なので、1つの私見として、そういう風に考えてる人間もいるんだなぁ程度に考えて頂ければ。