0

私はpython-mechanizeを使用していくつかの Web サイトをスクレイピングしていますが、これらのサイトは単にリクエストに応答せず、これらのリクエストが長時間開いたままになっているため、これらのリクエストのタイムアウトを制限する必要があります。

メソッドを使用している間、パラメーターurlopenを使用してタイムアウトを設定できますが、またはメソッドtimeoutなどの高レベル API でそれを行う簡単な方法が見つかりませんでした。理想的には、タイムアウトはブラウザー クラス全体に対して 1 回だけ設定され、すべての呼び出しがそれを尊重します。submitclick

request_classcustomを everyclickとcall に渡すことでこれをカスタマイズすることはおそらく可能submitですが、これはコードを汚染するだけなので、mechanize のブラウザ クラスのタイムアウトを設定するためのより良い解決策を探しています (いいえ、変更したくありません)。を使用したデフォルトのソケットタイムアウトsocket.setdefaulttimeout)。

4

2 に答える 2

2

Python コミュニティ内では少し嫌われていますが、必要な動作をブラウザー クラスに「ダック パンチ」することができます。

基本的に、次のことを行う必要があります。必要なことを行う関数を作成します (カスタム リクエスト クラスを使用)。

browser_click = Browser.click
def my_click(self, *args, **kwds):
    browser_click(self, request_class=MyRequestClass, *args, **kwds)
Browser.click = my_click

それが Ruby の好みに合わない場合は、似たような処理を行う Browser のサブクラスを作成できます。

class MyBrowser(Browser):
    def click(self, *args, **kwds):
        Browser.click(self, request_class=MyRequestClass, *args, **kwds)

これは少しきれいだと思いますが、Browser インスタンスの作成を制御できない場合は機能しません。

于 2014-05-29T15:41:56.743 に答える
1

次のようなコードで do-while ループを使用してみてください。

start = time.clock()
... do something
elapsed = (time.clock() - start)

また

start = time.time()
... do something
elapsed = (time.time() - start)
于 2014-06-02T14:58:09.207 に答える