背景
Yahooにクローリングをしていたらタイトル・以下のメッセージが返ってきました。
HTML (curlで取得)
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<!-- Title -->
<TITLE>
Yahoo! JAPAN - ご覧になろうとしているページは現在表示できません。
</TITLE>
<!---------------->
...
<!-- Apology -->
ご不便をおかけして申し訳ございませんが、お客様がご覧になろうとしているページは現在表示できません。
一時的なエラーですので、しばらく時間をおいてから再度お試しください。
<!---------------->
<p>
<!-- Explanation -->
もし、何度もこのページが表示される場合は、以下をご確認ください。
<!---------------->
<ul>
<li>
<!-- Viruses -->
スパイウエアやウイルスによってYahoo! JAPANへの接続が妨げられているかもしれません。
お客様のコンピュータについて、スパイウエアやウイルスのスキャンを行ってみてください。
スパイウエアやウイルス防御に関する詳細な情報については、<a href="https://security.yahoo.co.jp/">Yahoo!セキュリティセンター</a>をご参照くださ
い。
<!---------------->
<li>
<!-- ISP -->
お客様がご利用になっているインターネットサービスプロバイダが関連する、ネットワークのトラブルかもしれません。
インターネットサービスプロバイダにお問い合わせください。
<!---------------->
</ul>
<p style="display: block;">
<!-- Temporary -->
このエラーは一時的なものです。ただし、この状況が何度も続き、さらに上記の方法で解決しない場合は、<a href="https://fpr.yahoo.co.jp/?actionToken=....." alt="報告フォーム">報告フォーム</a>より弊社までお知らせください。<br>
<FONT COLOR=red>こちらのフォームは報告専用フォームのため、返答を確約するものではございません。ご了承ください。</FONT>
<!---------------->
<p>
<!-- Return -->
<p>
さらに詳しい情報については<a href="https://support.yahoo-net.jp/PccHelpcenter/s/">Yahoo! JAPANヘルプセンター</a>をご利用ください。
<!---------------->
</p>
...
表示:

つまり、Yahooさん激おこです。
アクセス制限をかけられてしまったようです。
本当に申し訳ありません。
原因
高頻度でクロール(アクセス)していたことが原因だと思われます。
具体的にはsleepをかけていませんでした。シングルスレッドで実行していたので同時アクセスは行っていませんでした。
User-Agent を変更すると一時的に解消しますが、最終的には同様のエラーとなります。
IP アドレスを変更しても同様です。
このことから、おそらくですが、一定時間内のアクセスリミットが設定されているのではないかと思います。
検証のため、whileで復帰時間を調べてみると、1時間でアクセス制限は解消されました。
所感ですが、1分間に300回で1時間制限といった動作なのかなと思います。300は適当ですが。
検証コマンド (アクセス制限後に実行):
while curl "https://yahoo.co.jp/..../"|grep " ご覧";do sleep 60; date; done
対策
アクセスごとに sleep で 1000ミリ秒(1秒)待つようにしました。
結果、お叱りを受けずに済むようになりました。
コメント