130

Python を使用して Web サイトにログインし、複数の Web ページから情報を収集しようとすると、次のエラーが表示されます。

Traceback (most recent call last):
  File "extract_test.py", line 43, in <module>
    response=br.open(v)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open
    raise response
mechanize._response.httperror_seek_wrapper: HTTP Error 429: Unknown Response Code

私は使用time.sleep()して動作しましたが、インテリジェントではなく信頼性が低いようです。このエラーを回避する他の方法はありますか?

これが私のコードです:

import mechanize
import cookielib
import re
first=("example.com/page1")
second=("example.com/page2")
third=("example.com/page3")
fourth=("example.com/page4")
## I have seven URL's I want to open

urls_list=[first,second,third,fourth]

br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options 
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

# Log in credentials
br.open("example.com")
br.select_form(nr=0)
br["username"] = "username"
br["password"] = "password"
br.submit()

for url in urls_list:
        br.open(url)
        print re.findall("Some String")
4

7 に答える 7

194

ステータス 429 の受信はエラーではありません。これは、他のサーバーが「親切に」リクエストのスパム送信を停止するように求めていることです。明らかに、リクエストのレートが高すぎて、サーバーがこれを受け入れようとしません。

これを「回避」しようとしたり、IP を偽装してサーバーのセキュリティ設定を回避しようとしたりしないでください。サーバーの応答を尊重して、あまり多くの要求を送信しないようにする必要があります。

すべてが適切に設定されている場合は、429 応答と共に「Retry-after」ヘッダーも受け取ります。このヘッダーは、別の呼び出しを行う前に待機する秒数を指定します。この「問題」に対処する適切な方法は、このヘッダーを読み取り、プロセスをその秒数スリープ状態にすることです。

ステータス 429 の詳細については、https ://www.rfc-editor.org/rfc/rfc6585#page-3 を参照してください。

于 2014-04-29T14:14:16.820 に答える
9

別の回避策は、ある種のパブリック VPN または Tor ネットワークを使用して IP を偽装することです。これは、IP レベルでのサーバーのレート制限を前提としています。

urllib2 と一緒に tor を使用する方法を示す短いブログ投稿があります。

http://blog.flip-edesign.com/?p=119

于 2014-04-01T13:08:30.263 に答える